1 #ifdef HAVE_CONFIG_H
2 # include <config.h>
3 #endif /* ifdef HAVE_CONFIG_H */
4 
5 #include "ecore_x_private.h"
6 #include "Ecore_X.h"
7 
8 static Eina_Bool _composite_available = EINA_FALSE;
9 
10 void
_ecore_x_composite_init(void)11 _ecore_x_composite_init(void)
12 {
13    _composite_available = EINA_FALSE;
14 
15 #ifdef ECORE_XCOMPOSITE
16    int major, minor;
17 
18    if (XCompositeQueryVersion(_ecore_x_disp, &major, &minor))
19      {
20         if (_ecore_xlib_sync) ecore_x_sync();
21 # ifdef ECORE_XRENDER
22         if (XRenderQueryExtension(_ecore_x_disp, &major, &minor))
23           {
24              if (_ecore_xlib_sync) ecore_x_sync();
25 #  ifdef ECORE_XFIXES
26              if (XFixesQueryVersion(_ecore_x_disp, &major, &minor))
27                {
28                   if (_ecore_xlib_sync) ecore_x_sync();
29                   _composite_available = EINA_TRUE;
30                }
31 #  endif
32           }
33 # endif
34      }
35 #endif
36 }
37 
38 EAPI Eina_Bool
ecore_x_composite_query(void)39 ecore_x_composite_query(void)
40 {
41    LOGFN;
42    return _composite_available;
43 }
44 
45 EAPI void
ecore_x_composite_redirect_window(Ecore_X_Window win,Ecore_X_Composite_Update_Type type)46 ecore_x_composite_redirect_window(Ecore_X_Window win,
47                                   Ecore_X_Composite_Update_Type type)
48 {
49 #ifdef ECORE_XCOMPOSITE
50    int update = CompositeRedirectAutomatic;
51 
52    LOGFN;
53    switch (type)
54      {
55       case ECORE_X_COMPOSITE_UPDATE_AUTOMATIC:
56         update = CompositeRedirectAutomatic;
57         break;
58 
59       case ECORE_X_COMPOSITE_UPDATE_MANUAL:
60         update = CompositeRedirectManual;
61         break;
62      }
63    XCompositeRedirectWindow(_ecore_x_disp, win, update);
64    if (_ecore_xlib_sync) ecore_x_sync();
65 #endif /* ifdef ECORE_XCOMPOSITE */
66 }
67 
68 EAPI void
ecore_x_composite_redirect_subwindows(Ecore_X_Window win,Ecore_X_Composite_Update_Type type)69 ecore_x_composite_redirect_subwindows(Ecore_X_Window win,
70                                       Ecore_X_Composite_Update_Type type)
71 {
72 #ifdef ECORE_XCOMPOSITE
73    int update = CompositeRedirectAutomatic;
74 
75    LOGFN;
76    switch (type)
77      {
78       case ECORE_X_COMPOSITE_UPDATE_AUTOMATIC:
79         update = CompositeRedirectAutomatic;
80         break;
81 
82       case ECORE_X_COMPOSITE_UPDATE_MANUAL:
83         update = CompositeRedirectManual;
84         break;
85      }
86    XCompositeRedirectSubwindows(_ecore_x_disp, win, update);
87    if (_ecore_xlib_sync) ecore_x_sync();
88 #endif /* ifdef ECORE_XCOMPOSITE */
89 }
90 
91 EAPI void
ecore_x_composite_unredirect_window(Ecore_X_Window win,Ecore_X_Composite_Update_Type type)92 ecore_x_composite_unredirect_window(Ecore_X_Window win,
93                                     Ecore_X_Composite_Update_Type type)
94 {
95 #ifdef ECORE_XCOMPOSITE
96    int update = CompositeRedirectAutomatic;
97 
98    LOGFN;
99    switch (type)
100      {
101       case ECORE_X_COMPOSITE_UPDATE_AUTOMATIC:
102         update = CompositeRedirectAutomatic;
103         break;
104 
105       case ECORE_X_COMPOSITE_UPDATE_MANUAL:
106         update = CompositeRedirectManual;
107         break;
108      }
109    XCompositeUnredirectWindow(_ecore_x_disp, win, update);
110    if (_ecore_xlib_sync) ecore_x_sync();
111 #endif /* ifdef ECORE_XCOMPOSITE */
112 }
113 
114 EAPI void
ecore_x_composite_unredirect_subwindows(Ecore_X_Window win,Ecore_X_Composite_Update_Type type)115 ecore_x_composite_unredirect_subwindows(Ecore_X_Window win,
116                                         Ecore_X_Composite_Update_Type type)
117 {
118 #ifdef ECORE_XCOMPOSITE
119    int update = CompositeRedirectAutomatic;
120 
121    LOGFN;
122    switch (type)
123      {
124       case ECORE_X_COMPOSITE_UPDATE_AUTOMATIC:
125         update = CompositeRedirectAutomatic;
126         break;
127 
128       case ECORE_X_COMPOSITE_UPDATE_MANUAL:
129         update = CompositeRedirectManual;
130         break;
131      }
132    XCompositeUnredirectSubwindows(_ecore_x_disp, win, update);
133    if (_ecore_xlib_sync) ecore_x_sync();
134 #endif /* ifdef ECORE_XCOMPOSITE */
135 }
136 
137 EAPI Ecore_X_Pixmap
ecore_x_composite_name_window_pixmap_get(Ecore_X_Window win)138 ecore_x_composite_name_window_pixmap_get(Ecore_X_Window win)
139 {
140    Ecore_X_Pixmap pixmap = None;
141 #ifdef ECORE_XCOMPOSITE
142    LOGFN;
143    pixmap = XCompositeNameWindowPixmap(_ecore_x_disp, win);
144    if (_ecore_xlib_sync) ecore_x_sync();
145 #endif /* ifdef ECORE_XCOMPOSITE */
146    return pixmap;
147 }
148 
149 EAPI void
ecore_x_composite_window_events_disable(Ecore_X_Window win)150 ecore_x_composite_window_events_disable(Ecore_X_Window win)
151 {
152 #ifdef ECORE_XCOMPOSITE
153    ecore_x_window_shape_input_rectangle_set(win, -1, -1, 1, 1);
154    if (_ecore_xlib_sync) ecore_x_sync();
155 #endif /* ifdef ECORE_XCOMPOSITE */
156 }
157 
158 EAPI void
ecore_x_composite_window_events_enable(Ecore_X_Window win)159 ecore_x_composite_window_events_enable(Ecore_X_Window win)
160 {
161 #ifdef ECORE_XCOMPOSITE
162    ecore_x_window_shape_input_rectangle_set(win, 0, 0, 65535, 65535);
163    if (_ecore_xlib_sync) ecore_x_sync();
164 #endif /* ifdef ECORE_XCOMPOSITE */
165 }
166 
167 EAPI Ecore_X_Window
ecore_x_composite_render_window_enable(Ecore_X_Window root)168 ecore_x_composite_render_window_enable(Ecore_X_Window root)
169 {
170    Ecore_X_Window win = 0;
171 #ifdef ECORE_XCOMPOSITE
172    win = XCompositeGetOverlayWindow(_ecore_x_disp, root);
173    if (_ecore_xlib_sync) ecore_x_sync();
174    ecore_x_composite_window_events_disable(win);
175 #endif /* ifdef ECORE_XCOMPOSITE */
176    return win;
177 }
178 
179 EAPI void
ecore_x_composite_render_window_disable(Ecore_X_Window root)180 ecore_x_composite_render_window_disable(Ecore_X_Window root)
181 {
182 #ifdef ECORE_XCOMPOSITE
183    LOGFN;
184    XCompositeReleaseOverlayWindow(_ecore_x_disp, root);
185    if (_ecore_xlib_sync) ecore_x_sync();
186 #endif /* ifdef ECORE_XCOMPOSITE */
187 }
188 
189