svn update: 48958 (latest:48959)
[framework/uifw/ecore.git] / src / lib / ecore_x / xlib / ecore_x_composite.c
1 /*
2  * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
3  */
4
5 #ifdef HAVE_CONFIG_H
6 # include <config.h>
7 #endif
8
9
10 #include "ecore_x_private.h"
11 #include "Ecore_X.h"
12
13 static int _composite_available;
14
15 void
16 _ecore_x_composite_init(void)
17 {
18    _composite_available = 0;
19
20 #ifdef ECORE_XCOMPOSITE
21    int major, minor;
22
23    if (XCompositeQueryVersion(_ecore_x_disp, &major, &minor))
24      _composite_available = 1;
25 #endif
26 }
27
28 EAPI int
29 ecore_x_composite_query(void)
30 {
31    LOGFN(__FILE__, __LINE__, __FUNCTION__);
32    return _composite_available;
33 }
34
35 EAPI void
36 ecore_x_composite_redirect_window(Ecore_X_Window win, Ecore_X_Composite_Update_Type type)
37 {
38 #ifdef ECORE_XCOMPOSITE
39    int update = CompositeRedirectAutomatic;
40
41    LOGFN(__FILE__, __LINE__, __FUNCTION__);
42    switch(type)
43      {
44       case ECORE_X_COMPOSITE_UPDATE_AUTOMATIC:
45          update = CompositeRedirectAutomatic;
46          break;
47       case ECORE_X_COMPOSITE_UPDATE_MANUAL:
48          update = CompositeRedirectManual;
49          break;
50      }
51    XCompositeRedirectWindow(_ecore_x_disp, win, update);
52 #endif
53 }
54
55 EAPI void
56 ecore_x_composite_redirect_subwindows(Ecore_X_Window win, Ecore_X_Composite_Update_Type type)
57 {
58 #ifdef ECORE_XCOMPOSITE
59    int update = CompositeRedirectAutomatic;
60
61    LOGFN(__FILE__, __LINE__, __FUNCTION__);
62    switch(type)
63      {
64       case ECORE_X_COMPOSITE_UPDATE_AUTOMATIC:
65          update = CompositeRedirectAutomatic;
66          break;
67       case ECORE_X_COMPOSITE_UPDATE_MANUAL:
68          update = CompositeRedirectManual;
69          break;
70      }
71    XCompositeRedirectSubwindows(_ecore_x_disp, win, update);
72 #endif
73 }
74
75 EAPI void
76 ecore_x_composite_unredirect_window(Ecore_X_Window win, Ecore_X_Composite_Update_Type type)
77 {
78 #ifdef ECORE_XCOMPOSITE
79    int update = CompositeRedirectAutomatic;
80
81    LOGFN(__FILE__, __LINE__, __FUNCTION__);
82    switch(type)
83      {
84       case ECORE_X_COMPOSITE_UPDATE_AUTOMATIC:
85          update = CompositeRedirectAutomatic;
86          break;
87       case ECORE_X_COMPOSITE_UPDATE_MANUAL:
88          update = CompositeRedirectManual;
89          break;
90      }
91    XCompositeUnredirectWindow(_ecore_x_disp, win, update);
92 #endif
93 }
94
95 EAPI void
96 ecore_x_composite_unredirect_subwindows(Ecore_X_Window win, Ecore_X_Composite_Update_Type type)
97 {
98 #ifdef ECORE_XCOMPOSITE
99    int update = CompositeRedirectAutomatic;
100
101    LOGFN(__FILE__, __LINE__, __FUNCTION__);
102    switch(type)
103      {
104       case ECORE_X_COMPOSITE_UPDATE_AUTOMATIC:
105          update = CompositeRedirectAutomatic;
106          break;
107       case ECORE_X_COMPOSITE_UPDATE_MANUAL:
108          update = CompositeRedirectManual;
109          break;
110      }
111    XCompositeUnredirectSubwindows(_ecore_x_disp, win, update);
112 #endif
113 }
114
115 EAPI Ecore_X_Pixmap
116 ecore_x_composite_name_window_pixmap_get(Ecore_X_Window win)
117 {
118    Ecore_X_Pixmap pixmap = None;
119   
120 #ifdef ECORE_XCOMPOSITE
121    LOGFN(__FILE__, __LINE__, __FUNCTION__);
122    pixmap = XCompositeNameWindowPixmap(_ecore_x_disp, win);
123 #endif
124
125    return pixmap;
126 }
127
128 EAPI Ecore_X_Window
129 ecore_x_composite_render_window_enable(Ecore_X_Window root)
130 {
131    Ecore_X_Window win = 0;
132 #ifdef ECORE_XCOMPOSITE
133    XRectangle rect;
134    
135    LOGFN(__FILE__, __LINE__, __FUNCTION__);
136    win = XCompositeGetOverlayWindow(_ecore_x_disp, root);
137    rect.x = -1;
138    rect.y = -1;
139    rect.width = 1;
140    rect.height = 1;
141    XShapeCombineRectangles(_ecore_x_disp, win, ShapeInput, 0, 0, &rect, 1, 
142                            ShapeSet, Unsorted);
143 #endif
144    return win;
145 }
146
147 EAPI void
148 ecore_x_composite_render_window_disable(Ecore_X_Window root)
149 {
150 #ifdef ECORE_XCOMPOSITE
151    LOGFN(__FILE__, __LINE__, __FUNCTION__);
152    XCompositeReleaseOverlayWindow(_ecore_x_disp, root);
153 #endif   
154 }