Ecore_X(cb): Remove extra calls to ecore_x_flush. Move main loop
[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 EINA_TRUE is the Composite Extension is available, EINA_FALSE if not
73  * 
74  * @ingroup Ecore_X_Composite_Group
75  */
76 EAPI Eina_Bool 
77 ecore_x_composite_query(void) 
78 {
79    LOGFN(__FILE__, __LINE__, __FUNCTION__);
80    return _composite_avail;
81 }
82
83 EAPI void 
84 ecore_x_composite_redirect_window(Ecore_X_Window win, Ecore_X_Composite_Update_Type type) 
85 {
86    LOGFN(__FILE__, __LINE__, __FUNCTION__);
87
88 #ifdef ECORE_XCB_COMPOSITE
89    uint8_t update = XCB_COMPOSITE_REDIRECT_AUTOMATIC;
90
91    switch (type) 
92      {
93       case ECORE_X_COMPOSITE_UPDATE_AUTOMATIC:
94         update = XCB_COMPOSITE_REDIRECT_AUTOMATIC;
95         break;
96       case ECORE_X_COMPOSITE_UPDATE_MANUAL:
97         update = XCB_COMPOSITE_REDIRECT_MANUAL;
98         break;
99      }
100    xcb_composite_redirect_window(_ecore_xcb_conn, win, update);
101 //   ecore_x_flush();
102 #endif
103 }
104
105 EAPI void 
106 ecore_x_composite_redirect_subwindows(Ecore_X_Window win, Ecore_X_Composite_Update_Type type) 
107 {
108    LOGFN(__FILE__, __LINE__, __FUNCTION__);
109
110 #ifdef ECORE_XCB_COMPOSITE
111    uint8_t update = XCB_COMPOSITE_REDIRECT_AUTOMATIC;
112
113    switch (type) 
114      {
115       case ECORE_X_COMPOSITE_UPDATE_AUTOMATIC:
116         update = XCB_COMPOSITE_REDIRECT_AUTOMATIC;
117         break;
118       case ECORE_X_COMPOSITE_UPDATE_MANUAL:
119         update = XCB_COMPOSITE_REDIRECT_MANUAL;
120         break;
121      }
122    xcb_composite_redirect_subwindows(_ecore_xcb_conn, win, update);
123 //   ecore_x_flush();
124 #endif
125 }
126
127 EAPI void 
128 ecore_x_composite_unredirect_window(Ecore_X_Window win, Ecore_X_Composite_Update_Type type) 
129 {
130    LOGFN(__FILE__, __LINE__, __FUNCTION__);
131
132 #ifdef ECORE_XCB_COMPOSITE
133    uint8_t update = XCB_COMPOSITE_REDIRECT_AUTOMATIC;
134
135    switch (type) 
136      {
137       case ECORE_X_COMPOSITE_UPDATE_AUTOMATIC:
138         update = XCB_COMPOSITE_REDIRECT_AUTOMATIC;
139         break;
140       case ECORE_X_COMPOSITE_UPDATE_MANUAL:
141         update = XCB_COMPOSITE_REDIRECT_MANUAL;
142         break;
143      }
144    xcb_composite_unredirect_window(_ecore_xcb_conn, win, update);
145 //   ecore_x_flush();
146 #endif
147 }
148
149 EAPI void 
150 ecore_x_composite_unredirect_subwindows(Ecore_X_Window win, Ecore_X_Composite_Update_Type type) 
151 {
152    LOGFN(__FILE__, __LINE__, __FUNCTION__);
153
154 #ifdef ECORE_XCB_COMPOSITE
155    uint8_t update = XCB_COMPOSITE_REDIRECT_AUTOMATIC;
156
157    switch (type) 
158      {
159       case ECORE_X_COMPOSITE_UPDATE_AUTOMATIC:
160         update = XCB_COMPOSITE_REDIRECT_AUTOMATIC;
161         break;
162       case ECORE_X_COMPOSITE_UPDATE_MANUAL:
163         update = XCB_COMPOSITE_REDIRECT_MANUAL;
164         break;
165      }
166    xcb_composite_unredirect_subwindows(_ecore_xcb_conn, win, update);
167 //   ecore_x_flush();
168 #endif
169 }
170
171 EAPI Ecore_X_Pixmap 
172 ecore_x_composite_name_window_pixmap_get(Ecore_X_Window win) 
173 {
174    Ecore_X_Pixmap pmap = XCB_NONE;
175
176    LOGFN(__FILE__, __LINE__, __FUNCTION__);
177
178 #ifdef ECORE_XCB_COMPOSITE
179    pmap = xcb_generate_id(_ecore_xcb_conn);
180    xcb_composite_name_window_pixmap(_ecore_xcb_conn, win, pmap);
181 //   ecore_x_flush();
182 #endif
183
184    return pmap;
185 }
186
187 EAPI void 
188 ecore_x_composite_window_events_disable(Ecore_X_Window win) 
189 {
190    LOGFN(__FILE__, __LINE__, __FUNCTION__);
191
192 #ifdef ECORE_XCB_SHAPE
193    ecore_x_window_shape_input_rectangle_set(win, -1, -1, 1, 1);
194 //   ecore_x_flush();
195 #else
196    return;
197    win = 0;
198 #endif
199 }
200
201 EAPI void 
202 ecore_x_composite_window_events_enable(Ecore_X_Window win) 
203 {
204    LOGFN(__FILE__, __LINE__, __FUNCTION__);
205
206 #ifdef ECORE_XCB_SHAPE
207    ecore_x_window_shape_input_rectangle_set(win, 0, 0, 65535, 65535);
208 //   ecore_x_flush();
209 #else
210    return;
211    win = 0;
212 #endif
213 }
214
215 EAPI Ecore_X_Window 
216 ecore_x_composite_render_window_enable(Ecore_X_Window root) 
217 {
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;
222 #endif
223
224    LOGFN(__FILE__, __LINE__, __FUNCTION__);
225
226 #ifdef ECORE_XCB_COMPOSITE
227    cookie = xcb_composite_get_overlay_window_unchecked(_ecore_xcb_conn, root);
228    reply = 
229      xcb_composite_get_overlay_window_reply(_ecore_xcb_conn, cookie, NULL);
230    if (!reply) return win;
231
232    win = reply->overlay_win;
233    free(reply);
234
235    ecore_x_composite_window_events_disable(win);
236 //   ecore_x_flush();
237 #endif
238
239    return win;
240 }
241
242 EAPI void 
243 ecore_x_composite_render_window_disable(Ecore_X_Window win) 
244 {
245    LOGFN(__FILE__, __LINE__, __FUNCTION__);
246
247 #ifdef ECORE_XCB_COMPOSITE
248    xcb_composite_release_overlay_window(_ecore_xcb_conn, win);
249 //   ecore_x_flush();
250 #endif
251 }