RandR and fallback path fixes.

This commit is contained in:
Camilla Berglund 2013-01-12 18:10:18 +01:00
parent be8856af65
commit 747b6d8805
2 changed files with 40 additions and 25 deletions

View File

@ -492,7 +492,7 @@ static GLboolean initDisplay(void)
_glfw.x11.vidmode.available = GL_FALSE; _glfw.x11.vidmode.available = GL_FALSE;
#endif /*_GLFW_HAS_XF86VIDMODE*/ #endif /*_GLFW_HAS_XF86VIDMODE*/
// Check for XRandR extension // Check for RandR extension
#ifdef _GLFW_HAS_XRANDR #ifdef _GLFW_HAS_XRANDR
_glfw.x11.randr.available = _glfw.x11.randr.available =
XRRQueryExtension(_glfw.x11.display, XRRQueryExtension(_glfw.x11.display,
@ -509,6 +509,13 @@ static GLboolean initDisplay(void)
"X11: Failed to query RandR version"); "X11: Failed to query RandR version");
return GL_FALSE; return GL_FALSE;
} }
// The GLFW RandR path requires at least version 1.3
if (_glfw.x11.randr.versionMajor == 1 &&
_glfw.x11.randr.versionMinor < 3)
{
_glfw.x11.randr.available = GL_FALSE;
}
} }
#else #else
_glfw.x11.randr.available = GL_FALSE; _glfw.x11.randr.available = GL_FALSE;

View File

@ -192,11 +192,12 @@ void _glfwRestoreVideoMode(_GLFWmonitor* monitor)
// Return a list of available monitors // Return a list of available monitors
//======================================================================== //========================================================================
_GLFWmonitor** _glfwPlatformGetMonitors(int* count) _GLFWmonitor** _glfwPlatformGetMonitors(int* found)
{ {
int found = 0;
_GLFWmonitor** monitors = NULL; _GLFWmonitor** monitors = NULL;
*found = 0;
if (_glfw.x11.randr.available) if (_glfw.x11.randr.available)
{ {
#if defined (_GLFW_HAS_XRANDR) #if defined (_GLFW_HAS_XRANDR)
@ -221,7 +222,6 @@ _GLFWmonitor** _glfwPlatformGetMonitors(int* count)
{ {
XRROutputInfo* oi; XRROutputInfo* oi;
XRRCrtcInfo* ci; XRRCrtcInfo* ci;
int widthMM, heightMM;
oi = XRRGetOutputInfo(_glfw.x11.display, sr, sr->outputs[i]); oi = XRRGetOutputInfo(_glfw.x11.display, sr, sr->outputs[i]);
if (oi->connection != RR_Connected) if (oi->connection != RR_Connected)
@ -230,40 +230,49 @@ _GLFWmonitor** _glfwPlatformGetMonitors(int* count)
continue; continue;
} }
if (oi->mm_width && oi->mm_height)
{
widthMM = oi->mm_width;
heightMM = oi->mm_height;
}
else
{
widthMM = DisplayWidthMM(_glfw.x11.display, _glfw.x11.screen);
heightMM = DisplayHeightMM(_glfw.x11.display, _glfw.x11.screen);
}
ci = XRRGetCrtcInfo(_glfw.x11.display, sr, oi->crtc); ci = XRRGetCrtcInfo(_glfw.x11.display, sr, oi->crtc);
monitors[found] = _glfwCreateMonitor(oi->name, monitors[*found] = _glfwCreateMonitor(oi->name,
sr->outputs[i] == primary, sr->outputs[i] == primary,
widthMM, heightMM, oi->mm_width, oi->mm_height,
ci->x, ci->y); ci->x, ci->y);
XRRFreeCrtcInfo(ci); XRRFreeCrtcInfo(ci);
if (!monitors[found]) if (!monitors[*found])
{ {
// TODO: wat // TODO: wat
return NULL; return NULL;
} }
// This is retained until the monitor object is destroyed // This is retained until the monitor object is destroyed
monitors[found]->x11.output = oi; monitors[*found]->x11.output = oi;
found++; (*found)++;
} }
#endif /*_GLFW_HAS_XRANDR*/ #endif /*_GLFW_HAS_XRANDR*/
} }
else
{
int widthMM, heightMM;
monitors = (_GLFWmonitor**) calloc(1, sizeof(_GLFWmonitor*));
if (!monitors)
{
_glfwInputError(GLFW_OUT_OF_MEMORY, NULL);
return NULL;
}
widthMM = DisplayWidthMM(_glfw.x11.display, _glfw.x11.screen);
heightMM = DisplayHeightMM(_glfw.x11.display, _glfw.x11.screen);
monitors[0] = _glfwCreateMonitor("Display",
GL_TRUE,
widthMM, heightMM,
0, 0);
*found = 1;
}
*count = found;
return monitors; return monitors;
} }
@ -356,8 +365,7 @@ GLFWvidmode* _glfwPlatformGetVideoModes(_GLFWmonitor* monitor, int* found)
XRRFreeScreenResources(sr); XRRFreeScreenResources(sr);
#endif /*_GLFW_HAS_XRANDR*/ #endif /*_GLFW_HAS_XRANDR*/
} }
else
if (result == NULL)
{ {
*found = 1; *found = 1;