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
66 * Functions related to the X Composite Extension
70 * Return whether the Composite Extension is available
72 * @return @c EINA_TRUE is the Composite Extension is available, @c EINA_FALSE
75 * @ingroup Ecore_X_Composite_Group
78 ecore_x_composite_query(void)
80 LOGFN(__FILE__, __LINE__, __FUNCTION__);
81 return _composite_avail;
85 ecore_x_composite_redirect_window(Ecore_X_Window win,
86 Ecore_X_Composite_Update_Type type)
88 LOGFN(__FILE__, __LINE__, __FUNCTION__);
91 if (!_composite_avail) return;
93 #ifdef ECORE_XCB_COMPOSITE
94 uint8_t update = XCB_COMPOSITE_REDIRECT_AUTOMATIC;
98 case ECORE_X_COMPOSITE_UPDATE_AUTOMATIC:
99 update = XCB_COMPOSITE_REDIRECT_AUTOMATIC;
102 case ECORE_X_COMPOSITE_UPDATE_MANUAL:
103 update = XCB_COMPOSITE_REDIRECT_MANUAL;
106 xcb_composite_redirect_window(_ecore_xcb_conn, win, update);
112 ecore_x_composite_redirect_subwindows(Ecore_X_Window win,
113 Ecore_X_Composite_Update_Type type)
115 LOGFN(__FILE__, __LINE__, __FUNCTION__);
118 if (!_composite_avail) return;
120 #ifdef ECORE_XCB_COMPOSITE
121 uint8_t update = XCB_COMPOSITE_REDIRECT_AUTOMATIC;
125 case ECORE_X_COMPOSITE_UPDATE_AUTOMATIC:
126 update = XCB_COMPOSITE_REDIRECT_AUTOMATIC;
129 case ECORE_X_COMPOSITE_UPDATE_MANUAL:
130 update = XCB_COMPOSITE_REDIRECT_MANUAL;
133 xcb_composite_redirect_subwindows(_ecore_xcb_conn, win, update);
139 ecore_x_composite_unredirect_window(Ecore_X_Window win,
140 Ecore_X_Composite_Update_Type type)
142 LOGFN(__FILE__, __LINE__, __FUNCTION__);
145 if (!_composite_avail) return;
147 #ifdef ECORE_XCB_COMPOSITE
148 uint8_t update = XCB_COMPOSITE_REDIRECT_AUTOMATIC;
152 case ECORE_X_COMPOSITE_UPDATE_AUTOMATIC:
153 update = XCB_COMPOSITE_REDIRECT_AUTOMATIC;
156 case ECORE_X_COMPOSITE_UPDATE_MANUAL:
157 update = XCB_COMPOSITE_REDIRECT_MANUAL;
160 xcb_composite_unredirect_window(_ecore_xcb_conn, win, update);
166 ecore_x_composite_unredirect_subwindows(Ecore_X_Window win,
167 Ecore_X_Composite_Update_Type type)
169 LOGFN(__FILE__, __LINE__, __FUNCTION__);
172 if (!_composite_avail) return;
174 #ifdef ECORE_XCB_COMPOSITE
175 uint8_t update = XCB_COMPOSITE_REDIRECT_AUTOMATIC;
179 case ECORE_X_COMPOSITE_UPDATE_AUTOMATIC:
180 update = XCB_COMPOSITE_REDIRECT_AUTOMATIC;
183 case ECORE_X_COMPOSITE_UPDATE_MANUAL:
184 update = XCB_COMPOSITE_REDIRECT_MANUAL;
187 xcb_composite_unredirect_subwindows(_ecore_xcb_conn, win, update);
193 ecore_x_composite_name_window_pixmap_get(Ecore_X_Window win)
195 #ifdef ECORE_XCB_COMPOSITE
196 Ecore_X_Pixmap pmap = XCB_NONE;
199 LOGFN(__FILE__, __LINE__, __FUNCTION__);
202 if (!_composite_avail) return XCB_NONE;
204 #ifdef ECORE_XCB_COMPOSITE
205 pmap = xcb_generate_id(_ecore_xcb_conn);
206 xcb_composite_name_window_pixmap(_ecore_xcb_conn, win, pmap);
214 ecore_x_composite_window_events_disable(Ecore_X_Window win)
216 LOGFN(__FILE__, __LINE__, __FUNCTION__);
219 if (!_composite_avail) return;
221 #ifdef ECORE_XCB_SHAPE
222 ecore_x_window_shape_input_rectangle_set(win, -1, -1, 1, 1);
231 ecore_x_composite_window_events_enable(Ecore_X_Window win)
233 LOGFN(__FILE__, __LINE__, __FUNCTION__);
236 if (!_composite_avail) return;
238 #ifdef ECORE_XCB_SHAPE
239 ecore_x_window_shape_input_rectangle_set(win, 0, 0, 65535, 65535);
248 ecore_x_composite_render_window_enable(Ecore_X_Window root)
250 Ecore_X_Window win = 0;
251 #ifdef ECORE_XCB_COMPOSITE
252 xcb_composite_get_overlay_window_cookie_t cookie;
253 xcb_composite_get_overlay_window_reply_t *reply;
256 LOGFN(__FILE__, __LINE__, __FUNCTION__);
259 if (!_composite_avail) return 0;
261 #ifdef ECORE_XCB_COMPOSITE
262 cookie = xcb_composite_get_overlay_window_unchecked(_ecore_xcb_conn, root);
264 xcb_composite_get_overlay_window_reply(_ecore_xcb_conn, cookie, NULL);
265 if (!reply) return win;
267 win = reply->overlay_win;
270 ecore_x_composite_window_events_disable(win);
278 ecore_x_composite_render_window_disable(Ecore_X_Window win)
280 LOGFN(__FILE__, __LINE__, __FUNCTION__);
283 if (!_composite_avail) return;
285 #ifdef ECORE_XCB_COMPOSITE
286 xcb_composite_release_overlay_window(_ecore_xcb_conn, win);