Tizen 2.1 base
[framework/uifw/ecore.git] / src / lib / ecore_x / xcb / ecore_xcb_composite.c
1 #include "ecore_xcb_private.h"
2 #ifdef ECORE_XCB_COMPOSITE
3 # include <xcb/composite.h>
4 #endif
5
6 /* local variables */
7 static Eina_Bool _composite_avail = EINA_FALSE;
8
9 void
10 _ecore_xcb_composite_init(void)
11 {
12    LOGFN(__FILE__, __LINE__, __FUNCTION__);
13
14 #ifdef ECORE_XCB_COMPOSITE
15    xcb_prefetch_extension_data(_ecore_xcb_conn, &xcb_composite_id);
16 #endif
17 }
18
19 void
20 _ecore_xcb_composite_finalize(void)
21 {
22 #ifdef ECORE_XCB_COMPOSITE
23    const xcb_query_extension_reply_t *ext_reply;
24 #endif
25
26    LOGFN(__FILE__, __LINE__, __FUNCTION__);
27
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))
31      {
32         xcb_composite_query_version_cookie_t cookie;
33         xcb_composite_query_version_reply_t *reply;
34
35         cookie =
36           xcb_composite_query_version_unchecked(_ecore_xcb_conn,
37                                                 XCB_COMPOSITE_MAJOR_VERSION,
38                                                 XCB_COMPOSITE_MINOR_VERSION);
39         reply =
40           xcb_composite_query_version_reply(_ecore_xcb_conn, cookie, NULL);
41         if (reply)
42           {
43 //             if ((reply->major_version >= XCB_COMPOSITE_MAJOR_VERSION) &&
44                if (reply->minor_version >= XCB_COMPOSITE_MINOR_VERSION)
45                  {
46 # ifdef ECORE_XCB_RENDER
47                     if (_ecore_xcb_render_avail_get())
48                       {
49 #  ifdef ECORE_XCB_XFIXES
50                          if (_ecore_xcb_xfixes_avail_get())
51                            _composite_avail = EINA_TRUE;
52 #  endif
53                       }
54 # endif
55                  }
56
57                free(reply);
58           }
59      }
60 #endif
61 }
62
63 /**
64  * @defgroup Ecore_X_Composite_Group X Composite Extension Functions
65  *
66  * Functions related to the X Composite Extension
67  */
68
69 /**
70  * Return whether the Composite Extension is available
71  *
72  * @return @c EINA_TRUE is the Composite Extension is available, @c EINA_FALSE
73  * if not.
74  *
75  * @ingroup Ecore_X_Composite_Group
76  */
77 EAPI Eina_Bool
78 ecore_x_composite_query(void)
79 {
80    LOGFN(__FILE__, __LINE__, __FUNCTION__);
81    return _composite_avail;
82 }
83
84 EAPI void
85 ecore_x_composite_redirect_window(Ecore_X_Window                win,
86                                   Ecore_X_Composite_Update_Type type)
87 {
88    LOGFN(__FILE__, __LINE__, __FUNCTION__);
89    CHECK_XCB_CONN;
90
91    if (!_composite_avail) return;
92
93 #ifdef ECORE_XCB_COMPOSITE
94    uint8_t update = XCB_COMPOSITE_REDIRECT_AUTOMATIC;
95
96    switch (type)
97      {
98       case ECORE_X_COMPOSITE_UPDATE_AUTOMATIC:
99         update = XCB_COMPOSITE_REDIRECT_AUTOMATIC;
100         break;
101
102       case ECORE_X_COMPOSITE_UPDATE_MANUAL:
103         update = XCB_COMPOSITE_REDIRECT_MANUAL;
104         break;
105      }
106    xcb_composite_redirect_window(_ecore_xcb_conn, win, update);
107 //   ecore_x_flush();
108 #endif
109 }
110
111 EAPI void
112 ecore_x_composite_redirect_subwindows(Ecore_X_Window                win,
113                                       Ecore_X_Composite_Update_Type type)
114 {
115    LOGFN(__FILE__, __LINE__, __FUNCTION__);
116    CHECK_XCB_CONN;
117
118    if (!_composite_avail) return;
119
120 #ifdef ECORE_XCB_COMPOSITE
121    uint8_t update = XCB_COMPOSITE_REDIRECT_AUTOMATIC;
122
123    switch (type)
124      {
125       case ECORE_X_COMPOSITE_UPDATE_AUTOMATIC:
126         update = XCB_COMPOSITE_REDIRECT_AUTOMATIC;
127         break;
128
129       case ECORE_X_COMPOSITE_UPDATE_MANUAL:
130         update = XCB_COMPOSITE_REDIRECT_MANUAL;
131         break;
132      }
133    xcb_composite_redirect_subwindows(_ecore_xcb_conn, win, update);
134 //   ecore_x_flush();
135 #endif
136 }
137
138 EAPI void
139 ecore_x_composite_unredirect_window(Ecore_X_Window                win,
140                                     Ecore_X_Composite_Update_Type type)
141 {
142    LOGFN(__FILE__, __LINE__, __FUNCTION__);
143    CHECK_XCB_CONN;
144
145    if (!_composite_avail) return;
146
147 #ifdef ECORE_XCB_COMPOSITE
148    uint8_t update = XCB_COMPOSITE_REDIRECT_AUTOMATIC;
149
150    switch (type)
151      {
152       case ECORE_X_COMPOSITE_UPDATE_AUTOMATIC:
153         update = XCB_COMPOSITE_REDIRECT_AUTOMATIC;
154         break;
155
156       case ECORE_X_COMPOSITE_UPDATE_MANUAL:
157         update = XCB_COMPOSITE_REDIRECT_MANUAL;
158         break;
159      }
160    xcb_composite_unredirect_window(_ecore_xcb_conn, win, update);
161 //   ecore_x_flush();
162 #endif
163 }
164
165 EAPI void
166 ecore_x_composite_unredirect_subwindows(Ecore_X_Window                win,
167                                         Ecore_X_Composite_Update_Type type)
168 {
169    LOGFN(__FILE__, __LINE__, __FUNCTION__);
170    CHECK_XCB_CONN;
171
172    if (!_composite_avail) return;
173
174 #ifdef ECORE_XCB_COMPOSITE
175    uint8_t update = XCB_COMPOSITE_REDIRECT_AUTOMATIC;
176
177    switch (type)
178      {
179       case ECORE_X_COMPOSITE_UPDATE_AUTOMATIC:
180         update = XCB_COMPOSITE_REDIRECT_AUTOMATIC;
181         break;
182
183       case ECORE_X_COMPOSITE_UPDATE_MANUAL:
184         update = XCB_COMPOSITE_REDIRECT_MANUAL;
185         break;
186      }
187    xcb_composite_unredirect_subwindows(_ecore_xcb_conn, win, update);
188 //   ecore_x_flush();
189 #endif
190 }
191
192 EAPI Ecore_X_Pixmap
193 ecore_x_composite_name_window_pixmap_get(Ecore_X_Window win)
194 {
195 #ifdef ECORE_XCB_COMPOSITE
196    Ecore_X_Pixmap pmap = XCB_NONE;
197 #endif
198
199    LOGFN(__FILE__, __LINE__, __FUNCTION__);
200    CHECK_XCB_CONN;
201
202    if (!_composite_avail) return XCB_NONE;
203
204 #ifdef ECORE_XCB_COMPOSITE
205    pmap = xcb_generate_id(_ecore_xcb_conn);
206    xcb_composite_name_window_pixmap(_ecore_xcb_conn, win, pmap);
207 //   ecore_x_flush();
208 #endif
209
210    return pmap;
211 }
212
213 EAPI void
214 ecore_x_composite_window_events_disable(Ecore_X_Window win)
215 {
216    LOGFN(__FILE__, __LINE__, __FUNCTION__);
217    CHECK_XCB_CONN;
218
219    if (!_composite_avail) return;
220
221 #ifdef ECORE_XCB_SHAPE
222    ecore_x_window_shape_input_rectangle_set(win, -1, -1, 1, 1);
223 //   ecore_x_flush();
224 #else
225    return;
226    win = 0;
227 #endif
228 }
229
230 EAPI void
231 ecore_x_composite_window_events_enable(Ecore_X_Window win)
232 {
233    LOGFN(__FILE__, __LINE__, __FUNCTION__);
234    CHECK_XCB_CONN;
235
236    if (!_composite_avail) return;
237
238 #ifdef ECORE_XCB_SHAPE
239    ecore_x_window_shape_input_rectangle_set(win, 0, 0, 65535, 65535);
240 //   ecore_x_flush();
241 #else
242    return;
243    win = 0;
244 #endif
245 }
246
247 EAPI Ecore_X_Window
248 ecore_x_composite_render_window_enable(Ecore_X_Window root)
249 {
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;
254 #endif
255
256    LOGFN(__FILE__, __LINE__, __FUNCTION__);
257    CHECK_XCB_CONN;
258
259    if (!_composite_avail) return 0;
260
261 #ifdef ECORE_XCB_COMPOSITE
262    cookie = xcb_composite_get_overlay_window_unchecked(_ecore_xcb_conn, root);
263    reply =
264      xcb_composite_get_overlay_window_reply(_ecore_xcb_conn, cookie, NULL);
265    if (!reply) return win;
266
267    win = reply->overlay_win;
268    free(reply);
269
270    ecore_x_composite_window_events_disable(win);
271 //   ecore_x_flush();
272 #endif
273
274    return win;
275 }
276
277 EAPI void
278 ecore_x_composite_render_window_disable(Ecore_X_Window win)
279 {
280    LOGFN(__FILE__, __LINE__, __FUNCTION__);
281    CHECK_XCB_CONN;
282
283    if (!_composite_avail) return;
284
285 #ifdef ECORE_XCB_COMPOSITE
286    xcb_composite_release_overlay_window(_ecore_xcb_conn, win);
287 //   ecore_x_flush();
288 #endif
289 }
290