2 * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
11 #include "ecore_x_private.h"
13 static int _randr_available = 0;
15 static int _randr_major, _randr_minor, _randr_version;
16 #define RANDR_1_2 ((1 << 16) | 2)
17 #define RANDR_1_3 ((1 << 16) | 3)
21 _ecore_x_randr_init(void)
28 if (XRRQueryVersion(_ecore_x_disp, &_randr_major, &_randr_minor))
30 _randr_version = (_randr_major << 16) | _randr_minor;
41 ecore_x_randr_query(void)
43 LOGFN(__FILE__, __LINE__, __FUNCTION__);
44 return _randr_available;
48 ecore_x_randr_events_select(Ecore_X_Window win, int on)
53 LOGFN(__FILE__, __LINE__, __FUNCTION__);
58 mask = RRScreenChangeNotifyMask;
59 if (_randr_version >= RANDR_1_2)
60 mask |= (RRCrtcChangeNotifyMask |
61 RROutputChangeNotifyMask |
62 RROutputPropertyNotifyMask);
65 XRRSelectInput(_ecore_x_disp, win, mask);
73 EAPI Ecore_X_Randr_Rotation
74 ecore_x_randr_screen_rotations_get(Ecore_X_Window root)
79 LOGFN(__FILE__, __LINE__, __FUNCTION__);
80 rot = XRRRotations(_ecore_x_disp, XRRRootToScreen(_ecore_x_disp, root), &crot);
87 EAPI Ecore_X_Randr_Rotation
88 ecore_x_randr_screen_rotation_get(Ecore_X_Window root)
93 LOGFN(__FILE__, __LINE__, __FUNCTION__);
94 XRRRotations(_ecore_x_disp, XRRRootToScreen(_ecore_x_disp, root), &crot);
102 ecore_x_randr_screen_rotation_set(Ecore_X_Window root, Ecore_X_Randr_Rotation rot)
105 XRRScreenConfiguration *xrrcfg;
109 LOGFN(__FILE__, __LINE__, __FUNCTION__);
110 xrrcfg = XRRGetScreenInfo(_ecore_x_disp, root);
112 sizeid = XRRConfigCurrentConfiguration(xrrcfg, &crot);
113 XRRSetScreenConfig(_ecore_x_disp, xrrcfg, root, sizeid, rot, CurrentTime);
114 XRRFreeScreenConfigInfo(xrrcfg);
118 EAPI Ecore_X_Screen_Size *
119 ecore_x_randr_screen_sizes_get(Ecore_X_Window root, int *num)
122 Ecore_X_Screen_Size *ret;
123 XRRScreenSize *sizes;
126 LOGFN(__FILE__, __LINE__, __FUNCTION__);
129 /* we don't have to free sizes, no idea why not */
130 sizes = XRRSizes(_ecore_x_disp, XRRRootToScreen(_ecore_x_disp, root), &n);
131 ret = calloc(n, sizeof(Ecore_X_Screen_Size));
132 if (!ret) return NULL;
135 for (i = 0; i < n; i++)
137 ret[i].width = sizes[i].width;
138 ret[i].height = sizes[i].height;
147 EAPI Ecore_X_Screen_Size
148 ecore_x_randr_current_screen_size_get(Ecore_X_Window root)
150 Ecore_X_Screen_Size ret = { -1, -1 };
152 XRRScreenSize *sizes;
153 XRRScreenConfiguration *sc;
158 LOGFN(__FILE__, __LINE__, __FUNCTION__);
159 sc = XRRGetScreenInfo(_ecore_x_disp, root);
162 ERR("Couldn't get screen information for %d", root);
165 size_index = XRRConfigCurrentConfiguration(sc, &rotation);
167 sizes = XRRSizes(_ecore_x_disp, XRRRootToScreen(_ecore_x_disp, root), &n);
170 ret.width = sizes[size_index].width;
171 ret.height = sizes[size_index].height;
173 XRRFreeScreenConfigInfo(sc);
179 ecore_x_randr_screen_size_set(Ecore_X_Window root, Ecore_X_Screen_Size size)
182 XRRScreenConfiguration *sc;
183 XRRScreenSize *sizes;
184 int i, n, size_index = -1;
186 LOGFN(__FILE__, __LINE__, __FUNCTION__);
187 sizes = XRRSizes(_ecore_x_disp, XRRRootToScreen(_ecore_x_disp, root), &n);
188 for (i = 0; i < n; i++)
190 if ((sizes[i].width == size.width) && (sizes[i].height == size.height))
196 if (size_index == -1) return 0;
198 sc = XRRGetScreenInfo(_ecore_x_disp, root);
199 if (XRRSetScreenConfig(_ecore_x_disp, sc,
201 RR_Rotate_0, CurrentTime))
203 ERR("Can't set new screen size!");
204 XRRFreeScreenConfigInfo(sc);
207 XRRFreeScreenConfigInfo(sc);
214 EAPI Ecore_X_Screen_Refresh_Rate
215 ecore_x_randr_current_screen_refresh_rate_get(Ecore_X_Window root)
217 Ecore_X_Screen_Refresh_Rate ret = { -1 };
219 XRRScreenConfiguration *sc;
221 LOGFN(__FILE__, __LINE__, __FUNCTION__);
222 sc = XRRGetScreenInfo(_ecore_x_disp, root);
225 ERR("Couldn't get screen information for %d", root);
228 ret.rate = XRRConfigCurrentRate(sc);
229 XRRFreeScreenConfigInfo(sc);
234 EAPI Ecore_X_Screen_Refresh_Rate *
235 ecore_x_randr_screen_refresh_rates_get(Ecore_X_Window root, int size_id, int *num)
238 Ecore_X_Screen_Refresh_Rate *ret = NULL;
239 XRRScreenConfiguration *sc;
243 LOGFN(__FILE__, __LINE__, __FUNCTION__);
246 sc = XRRGetScreenInfo(_ecore_x_disp, root);
249 ERR("Couldn't get screen information for %d", root);
253 rates = XRRRates(_ecore_x_disp, XRRRootToScreen(_ecore_x_disp, root), size_id, &n);
254 ret = calloc(n, sizeof(Ecore_X_Screen_Refresh_Rate));
257 XRRFreeScreenConfigInfo(sc);
262 for (i = 0; i < n; i++)
264 ret[i].rate = rates[i];
266 XRRFreeScreenConfigInfo(sc);
275 ecore_x_randr_screen_refresh_rate_set(Ecore_X_Window root, Ecore_X_Screen_Size size, Ecore_X_Screen_Refresh_Rate rate)
278 XRRScreenConfiguration *sc;
279 XRRScreenSize *sizes;
280 int i, n, size_index = -1;
282 LOGFN(__FILE__, __LINE__, __FUNCTION__);
283 sizes = XRRSizes(_ecore_x_disp, XRRRootToScreen(_ecore_x_disp, root), &n);
284 for (i = 0; i < n; i++)
286 if ((sizes[i].width == size.width) && (sizes[i].height == size.height))
292 if (size_index == -1) return 0;
294 sc = XRRGetScreenInfo(_ecore_x_disp, root);
295 if (XRRSetScreenConfigAndRate(_ecore_x_disp, sc,
297 RR_Rotate_0, rate.rate, CurrentTime))
299 ERR("Can't set new screen size and refresh rate!");
300 XRRFreeScreenConfigInfo(sc);
303 XRRFreeScreenConfigInfo(sc);