From b03e62f6ace5ab1d2e2d6bb9c6085288044aa8c2 Mon Sep 17 00:00:00 2001 From: Camilla Berglund Date: Thu, 2 Aug 2012 18:54:10 +0200 Subject: [PATCH] Made X11 resolution enumeration a separate function. --- src/x11_fullscreen.c | 180 ++++++++++++++++++++++++------------------- 1 file changed, 100 insertions(+), 80 deletions(-) diff --git a/src/x11_fullscreen.c b/src/x11_fullscreen.c index 34beae6a..8c4138d3 100644 --- a/src/x11_fullscreen.c +++ b/src/x11_fullscreen.c @@ -35,6 +35,104 @@ #include +//------------------------------------------------------------------------ +// Display resolution +//------------------------------------------------------------------------ + +typedef struct +{ + int width; + int height; +} _GLFWvidsize; + + +//======================================================================== +// List available resolutions +//======================================================================== + +static _GLFWvidsize* getResolutions(int* found) +{ + int i, j; + _GLFWvidsize* result = NULL; + + *found = 0; + + // Build array of available resolutions + + if (_glfwLibrary.X11.RandR.available) + { +#if defined(_GLFW_HAS_XRANDR) + XRRScreenConfiguration* sc; + XRRScreenSize* sizes; + + sc = XRRGetScreenInfo(_glfwLibrary.X11.display, _glfwLibrary.X11.root); + sizes = XRRConfigSizes(sc, found); + + result = (_GLFWvidsize*) malloc(sizeof(_GLFWvidsize) * *found); + + for (i = 0; i < *found; i++) + { + result[i].width = sizes[i].width; + result[i].height = sizes[i].height; + } + + XRRFreeScreenConfigInfo(sc); +#endif /*_GLFW_HAS_XRANDR*/ + } + else if (_glfwLibrary.X11.VidMode.available) + { +#if defined(_GLFW_HAS_XF86VIDMODE) + XF86VidModeModeInfo** modes; + int modeCount; + + XF86VidModeGetAllModeLines(_glfwLibrary.X11.display, + _glfwLibrary.X11.screen, + &modeCount, &modes); + + result = (_GLFWvidsize*) malloc(sizeof(_GLFWvidsize) * modeCount); + + for (i = 0; i < modeCount; i++) + { + _GLFWvidsize size; + size.width = modes[i]->hdisplay; + size.height = modes[i]->vdisplay; + + for (j = 0; j < *found; j++) + { + if (memcmp(result + j, &size, sizeof(_GLFWvidsize)) == 0) + break; + } + + if (j < *found) + { + // This size is a duplicate, so skip it + continue; + } + + result[*found] = size; + (*found)++; + } + + XFree(modes); +#endif /*_GLFW_HAS_XF86VIDMODE*/ + } + + if (result == NULL) + { + *found = 1; + result = (_GLFWvidsize*) malloc(sizeof(_GLFWvidsize)); + + result[0].width = DisplayWidth(_glfwLibrary.X11.display, + _glfwLibrary.X11.screen); + result[0].height = DisplayHeight(_glfwLibrary.X11.display, + _glfwLibrary.X11.screen); + } + + return result; +} + + + ////////////////////////////////////////////////////////////////////////// ////// GLFW internal API ////// ////////////////////////////////////////////////////////////////////////// @@ -326,12 +424,6 @@ void _glfwRestoreVideoMode(void) ////// GLFW platform API ////// ////////////////////////////////////////////////////////////////////////// -typedef struct -{ - int width; - int height; -} _GLFWvidsize; - //======================================================================== // List available video modes @@ -394,82 +486,10 @@ GLFWvidmode* _glfwPlatformGetVideoModes(int* found) XFree(visuals); - sizeCount = 0; - sizes = NULL; - - // Build array of available resolutions - - if (_glfwLibrary.X11.RandR.available) - { -#if defined(_GLFW_HAS_XRANDR) - XRRScreenConfiguration* sc; - XRRScreenSize* rrSizes; - - sc = XRRGetScreenInfo(_glfwLibrary.X11.display, _glfwLibrary.X11.root); - rrSizes = XRRConfigSizes(sc, &sizeCount); - - sizes = (_GLFWvidsize*) malloc(sizeof(_GLFWvidsize) * sizeCount); - - for (i = 0; i < sizeCount; i++) - { - sizes[i].width = rrSizes[i].width; - sizes[i].height = rrSizes[i].height; - } - - XRRFreeScreenConfigInfo(sc); -#endif /*_GLFW_HAS_XRANDR*/ - } - else if (_glfwLibrary.X11.VidMode.available) - { -#if defined(_GLFW_HAS_XF86VIDMODE) - XF86VidModeModeInfo** modes; - int modeCount; - - XF86VidModeGetAllModeLines(_glfwLibrary.X11.display, - _glfwLibrary.X11.screen, - &modeCount, &modes); - - sizes = (_GLFWvidsize*) malloc(sizeof(_GLFWvidsize) * modeCount); - - for (i = 0; i < modeCount; i++) - { - _GLFWvidsize size; - size.width = modes[i]->hdisplay; - size.height = modes[i]->vdisplay; - - for (j = 0; j < sizeCount; j++) - { - if (memcmp(sizes + j, &size, sizeof(_GLFWvidsize)) == 0) - break; - } - - if (j < sizeCount) - { - // This size is a duplicate, so skip it - continue; - } - - sizes[sizeCount] = size; - sizeCount++; - } - - XFree(modes); -#endif /*_GLFW_HAS_XF86VIDMODE*/ - } - - if (!sizeCount) - { - sizeCount = 1; - sizes = (_GLFWvidsize*) malloc(sizeof(_GLFWvidsize)); - - sizes[0].width = DisplayWidth(_glfwLibrary.X11.display, - _glfwLibrary.X11.screen); - sizes[0].height = DisplayHeight(_glfwLibrary.X11.display, - _glfwLibrary.X11.screen); - } - // Build all permutations of channel depths and resolutions + sizes = getResolutions(&sizeCount); + result = (GLFWvidmode*) malloc(sizeof(GLFWvidmode) * rgbCount * sizeCount); *found = 0;