913839f4818b36816b693bc2f900d3e0c5f7f3fd
[platform/upstream/efl.git] / src / lib / ecore_x / xlib / ecore_x_composite.c
1 #ifdef HAVE_CONFIG_H
2 # include <config.h>
3 #endif /* ifdef HAVE_CONFIG_H */
4
5 #include "ecore_x_private.h"
6 #include "Ecore_X.h"
7
8 static Eina_Bool _composite_available = EINA_FALSE;
9
10 void
11 _ecore_x_composite_init(void)
12 {
13    _composite_available = EINA_FALSE;
14
15 #ifdef ECORE_XCOMPOSITE
16    int major, minor;
17
18    if (XCompositeQueryVersion(_ecore_x_disp, &major, &minor))
19      {
20         if (_ecore_xlib_sync) ecore_x_sync();
21 # ifdef ECORE_XRENDER
22         if (XRenderQueryExtension(_ecore_x_disp, &major, &minor))
23           {
24              if (_ecore_xlib_sync) ecore_x_sync();
25 #  ifdef ECORE_XFIXES
26              if (XFixesQueryVersion(_ecore_x_disp, &major, &minor))
27                {
28                   if (_ecore_xlib_sync) ecore_x_sync();
29                   _composite_available = EINA_TRUE;
30                }
31 #  endif
32           }
33 # endif
34      }
35 #endif
36 }
37
38 EAPI Eina_Bool
39 ecore_x_composite_query(void)
40 {
41    LOGFN(__FILE__, __LINE__, __FUNCTION__);
42    return _composite_available;
43 }
44
45 EAPI void
46 ecore_x_composite_redirect_window(Ecore_X_Window win,
47                                   Ecore_X_Composite_Update_Type type)
48 {
49 #ifdef ECORE_XCOMPOSITE
50    int update = CompositeRedirectAutomatic;
51
52    LOGFN(__FILE__, __LINE__, __FUNCTION__);
53    switch (type)
54      {
55       case ECORE_X_COMPOSITE_UPDATE_AUTOMATIC:
56         update = CompositeRedirectAutomatic;
57         break;
58
59       case ECORE_X_COMPOSITE_UPDATE_MANUAL:
60         update = CompositeRedirectManual;
61         break;
62      }
63    XCompositeRedirectWindow(_ecore_x_disp, win, update);
64    if (_ecore_xlib_sync) ecore_x_sync();
65 #endif /* ifdef ECORE_XCOMPOSITE */
66 }
67
68 EAPI void
69 ecore_x_composite_redirect_subwindows(Ecore_X_Window win,
70                                       Ecore_X_Composite_Update_Type type)
71 {
72 #ifdef ECORE_XCOMPOSITE
73    int update = CompositeRedirectAutomatic;
74
75    LOGFN(__FILE__, __LINE__, __FUNCTION__);
76    switch (type)
77      {
78       case ECORE_X_COMPOSITE_UPDATE_AUTOMATIC:
79         update = CompositeRedirectAutomatic;
80         break;
81
82       case ECORE_X_COMPOSITE_UPDATE_MANUAL:
83         update = CompositeRedirectManual;
84         break;
85      }
86    XCompositeRedirectSubwindows(_ecore_x_disp, win, update);
87    if (_ecore_xlib_sync) ecore_x_sync();
88 #endif /* ifdef ECORE_XCOMPOSITE */
89 }
90
91 EAPI void
92 ecore_x_composite_unredirect_window(Ecore_X_Window win,
93                                     Ecore_X_Composite_Update_Type type)
94 {
95 #ifdef ECORE_XCOMPOSITE
96    int update = CompositeRedirectAutomatic;
97
98    LOGFN(__FILE__, __LINE__, __FUNCTION__);
99    switch (type)
100      {
101       case ECORE_X_COMPOSITE_UPDATE_AUTOMATIC:
102         update = CompositeRedirectAutomatic;
103         break;
104
105       case ECORE_X_COMPOSITE_UPDATE_MANUAL:
106         update = CompositeRedirectManual;
107         break;
108      }
109    XCompositeUnredirectWindow(_ecore_x_disp, win, update);
110    if (_ecore_xlib_sync) ecore_x_sync();
111 #endif /* ifdef ECORE_XCOMPOSITE */
112 }
113
114 EAPI void
115 ecore_x_composite_unredirect_subwindows(Ecore_X_Window win,
116                                         Ecore_X_Composite_Update_Type type)
117 {
118 #ifdef ECORE_XCOMPOSITE
119    int update = CompositeRedirectAutomatic;
120
121    LOGFN(__FILE__, __LINE__, __FUNCTION__);
122    switch (type)
123      {
124       case ECORE_X_COMPOSITE_UPDATE_AUTOMATIC:
125         update = CompositeRedirectAutomatic;
126         break;
127
128       case ECORE_X_COMPOSITE_UPDATE_MANUAL:
129         update = CompositeRedirectManual;
130         break;
131      }
132    XCompositeUnredirectSubwindows(_ecore_x_disp, win, update);
133    if (_ecore_xlib_sync) ecore_x_sync();
134 #endif /* ifdef ECORE_XCOMPOSITE */
135 }
136
137 EAPI Ecore_X_Pixmap
138 ecore_x_composite_name_window_pixmap_get(Ecore_X_Window win)
139 {
140    Ecore_X_Pixmap pixmap = None;
141 #ifdef ECORE_XCOMPOSITE
142    LOGFN(__FILE__, __LINE__, __FUNCTION__);
143    pixmap = XCompositeNameWindowPixmap(_ecore_x_disp, win);
144    if (_ecore_xlib_sync) ecore_x_sync();
145 #endif /* ifdef ECORE_XCOMPOSITE */
146    return pixmap;
147 }
148
149 EAPI void
150 ecore_x_composite_window_events_disable(Ecore_X_Window win)
151 {
152 #ifdef ECORE_XCOMPOSITE
153    ecore_x_window_shape_input_rectangle_set(win, -1, -1, 1, 1);
154    if (_ecore_xlib_sync) ecore_x_sync();
155 #endif /* ifdef ECORE_XCOMPOSITE */
156 }
157
158 EAPI void
159 ecore_x_composite_window_events_enable(Ecore_X_Window win)
160 {
161 #ifdef ECORE_XCOMPOSITE
162    ecore_x_window_shape_input_rectangle_set(win, 0, 0, 65535, 65535);
163    if (_ecore_xlib_sync) ecore_x_sync();
164 #endif /* ifdef ECORE_XCOMPOSITE */
165 }
166
167 EAPI Ecore_X_Window
168 ecore_x_composite_render_window_enable(Ecore_X_Window root)
169 {
170    Ecore_X_Window win = 0;
171 #ifdef ECORE_XCOMPOSITE
172    win = XCompositeGetOverlayWindow(_ecore_x_disp, root);
173    if (_ecore_xlib_sync) ecore_x_sync();
174    ecore_x_composite_window_events_disable(win);
175 #endif /* ifdef ECORE_XCOMPOSITE */
176    return win;
177 }
178
179 EAPI void
180 ecore_x_composite_render_window_disable(Ecore_X_Window root)
181 {
182 #ifdef ECORE_XCOMPOSITE
183    LOGFN(__FILE__, __LINE__, __FUNCTION__);
184    XCompositeReleaseOverlayWindow(_ecore_x_disp, root);
185    if (_ecore_xlib_sync) ecore_x_sync();
186 #endif /* ifdef ECORE_XCOMPOSITE */
187 }
188