4c7353d4a9a3a9cf4c058f234ff32e698db188dd
[framework/uifw/ecore.git] / src / lib / ecore_x / xlib / ecore_x_xinerama.c
1 /*
2  * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
3  */
4 /*
5  * Xinerama code
6  */
7 #include "Ecore.h"
8 #include "ecore_x_private.h"
9 #include "Ecore_X.h"
10 #include "Ecore_X_Atoms.h"
11
12 #ifdef ECORE_XINERAMA
13 static XineramaScreenInfo *_xin_info = NULL;
14 static int _xin_scr_num = 0;
15 #endif
16
17 EAPI int
18 ecore_x_xinerama_screen_count_get(void)
19 {
20 #ifdef ECORE_XINERAMA
21    int event_base, error_base;
22
23    if (_xin_info) XFree(_xin_info);
24    _xin_info = NULL;
25    if (XineramaQueryExtension(_ecore_x_disp, &event_base, &error_base))
26      {
27         _xin_info = XineramaQueryScreens(_ecore_x_disp, &_xin_scr_num);
28         if (_xin_info) return _xin_scr_num;
29      }
30 #endif
31    return 0;
32 }
33
34 EAPI int
35 ecore_x_xinerama_screen_geometry_get(int screen, int *x, int *y, int *w, int *h)
36 {
37 #ifdef ECORE_XINERAMA
38    if (_xin_info)
39      {
40         int i;
41         
42         for (i = 0; i < _xin_scr_num; i++)
43           {
44              if (_xin_info[i].screen_number == screen)
45                {
46                   if (x) *x = _xin_info[i].x_org;
47                   if (y) *y = _xin_info[i].y_org;
48                   if (w) *w = _xin_info[i].width;
49                   if (h) *h = _xin_info[i].height;
50                   return 1;
51                }
52           }
53      }
54 #endif
55    if (x) *x = 0;
56    if (y) *y = 0;
57    if (w) *w = DisplayWidth(_ecore_x_disp, 0);
58    if (h) *h = DisplayHeight(_ecore_x_disp, 0);
59    return 0;
60 }