eolian: rename is_ref API to is_ptr to match syntax
[platform/upstream/efl.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  * @ingroup Ecore_X_Group
66  *
67  * Functions related to the X Composite Extension
68  */
69
70 /**
71  * Return whether the Composite Extension is available
72  *
73  * @return @c EINA_TRUE is the Composite Extension is available, @c EINA_FALSE
74  * if not.
75  *
76  * @ingroup Ecore_X_Composite_Group
77  */
78 EAPI Eina_Bool
79 ecore_x_composite_query(void)
80 {
81    LOGFN(__FILE__, __LINE__, __FUNCTION__);
82    return _composite_avail;
83 }
84
85 EAPI void
86 ecore_x_composite_redirect_window(Ecore_X_Window                win,
87                                   Ecore_X_Composite_Update_Type type)
88 {
89    LOGFN(__FILE__, __LINE__, __FUNCTION__);
90    CHECK_XCB_CONN;
91
92    if (!_composite_avail) return;
93
94 #ifdef ECORE_XCB_COMPOSITE
95    uint8_t update = XCB_COMPOSITE_REDIRECT_AUTOMATIC;
96
97    switch (type)
98      {
99       case ECORE_X_COMPOSITE_UPDATE_AUTOMATIC:
100         update = XCB_COMPOSITE_REDIRECT_AUTOMATIC;
101         break;
102
103       case ECORE_X_COMPOSITE_UPDATE_MANUAL:
104         update = XCB_COMPOSITE_REDIRECT_MANUAL;
105         break;
106      }
107    xcb_composite_redirect_window(_ecore_xcb_conn, win, update);
108 //   ecore_x_flush();
109 #endif
110 }
111
112 EAPI void
113 ecore_x_composite_redirect_subwindows(Ecore_X_Window                win,
114                                       Ecore_X_Composite_Update_Type type)
115 {
116    LOGFN(__FILE__, __LINE__, __FUNCTION__);
117    CHECK_XCB_CONN;
118
119    if (!_composite_avail) return;
120
121 #ifdef ECORE_XCB_COMPOSITE
122    uint8_t update = XCB_COMPOSITE_REDIRECT_AUTOMATIC;
123
124    switch (type)
125      {
126       case ECORE_X_COMPOSITE_UPDATE_AUTOMATIC:
127         update = XCB_COMPOSITE_REDIRECT_AUTOMATIC;
128         break;
129
130       case ECORE_X_COMPOSITE_UPDATE_MANUAL:
131         update = XCB_COMPOSITE_REDIRECT_MANUAL;
132         break;
133      }
134    xcb_composite_redirect_subwindows(_ecore_xcb_conn, win, update);
135 //   ecore_x_flush();
136 #endif
137 }
138
139 EAPI void
140 ecore_x_composite_unredirect_window(Ecore_X_Window                win,
141                                     Ecore_X_Composite_Update_Type type)
142 {
143    LOGFN(__FILE__, __LINE__, __FUNCTION__);
144    CHECK_XCB_CONN;
145
146    if (!_composite_avail) return;
147
148 #ifdef ECORE_XCB_COMPOSITE
149    uint8_t update = XCB_COMPOSITE_REDIRECT_AUTOMATIC;
150
151    switch (type)
152      {
153       case ECORE_X_COMPOSITE_UPDATE_AUTOMATIC:
154         update = XCB_COMPOSITE_REDIRECT_AUTOMATIC;
155         break;
156
157       case ECORE_X_COMPOSITE_UPDATE_MANUAL:
158         update = XCB_COMPOSITE_REDIRECT_MANUAL;
159         break;
160      }
161    xcb_composite_unredirect_window(_ecore_xcb_conn, win, update);
162 //   ecore_x_flush();
163 #endif
164 }
165
166 EAPI void
167 ecore_x_composite_unredirect_subwindows(Ecore_X_Window                win,
168                                         Ecore_X_Composite_Update_Type type)
169 {
170    LOGFN(__FILE__, __LINE__, __FUNCTION__);
171    CHECK_XCB_CONN;
172
173    if (!_composite_avail) return;
174
175 #ifdef ECORE_XCB_COMPOSITE
176    uint8_t update = XCB_COMPOSITE_REDIRECT_AUTOMATIC;
177
178    switch (type)
179      {
180       case ECORE_X_COMPOSITE_UPDATE_AUTOMATIC:
181         update = XCB_COMPOSITE_REDIRECT_AUTOMATIC;
182         break;
183
184       case ECORE_X_COMPOSITE_UPDATE_MANUAL:
185         update = XCB_COMPOSITE_REDIRECT_MANUAL;
186         break;
187      }
188    xcb_composite_unredirect_subwindows(_ecore_xcb_conn, win, update);
189 //   ecore_x_flush();
190 #endif
191 }
192
193 EAPI Ecore_X_Pixmap
194 ecore_x_composite_name_window_pixmap_get(Ecore_X_Window win)
195 {
196 #ifdef ECORE_XCB_COMPOSITE
197    Ecore_X_Pixmap pmap = XCB_NONE;
198 #endif
199
200    LOGFN(__FILE__, __LINE__, __FUNCTION__);
201    CHECK_XCB_CONN;
202
203    if (!_composite_avail) return XCB_NONE;
204
205 #ifdef ECORE_XCB_COMPOSITE
206    pmap = xcb_generate_id(_ecore_xcb_conn);
207    xcb_composite_name_window_pixmap(_ecore_xcb_conn, win, pmap);
208 //   ecore_x_flush();
209 #endif
210
211    return pmap;
212 }
213
214 EAPI void
215 ecore_x_composite_window_events_disable(Ecore_X_Window win)
216 {
217    LOGFN(__FILE__, __LINE__, __FUNCTION__);
218    CHECK_XCB_CONN;
219
220    if (!_composite_avail) return;
221
222 #ifdef ECORE_XCB_SHAPE
223    ecore_x_window_shape_input_rectangle_set(win, -1, -1, 1, 1);
224 //   ecore_x_flush();
225 #else
226    return;
227    win = 0;
228 #endif
229 }
230
231 EAPI void
232 ecore_x_composite_window_events_enable(Ecore_X_Window win)
233 {
234    LOGFN(__FILE__, __LINE__, __FUNCTION__);
235    CHECK_XCB_CONN;
236
237    if (!_composite_avail) return;
238
239 #ifdef ECORE_XCB_SHAPE
240    ecore_x_window_shape_input_rectangle_set(win, 0, 0, 65535, 65535);
241 //   ecore_x_flush();
242 #else
243    return;
244    win = 0;
245 #endif
246 }
247
248 EAPI Ecore_X_Window
249 ecore_x_composite_render_window_enable(Ecore_X_Window root)
250 {
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;
255 #endif
256
257    LOGFN(__FILE__, __LINE__, __FUNCTION__);
258    CHECK_XCB_CONN;
259
260    if (!_composite_avail) return 0;
261
262 #ifdef ECORE_XCB_COMPOSITE
263    cookie = xcb_composite_get_overlay_window_unchecked(_ecore_xcb_conn, root);
264    reply =
265      xcb_composite_get_overlay_window_reply(_ecore_xcb_conn, cookie, NULL);
266    if (!reply) return win;
267
268    win = reply->overlay_win;
269    free(reply);
270
271    ecore_x_composite_window_events_disable(win);
272 //   ecore_x_flush();
273 #endif
274
275    return win;
276 }
277
278 EAPI void
279 ecore_x_composite_render_window_disable(Ecore_X_Window win)
280 {
281    LOGFN(__FILE__, __LINE__, __FUNCTION__);
282    CHECK_XCB_CONN;
283
284    if (!_composite_avail) return;
285
286 #ifdef ECORE_XCB_COMPOSITE
287    xcb_composite_release_overlay_window(_ecore_xcb_conn, win);
288 //   ecore_x_flush();
289 #endif
290 }
291