|
@@ -35,6 +35,104 @@
|
|
|
#include <string.h>
|
|
|
|
|
|
|
|
|
+//------------------------------------------------------------------------
|
|
|
+// 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;
|
|
|
|