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