[ecore] merged svn latest code (svn54830)
[profile/ivi/ecore.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 # ifdef ECORE_XRENDER
21         if (XRenderQueryExtension(_ecore_x_disp, &major, &minor))
22           {
23 #  ifdef ECORE_XFIXES
24              if (XFixesQueryVersion(_ecore_x_disp, &major, &minor))
25                {
26                   _composite_available = EINA_TRUE;
27                }
28 #  endif
29           }
30 # endif        
31      }
32 #endif
33 } /* _ecore_x_composite_init */
34
35 EAPI Eina_Bool
36 ecore_x_composite_query(void)
37 {
38    LOGFN(__FILE__, __LINE__, __FUNCTION__);
39    return _composite_available;
40 } /* ecore_x_composite_query */
41
42 EAPI void
43 ecore_x_composite_redirect_window(Ecore_X_Window                win,
44                                   Ecore_X_Composite_Update_Type type)
45 {
46 #ifdef ECORE_XCOMPOSITE
47    int update = CompositeRedirectAutomatic;
48
49    LOGFN(__FILE__, __LINE__, __FUNCTION__);
50    switch(type)
51      {
52       case ECORE_X_COMPOSITE_UPDATE_AUTOMATIC:
53          update = CompositeRedirectAutomatic;
54          break;
55
56       case ECORE_X_COMPOSITE_UPDATE_MANUAL:
57          update = CompositeRedirectManual;
58          break;
59      } /* switch */
60    XCompositeRedirectWindow(_ecore_x_disp, win, update);
61 #endif /* ifdef ECORE_XCOMPOSITE */
62 } /* ecore_x_composite_redirect_window */
63
64 EAPI void
65 ecore_x_composite_redirect_subwindows(Ecore_X_Window                win,
66                                       Ecore_X_Composite_Update_Type type)
67 {
68 #ifdef ECORE_XCOMPOSITE
69    int update = CompositeRedirectAutomatic;
70
71    LOGFN(__FILE__, __LINE__, __FUNCTION__);
72    switch(type)
73      {
74       case ECORE_X_COMPOSITE_UPDATE_AUTOMATIC:
75          update = CompositeRedirectAutomatic;
76          break;
77
78       case ECORE_X_COMPOSITE_UPDATE_MANUAL:
79          update = CompositeRedirectManual;
80          break;
81      } /* switch */
82    XCompositeRedirectSubwindows(_ecore_x_disp, win, update);
83 #endif /* ifdef ECORE_XCOMPOSITE */
84 } /* ecore_x_composite_redirect_subwindows */
85
86 EAPI void
87 ecore_x_composite_unredirect_window(Ecore_X_Window                win,
88                                     Ecore_X_Composite_Update_Type type)
89 {
90 #ifdef ECORE_XCOMPOSITE
91    int update = CompositeRedirectAutomatic;
92
93    LOGFN(__FILE__, __LINE__, __FUNCTION__);
94    switch(type)
95      {
96       case ECORE_X_COMPOSITE_UPDATE_AUTOMATIC:
97          update = CompositeRedirectAutomatic;
98          break;
99
100       case ECORE_X_COMPOSITE_UPDATE_MANUAL:
101          update = CompositeRedirectManual;
102          break;
103      } /* switch */
104    XCompositeUnredirectWindow(_ecore_x_disp, win, update);
105 #endif /* ifdef ECORE_XCOMPOSITE */
106 } /* ecore_x_composite_unredirect_window */
107
108 EAPI void
109 ecore_x_composite_unredirect_subwindows(Ecore_X_Window                win,
110                                         Ecore_X_Composite_Update_Type type)
111 {
112 #ifdef ECORE_XCOMPOSITE
113    int update = CompositeRedirectAutomatic;
114
115    LOGFN(__FILE__, __LINE__, __FUNCTION__);
116    switch(type)
117      {
118       case ECORE_X_COMPOSITE_UPDATE_AUTOMATIC:
119          update = CompositeRedirectAutomatic;
120          break;
121
122       case ECORE_X_COMPOSITE_UPDATE_MANUAL:
123          update = CompositeRedirectManual;
124          break;
125      } /* switch */
126    XCompositeUnredirectSubwindows(_ecore_x_disp, win, update);
127 #endif /* ifdef ECORE_XCOMPOSITE */
128 } /* ecore_x_composite_unredirect_subwindows */
129
130 EAPI Ecore_X_Pixmap
131 ecore_x_composite_name_window_pixmap_get(Ecore_X_Window win)
132 {
133    Ecore_X_Pixmap pixmap = None;
134
135 #ifdef ECORE_XCOMPOSITE
136    LOGFN(__FILE__, __LINE__, __FUNCTION__);
137    pixmap = XCompositeNameWindowPixmap(_ecore_x_disp, win);
138 #endif /* ifdef ECORE_XCOMPOSITE */
139
140    return pixmap;
141 } /* ecore_x_composite_name_window_pixmap_get */
142
143 EAPI void
144 ecore_x_composite_window_events_disable(Ecore_X_Window win)
145 {
146 #ifdef ECORE_XCOMPOSITE
147    XRectangle rect;
148    rect.x = -1;
149    rect.y = -1;
150    rect.width = 1;
151    rect.height = 1;
152    XShapeCombineRectangles(_ecore_x_disp, win, ShapeInput, 0, 0, &rect, 1,
153                            ShapeSet, Unsorted);
154 #endif /* ifdef ECORE_XCOMPOSITE */
155 }
156
157 EAPI void
158 ecore_x_composite_window_events_enable(Ecore_X_Window win)
159 {
160 #ifdef ECORE_XCOMPOSITE
161    XRectangle rect;
162    rect.x = 0;
163    rect.y = 0;
164    rect.width = 65535;
165    rect.height = 65535;
166    XShapeCombineRectangles(_ecore_x_disp, win, ShapeInput, 0, 0, &rect, 1,
167                            ShapeSet, Unsorted);
168 #endif /* ifdef ECORE_XCOMPOSITE */
169 }
170
171 EAPI Ecore_X_Window
172 ecore_x_composite_render_window_enable(Ecore_X_Window root)
173 {
174    Ecore_X_Window win = 0;
175 #ifdef ECORE_XCOMPOSITE
176    XRectangle rect;
177
178    LOGFN(__FILE__, __LINE__, __FUNCTION__);
179    win = XCompositeGetOverlayWindow(_ecore_x_disp, root);
180    rect.x = -1;
181    rect.y = -1;
182    rect.width = 1;
183    rect.height = 1;
184    XShapeCombineRectangles(_ecore_x_disp, win, ShapeInput, 0, 0, &rect, 1,
185                            ShapeSet, Unsorted);
186 #endif /* ifdef ECORE_XCOMPOSITE */
187    return win;
188 } /* ecore_x_composite_render_window_enable */
189
190 EAPI void
191 ecore_x_composite_render_window_disable(Ecore_X_Window root)
192 {
193 #ifdef ECORE_XCOMPOSITE
194    LOGFN(__FILE__, __LINE__, __FUNCTION__);
195    XCompositeReleaseOverlayWindow(_ecore_x_disp, root);
196 #endif /* ifdef ECORE_XCOMPOSITE */
197 } /* ecore_x_composite_render_window_disable */
198