2005-08-13 15:14:40 -07:00
|
|
|
/*
|
|
|
|
* vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
|
|
|
|
*/
|
|
|
|
#include "ecore_x_private.h"
|
|
|
|
|
2006-01-06 12:22:09 -08:00
|
|
|
EAPI int
|
2005-08-13 15:14:40 -07:00
|
|
|
ecore_x_randr_events_select(Ecore_X_Window win, int on)
|
|
|
|
{
|
|
|
|
#ifdef ECORE_XRANDR
|
|
|
|
if (on)
|
|
|
|
XRRSelectInput(_ecore_x_disp, win, RRScreenChangeNotifyMask);
|
|
|
|
else
|
|
|
|
XRRSelectInput(_ecore_x_disp, win, 0);
|
|
|
|
|
|
|
|
return 1;
|
|
|
|
#else
|
|
|
|
return 0;
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
2006-05-12 00:24:34 -07:00
|
|
|
EAPI Ecore_X_Randr_Rotation
|
|
|
|
ecore_x_randr_screen_rotations_get(Ecore_X_Window root)
|
|
|
|
{
|
|
|
|
Rotation rot, crot;
|
|
|
|
|
|
|
|
rot = XRRRotations(_ecore_x_disp, XRRRootToScreen(_ecore_x_disp, root), &crot);
|
|
|
|
return rot;
|
|
|
|
}
|
|
|
|
|
|
|
|
EAPI Ecore_X_Randr_Rotation
|
|
|
|
ecore_x_randr_screen_rotation_get(Ecore_X_Window root)
|
|
|
|
{
|
|
|
|
Rotation rot, crot = 0;
|
|
|
|
|
|
|
|
rot = XRRRotations(_ecore_x_disp, XRRRootToScreen(_ecore_x_disp, root), &crot);
|
|
|
|
return crot;
|
|
|
|
}
|
|
|
|
|
|
|
|
EAPI void
|
|
|
|
ecore_x_randr_screen_rotation_set(Ecore_X_Window root, Ecore_X_Randr_Rotation rot)
|
|
|
|
{
|
|
|
|
XRRScreenConfiguration *xrrcfg;
|
|
|
|
SizeID sizeid;
|
|
|
|
Rotation crot;
|
|
|
|
|
|
|
|
xrrcfg = XRRGetScreenInfo(_ecore_x_disp, root);
|
|
|
|
if (!xrrcfg) return;
|
|
|
|
sizeid = XRRConfigCurrentConfiguration(xrrcfg, &crot);
|
|
|
|
XRRSetScreenConfig(_ecore_x_disp, xrrcfg, root, sizeid, rot, CurrentTime);
|
|
|
|
XRRFreeScreenConfigInfo(xrrcfg);
|
|
|
|
}
|
|
|
|
|
2006-01-06 12:22:09 -08:00
|
|
|
EAPI Ecore_X_Screen_Size *
|
2005-08-13 15:14:40 -07:00
|
|
|
ecore_x_randr_screen_sizes_get(Ecore_X_Window root, int *num)
|
|
|
|
{
|
|
|
|
#ifdef ECORE_XRANDR
|
|
|
|
Ecore_X_Screen_Size *ret;
|
|
|
|
XRRScreenSize *sizes;
|
|
|
|
int i, n;
|
|
|
|
|
|
|
|
if (num) *num = 0;
|
|
|
|
|
|
|
|
/* we don't have to free sizes, no idea why not */
|
|
|
|
sizes = XRRSizes(_ecore_x_disp, XRRRootToScreen(_ecore_x_disp, root), &n);
|
|
|
|
ret = calloc(n, sizeof(Ecore_X_Screen_Size));
|
|
|
|
if (!ret) return NULL;
|
|
|
|
|
|
|
|
if (num) *num = n;
|
|
|
|
for (i = 0; i < n; i++)
|
|
|
|
{
|
|
|
|
ret[i].width = sizes[i].width;
|
|
|
|
ret[i].height = sizes[i].height;
|
|
|
|
}
|
|
|
|
return ret;
|
|
|
|
#else
|
|
|
|
if (num) *num = 0;
|
|
|
|
return NULL;
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
2006-01-06 12:22:09 -08:00
|
|
|
EAPI Ecore_X_Screen_Size
|
2005-08-14 03:21:08 -07:00
|
|
|
ecore_x_randr_current_screen_size_get(Ecore_X_Window root)
|
|
|
|
{
|
|
|
|
Ecore_X_Screen_Size ret = { -1, -1 };
|
|
|
|
#ifdef ECORE_XRANDR
|
|
|
|
XRRScreenSize *sizes;
|
|
|
|
XRRScreenConfiguration *sc;
|
|
|
|
SizeID size_index;
|
|
|
|
Rotation rotation;
|
|
|
|
int n;
|
|
|
|
|
|
|
|
sc = XRRGetScreenInfo(_ecore_x_disp, root);
|
|
|
|
if (!sc)
|
|
|
|
{
|
|
|
|
printf("ERROR: Couldn't get screen information for %d\n", root);
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
size_index = XRRConfigCurrentConfiguration(sc, &rotation);
|
|
|
|
|
|
|
|
sizes = XRRSizes(_ecore_x_disp, XRRRootToScreen(_ecore_x_disp, root), &n);
|
|
|
|
if (size_index < n)
|
|
|
|
{
|
|
|
|
ret.width = sizes[size_index].width;
|
|
|
|
ret.height = sizes[size_index].height;
|
|
|
|
}
|
2006-01-25 05:29:42 -08:00
|
|
|
XRRFreeScreenConfigInfo(sc);
|
2005-08-14 03:21:08 -07:00
|
|
|
#endif
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
2006-01-06 12:22:09 -08:00
|
|
|
EAPI int
|
2005-08-14 03:21:08 -07:00
|
|
|
ecore_x_randr_screen_size_set(Ecore_X_Window root, Ecore_X_Screen_Size size)
|
2005-08-13 15:14:40 -07:00
|
|
|
{
|
|
|
|
#ifdef ECORE_XRANDR
|
|
|
|
XRRScreenConfiguration *sc;
|
|
|
|
XRRScreenSize *sizes;
|
|
|
|
int i, n, size_index = -1;
|
|
|
|
|
|
|
|
sizes = XRRSizes(_ecore_x_disp, XRRRootToScreen(_ecore_x_disp, root), &n);
|
|
|
|
for (i = 0; i < n; i++)
|
|
|
|
{
|
2005-08-14 03:21:08 -07:00
|
|
|
if ((sizes[i].width == size.width) && (sizes[i].height == size.height))
|
2005-08-13 15:14:40 -07:00
|
|
|
{
|
|
|
|
size_index = i;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (size_index == -1) return 0;
|
2006-01-25 05:29:42 -08:00
|
|
|
|
2005-08-13 15:14:40 -07:00
|
|
|
sc = XRRGetScreenInfo(_ecore_x_disp, root);
|
|
|
|
if (XRRSetScreenConfig(_ecore_x_disp, sc,
|
|
|
|
root, size_index,
|
|
|
|
RR_Rotate_0, CurrentTime))
|
|
|
|
{
|
|
|
|
printf("ERROR: Can't set new screen size!\n");
|
|
|
|
XRRFreeScreenConfigInfo(sc);
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
XRRFreeScreenConfigInfo(sc);
|
|
|
|
return 1;
|
|
|
|
#else
|
|
|
|
return 0;
|
|
|
|
#endif
|
|
|
|
}
|
2006-01-25 05:29:42 -08:00
|
|
|
|
|
|
|
EAPI Ecore_X_Screen_Refresh_Rate
|
|
|
|
ecore_x_randr_current_screen_refresh_rate_get(Ecore_X_Window root)
|
|
|
|
{
|
|
|
|
Ecore_X_Screen_Refresh_Rate ret = { -1 };
|
|
|
|
#ifdef ECORE_XRANDR
|
|
|
|
XRRScreenConfiguration *sc;
|
|
|
|
|
|
|
|
sc = XRRGetScreenInfo(_ecore_x_disp, root);
|
|
|
|
if (!sc)
|
|
|
|
{
|
|
|
|
printf("ERROR: Couldn't get screen information for %d\n", root);
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
ret.rate = XRRConfigCurrentRate(sc);
|
|
|
|
XRRFreeScreenConfigInfo(sc);
|
|
|
|
#endif
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
|
|
|
EAPI Ecore_X_Screen_Refresh_Rate *
|
|
|
|
ecore_x_randr_screen_refresh_rates_get(Ecore_X_Window root, int size_id, int *num)
|
|
|
|
{
|
|
|
|
#ifdef ECORE_XRANDR
|
|
|
|
Ecore_X_Screen_Refresh_Rate *ret = NULL;
|
|
|
|
XRRScreenConfiguration *sc;
|
|
|
|
short *rates;
|
|
|
|
int i, n;
|
|
|
|
|
|
|
|
if (num) *num = 0;
|
|
|
|
|
|
|
|
sc = XRRGetScreenInfo(_ecore_x_disp, root);
|
|
|
|
if (!sc)
|
|
|
|
{
|
|
|
|
printf("ERROR: Couldn't get screen information for %d\n", root);
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
|
|
|
rates = XRRRates(_ecore_x_disp, XRRRootToScreen(_ecore_x_disp, root), size_id, &n);
|
|
|
|
ret = calloc(n, sizeof(Ecore_X_Screen_Refresh_Rate));
|
|
|
|
if (!ret)
|
|
|
|
{
|
|
|
|
XRRFreeScreenConfigInfo(sc);
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (num) *num = n;
|
|
|
|
for (i = 0; i < n; i++)
|
|
|
|
{
|
|
|
|
ret[i].rate = rates[i];
|
|
|
|
}
|
|
|
|
XRRFreeScreenConfigInfo(sc);
|
|
|
|
return ret;
|
|
|
|
#else
|
|
|
|
if (num) *num = 0;
|
|
|
|
return NULL;
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
|
|
|
EAPI int
|
2006-02-03 13:42:38 -08:00
|
|
|
ecore_x_randr_screen_refresh_rate_set(Ecore_X_Window root, Ecore_X_Screen_Size size, Ecore_X_Screen_Refresh_Rate rate)
|
2006-01-25 05:29:42 -08:00
|
|
|
{
|
|
|
|
#ifdef ECORE_XRANDR
|
|
|
|
XRRScreenConfiguration *sc;
|
|
|
|
XRRScreenSize *sizes;
|
2006-02-03 13:42:38 -08:00
|
|
|
int i, n, size_index = -1;
|
2006-01-25 05:29:42 -08:00
|
|
|
|
|
|
|
sizes = XRRSizes(_ecore_x_disp, XRRRootToScreen(_ecore_x_disp, root), &n);
|
2006-02-03 13:42:38 -08:00
|
|
|
for (i = 0; i < n; i++)
|
2006-01-25 05:29:42 -08:00
|
|
|
{
|
2006-02-03 13:42:38 -08:00
|
|
|
if ((sizes[i].width == size.width) && (sizes[i].height == size.height))
|
2006-01-25 05:29:42 -08:00
|
|
|
{
|
2006-02-03 13:42:38 -08:00
|
|
|
size_index = i;
|
|
|
|
break;
|
2006-01-25 05:29:42 -08:00
|
|
|
}
|
2006-02-03 13:42:38 -08:00
|
|
|
}
|
|
|
|
if (size_index == -1) return 0;
|
|
|
|
|
|
|
|
sc = XRRGetScreenInfo(_ecore_x_disp, root);
|
|
|
|
if (XRRSetScreenConfigAndRate(_ecore_x_disp, sc,
|
|
|
|
root, size_index,
|
|
|
|
RR_Rotate_0, rate.rate, CurrentTime))
|
|
|
|
{
|
|
|
|
printf("ERROR: Can't set new screen size and refresh rate!\n");
|
2006-01-25 05:29:42 -08:00
|
|
|
XRRFreeScreenConfigInfo(sc);
|
2006-02-03 13:42:38 -08:00
|
|
|
return 0;
|
2006-01-25 05:29:42 -08:00
|
|
|
}
|
|
|
|
XRRFreeScreenConfigInfo(sc);
|
2006-02-03 13:42:38 -08:00
|
|
|
return 1;
|
2006-01-25 05:29:42 -08:00
|
|
|
#else
|
2006-02-03 13:42:38 -08:00
|
|
|
return 1;
|
2006-01-25 05:29:42 -08:00
|
|
|
#endif
|
|
|
|
}
|