1 #include "ecore_xcb_private.h"
2 #ifdef ECORE_XCB_COMPOSITE
3 # include <xcb/composite.h>
7 static Eina_Bool _composite_avail = EINA_FALSE;
10 _ecore_xcb_composite_init(void)
12 LOGFN(__FILE__, __LINE__, __FUNCTION__);
14 #ifdef ECORE_XCB_COMPOSITE
15 xcb_prefetch_extension_data(_ecore_xcb_conn, &xcb_composite_id);
20 _ecore_xcb_composite_finalize(void)
22 #ifdef ECORE_XCB_COMPOSITE
23 const xcb_query_extension_reply_t *ext_reply;
26 LOGFN(__FILE__, __LINE__, __FUNCTION__);
28 #ifdef ECORE_XCB_COMPOSITE
29 ext_reply = xcb_get_extension_data(_ecore_xcb_conn, &xcb_composite_id);
30 if ((ext_reply) && (ext_reply->present))
32 xcb_composite_query_version_cookie_t cookie;
33 xcb_composite_query_version_reply_t *reply;
36 xcb_composite_query_version_unchecked(_ecore_xcb_conn,
37 XCB_COMPOSITE_MAJOR_VERSION,
38 XCB_COMPOSITE_MINOR_VERSION);
40 xcb_composite_query_version_reply(_ecore_xcb_conn, cookie, NULL);
43 // if ((reply->major_version >= XCB_COMPOSITE_MAJOR_VERSION) &&
44 if (reply->minor_version >= XCB_COMPOSITE_MINOR_VERSION)
46 # ifdef ECORE_XCB_RENDER
47 if (_ecore_xcb_render_avail_get())
49 # ifdef ECORE_XCB_XFIXES
50 if (_ecore_xcb_xfixes_avail_get())
51 _composite_avail = EINA_TRUE;
64 * @defgroup Ecore_X_Composite_Group X Composite Extension Functions
65 * @ingroup Ecore_X_Group
67 * Functions related to the X Composite Extension
71 * Return whether the Composite Extension is available
73 * @return @c EINA_TRUE is the Composite Extension is available, @c EINA_FALSE
76 * @ingroup Ecore_X_Composite_Group
79 ecore_x_composite_query(void)
81 LOGFN(__FILE__, __LINE__, __FUNCTION__);
82 return _composite_avail;
86 ecore_x_composite_redirect_window(Ecore_X_Window win,
87 Ecore_X_Composite_Update_Type type)
89 LOGFN(__FILE__, __LINE__, __FUNCTION__);
92 if (!_composite_avail) return;
94 #ifdef ECORE_XCB_COMPOSITE
95 uint8_t update = XCB_COMPOSITE_REDIRECT_AUTOMATIC;
99 case ECORE_X_COMPOSITE_UPDATE_AUTOMATIC:
100 update = XCB_COMPOSITE_REDIRECT_AUTOMATIC;
103 case ECORE_X_COMPOSITE_UPDATE_MANUAL:
104 update = XCB_COMPOSITE_REDIRECT_MANUAL;
107 xcb_composite_redirect_window(_ecore_xcb_conn, win, update);
113 ecore_x_composite_redirect_subwindows(Ecore_X_Window win,
114 Ecore_X_Composite_Update_Type type)
116 LOGFN(__FILE__, __LINE__, __FUNCTION__);
119 if (!_composite_avail) return;
121 #ifdef ECORE_XCB_COMPOSITE
122 uint8_t update = XCB_COMPOSITE_REDIRECT_AUTOMATIC;
126 case ECORE_X_COMPOSITE_UPDATE_AUTOMATIC:
127 update = XCB_COMPOSITE_REDIRECT_AUTOMATIC;
130 case ECORE_X_COMPOSITE_UPDATE_MANUAL:
131 update = XCB_COMPOSITE_REDIRECT_MANUAL;
134 xcb_composite_redirect_subwindows(_ecore_xcb_conn, win, update);
140 ecore_x_composite_unredirect_window(Ecore_X_Window win,
141 Ecore_X_Composite_Update_Type type)
143 LOGFN(__FILE__, __LINE__, __FUNCTION__);
146 if (!_composite_avail) return;
148 #ifdef ECORE_XCB_COMPOSITE
149 uint8_t update = XCB_COMPOSITE_REDIRECT_AUTOMATIC;
153 case ECORE_X_COMPOSITE_UPDATE_AUTOMATIC:
154 update = XCB_COMPOSITE_REDIRECT_AUTOMATIC;
157 case ECORE_X_COMPOSITE_UPDATE_MANUAL:
158 update = XCB_COMPOSITE_REDIRECT_MANUAL;
161 xcb_composite_unredirect_window(_ecore_xcb_conn, win, update);
167 ecore_x_composite_unredirect_subwindows(Ecore_X_Window win,
168 Ecore_X_Composite_Update_Type type)
170 LOGFN(__FILE__, __LINE__, __FUNCTION__);
173 if (!_composite_avail) return;
175 #ifdef ECORE_XCB_COMPOSITE
176 uint8_t update = XCB_COMPOSITE_REDIRECT_AUTOMATIC;
180 case ECORE_X_COMPOSITE_UPDATE_AUTOMATIC:
181 update = XCB_COMPOSITE_REDIRECT_AUTOMATIC;
184 case ECORE_X_COMPOSITE_UPDATE_MANUAL:
185 update = XCB_COMPOSITE_REDIRECT_MANUAL;
188 xcb_composite_unredirect_subwindows(_ecore_xcb_conn, win, update);
194 ecore_x_composite_name_window_pixmap_get(Ecore_X_Window win)
196 #ifdef ECORE_XCB_COMPOSITE
197 Ecore_X_Pixmap pmap = XCB_NONE;
200 LOGFN(__FILE__, __LINE__, __FUNCTION__);
203 if (!_composite_avail) return XCB_NONE;
205 #ifdef ECORE_XCB_COMPOSITE
206 pmap = xcb_generate_id(_ecore_xcb_conn);
207 xcb_composite_name_window_pixmap(_ecore_xcb_conn, win, pmap);
215 ecore_x_composite_window_events_disable(Ecore_X_Window win)
217 LOGFN(__FILE__, __LINE__, __FUNCTION__);
220 if (!_composite_avail) return;
222 #ifdef ECORE_XCB_SHAPE
223 ecore_x_window_shape_input_rectangle_set(win, -1, -1, 1, 1);
232 ecore_x_composite_window_events_enable(Ecore_X_Window win)
234 LOGFN(__FILE__, __LINE__, __FUNCTION__);
237 if (!_composite_avail) return;
239 #ifdef ECORE_XCB_SHAPE
240 ecore_x_window_shape_input_rectangle_set(win, 0, 0, 65535, 65535);
249 ecore_x_composite_render_window_enable(Ecore_X_Window root)
251 Ecore_X_Window win = 0;
252 #ifdef ECORE_XCB_COMPOSITE
253 xcb_composite_get_overlay_window_cookie_t cookie;
254 xcb_composite_get_overlay_window_reply_t *reply;
257 LOGFN(__FILE__, __LINE__, __FUNCTION__);
260 if (!_composite_avail) return 0;
262 #ifdef ECORE_XCB_COMPOSITE
263 cookie = xcb_composite_get_overlay_window_unchecked(_ecore_xcb_conn, root);
265 xcb_composite_get_overlay_window_reply(_ecore_xcb_conn, cookie, NULL);
266 if (!reply) return win;
268 win = reply->overlay_win;
271 ecore_x_composite_window_events_disable(win);
279 ecore_x_composite_render_window_disable(Ecore_X_Window win)
281 LOGFN(__FILE__, __LINE__, __FUNCTION__);
284 if (!_composite_avail) return;
286 #ifdef ECORE_XCB_COMPOSITE
287 xcb_composite_release_overlay_window(_ecore_xcb_conn, win);