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 EINA_TRUE is the Composite Extension is available, EINA_FALSE if not
74 * @ingroup Ecore_X_Composite_Group
77 ecore_x_composite_query(void)
79 LOGFN(__FILE__, __LINE__, __FUNCTION__);
80 return _composite_avail;
84 ecore_x_composite_redirect_window(Ecore_X_Window win, Ecore_X_Composite_Update_Type type)
86 LOGFN(__FILE__, __LINE__, __FUNCTION__);
88 #ifdef ECORE_XCB_COMPOSITE
89 uint8_t update = XCB_COMPOSITE_REDIRECT_AUTOMATIC;
93 case ECORE_X_COMPOSITE_UPDATE_AUTOMATIC:
94 update = XCB_COMPOSITE_REDIRECT_AUTOMATIC;
96 case ECORE_X_COMPOSITE_UPDATE_MANUAL:
97 update = XCB_COMPOSITE_REDIRECT_MANUAL;
100 xcb_composite_redirect_window(_ecore_xcb_conn, win, update);
106 ecore_x_composite_redirect_subwindows(Ecore_X_Window win, Ecore_X_Composite_Update_Type type)
108 LOGFN(__FILE__, __LINE__, __FUNCTION__);
110 #ifdef ECORE_XCB_COMPOSITE
111 uint8_t update = XCB_COMPOSITE_REDIRECT_AUTOMATIC;
115 case ECORE_X_COMPOSITE_UPDATE_AUTOMATIC:
116 update = XCB_COMPOSITE_REDIRECT_AUTOMATIC;
118 case ECORE_X_COMPOSITE_UPDATE_MANUAL:
119 update = XCB_COMPOSITE_REDIRECT_MANUAL;
122 xcb_composite_redirect_subwindows(_ecore_xcb_conn, win, update);
128 ecore_x_composite_unredirect_window(Ecore_X_Window win, Ecore_X_Composite_Update_Type type)
130 LOGFN(__FILE__, __LINE__, __FUNCTION__);
132 #ifdef ECORE_XCB_COMPOSITE
133 uint8_t update = XCB_COMPOSITE_REDIRECT_AUTOMATIC;
137 case ECORE_X_COMPOSITE_UPDATE_AUTOMATIC:
138 update = XCB_COMPOSITE_REDIRECT_AUTOMATIC;
140 case ECORE_X_COMPOSITE_UPDATE_MANUAL:
141 update = XCB_COMPOSITE_REDIRECT_MANUAL;
144 xcb_composite_unredirect_window(_ecore_xcb_conn, win, update);
150 ecore_x_composite_unredirect_subwindows(Ecore_X_Window win, Ecore_X_Composite_Update_Type type)
152 LOGFN(__FILE__, __LINE__, __FUNCTION__);
154 #ifdef ECORE_XCB_COMPOSITE
155 uint8_t update = XCB_COMPOSITE_REDIRECT_AUTOMATIC;
159 case ECORE_X_COMPOSITE_UPDATE_AUTOMATIC:
160 update = XCB_COMPOSITE_REDIRECT_AUTOMATIC;
162 case ECORE_X_COMPOSITE_UPDATE_MANUAL:
163 update = XCB_COMPOSITE_REDIRECT_MANUAL;
166 xcb_composite_unredirect_subwindows(_ecore_xcb_conn, win, update);
172 ecore_x_composite_name_window_pixmap_get(Ecore_X_Window win)
174 Ecore_X_Pixmap pmap = XCB_NONE;
176 LOGFN(__FILE__, __LINE__, __FUNCTION__);
178 #ifdef ECORE_XCB_COMPOSITE
179 pmap = xcb_generate_id(_ecore_xcb_conn);
180 xcb_composite_name_window_pixmap(_ecore_xcb_conn, win, pmap);
188 ecore_x_composite_window_events_disable(Ecore_X_Window win)
190 LOGFN(__FILE__, __LINE__, __FUNCTION__);
192 #ifdef ECORE_XCB_SHAPE
193 ecore_x_window_shape_input_rectangle_set(win, -1, -1, 1, 1);
202 ecore_x_composite_window_events_enable(Ecore_X_Window win)
204 LOGFN(__FILE__, __LINE__, __FUNCTION__);
206 #ifdef ECORE_XCB_SHAPE
207 ecore_x_window_shape_input_rectangle_set(win, 0, 0, 65535, 65535);
216 ecore_x_composite_render_window_enable(Ecore_X_Window root)
218 Ecore_X_Window win = 0;
219 #ifdef ECORE_XCB_COMPOSITE
220 xcb_composite_get_overlay_window_cookie_t cookie;
221 xcb_composite_get_overlay_window_reply_t *reply;
224 LOGFN(__FILE__, __LINE__, __FUNCTION__);
226 #ifdef ECORE_XCB_COMPOSITE
227 cookie = xcb_composite_get_overlay_window_unchecked(_ecore_xcb_conn, root);
229 xcb_composite_get_overlay_window_reply(_ecore_xcb_conn, cookie, NULL);
230 if (!reply) return win;
232 win = reply->overlay_win;
235 ecore_x_composite_window_events_disable(win);
243 ecore_x_composite_render_window_disable(Ecore_X_Window win)
245 LOGFN(__FILE__, __LINE__, __FUNCTION__);
247 #ifdef ECORE_XCB_COMPOSITE
248 xcb_composite_release_overlay_window(_ecore_xcb_conn, win);