From 7b3783abe2c25f9d7334a3ba9b8cd3f38bf7ae6e Mon Sep 17 00:00:00 2001 From: Camilla Berglund Date: Wed, 20 Feb 2013 16:00:53 +0100 Subject: [PATCH] Made glfwGetMonitorPos immediate. --- src/cocoa_monitor.m | 14 +++++++++++--- src/internal.h | 11 ++++++----- src/monitor.c | 11 ++--------- src/win32_monitor.c | 30 ++++++++++++++++++------------ src/win32_window.c | 11 +++++------ src/x11_monitor.c | 41 +++++++++++++++++++++++++++++++++-------- src/x11_window.c | 3 +-- 7 files changed, 76 insertions(+), 45 deletions(-) diff --git a/src/cocoa_monitor.m b/src/cocoa_monitor.m index cc8c7150..68b9051b 100644 --- a/src/cocoa_monitor.m +++ b/src/cocoa_monitor.m @@ -231,11 +231,9 @@ _GLFWmonitor** _glfwPlatformGetMonitors(int* count) for (i = 0; i < monitorCount; i++) { const CGSize size = CGDisplayScreenSize(displays[i]); - const CGRect bounds = CGDisplayBounds(displays[i]); monitors[found] = _glfwCreateMonitor(getDisplayName(displays[i]), - size.width, size.height, - bounds.origin.x, bounds.origin.y); + size.width, size.height); monitors[found]->ns.displayID = displays[i]; found++; @@ -258,6 +256,16 @@ _GLFWmonitor** _glfwPlatformGetMonitors(int* count) return monitors; } +void _glfwPlatformGetMonitorPos(_GLFWmonitor* monitor, int* xpos, int* ypos) +{ + const CGRect bounds = CGDisplayBounds(monitor->ns.displayID); + + if (xpos) + *xpos = (int) bounds.origin.x; + if (ypos) + *ypos = (int) bounds.origin.y; +} + GLFWvidmode* _glfwPlatformGetVideoModes(_GLFWmonitor* monitor, int* found) { CFArrayRef modes; diff --git a/src/internal.h b/src/internal.h index bce6c55c..1966bbc8 100644 --- a/src/internal.h +++ b/src/internal.h @@ -273,8 +273,6 @@ struct _GLFWmonitor // Physical dimensions in millimeters. int widthMM, heightMM; - // Logical orientation of the screen on the desktop - int positionX, positionY; GLFWvidmode* modes; int modeCount; @@ -363,6 +361,11 @@ void _glfwPlatformSetCursorMode(_GLFWwindow* window, int mode); */ _GLFWmonitor** _glfwPlatformGetMonitors(int* count); +/*! @copydoc glfwGetMonitorPos + * @ingroup platform + */ +void _glfwPlatformGetMonitorPos(_GLFWmonitor* monitor, int* xpos, int* ypos); + /*! @copydoc glfwGetVideoModes * @ingroup platform */ @@ -693,9 +696,7 @@ GLboolean _glfwIsValidContext(_GLFWwndconfig* wndconfig); /*! @ingroup utility */ -_GLFWmonitor* _glfwCreateMonitor(const char* name, - int widthMM, int heightMM, - int x, int y); +_GLFWmonitor* _glfwCreateMonitor(const char* name, int widthMM, int heightMM); /*! @ingroup utility */ diff --git a/src/monitor.c b/src/monitor.c index 24508ea3..18da1d2a 100644 --- a/src/monitor.c +++ b/src/monitor.c @@ -155,9 +155,7 @@ void _glfwInputMonitorChange(void) ////// GLFW internal API ////// ////////////////////////////////////////////////////////////////////////// -_GLFWmonitor* _glfwCreateMonitor(const char* name, - int widthMM, int heightMM, - int x, int y) +_GLFWmonitor* _glfwCreateMonitor(const char* name, int widthMM, int heightMM) { _GLFWmonitor* monitor = (_GLFWmonitor*) calloc(1, sizeof(_GLFWmonitor)); if (!monitor) @@ -169,8 +167,6 @@ _GLFWmonitor* _glfwCreateMonitor(const char* name, monitor->name = strdup(name); monitor->widthMM = widthMM; monitor->heightMM = heightMM; - monitor->positionX = x; - monitor->positionY = y; return monitor; } @@ -281,10 +277,7 @@ GLFWAPI void glfwGetMonitorPos(GLFWmonitor* handle, int* xpos, int* ypos) _GLFW_REQUIRE_INIT(); - if (xpos) - *xpos = monitor->positionX; - if (ypos) - *ypos = monitor->positionY; + _glfwPlatformGetMonitorPos(monitor, xpos, ypos); } GLFWAPI void glfwGetMonitorPhysicalSize(GLFWmonitor* handle, int* width, int* height) diff --git a/src/win32_monitor.c b/src/win32_monitor.c index 164907de..3e4e83b1 100644 --- a/src/win32_monitor.c +++ b/src/win32_monitor.c @@ -109,7 +109,6 @@ _GLFWmonitor** _glfwPlatformGetMonitors(int* count) // Enumerate display adapters DISPLAY_DEVICE adapter, display; - DEVMODE settings; char* name; HDC dc; @@ -127,14 +126,6 @@ _GLFWmonitor** _glfwPlatformGetMonitors(int* count) continue; } - ZeroMemory(&settings, sizeof(DEVMODE)); - settings.dmSize = sizeof(DEVMODE); - - EnumDisplaySettingsEx(adapter.DeviceName, - ENUM_CURRENT_SETTINGS, - &settings, - EDS_ROTATEDMODE); - if (found == size) { if (size) @@ -168,9 +159,7 @@ _GLFWmonitor** _glfwPlatformGetMonitors(int* count) monitors[found] = _glfwCreateMonitor(name, GetDeviceCaps(dc, HORZSIZE), - GetDeviceCaps(dc, VERTSIZE), - settings.dmPosition.x, - settings.dmPosition.y); + GetDeviceCaps(dc, VERTSIZE)); free(name); DeleteDC(dc); @@ -196,6 +185,23 @@ _GLFWmonitor** _glfwPlatformGetMonitors(int* count) return monitors; } +void _glfwPlatformGetMonitorPos(_GLFWmonitor* monitor, int* xpos, int* ypos) +{ + DEVMODE settings; + ZeroMemory(&settings, sizeof(DEVMODE)); + settings.dmSize = sizeof(DEVMODE); + + EnumDisplaySettingsEx(monitor->win32.name, + ENUM_CURRENT_SETTINGS, + &settings, + EDS_ROTATEDMODE); + + if (xpos) + *xpos = settings.dmPosition.x; + if (ypos) + *ypos = settings.dmPosition.y; +} + GLFWvidmode* _glfwPlatformGetVideoModes(_GLFWmonitor* monitor, int* found) { int modeIndex = 0, count = 0; diff --git a/src/win32_window.c b/src/win32_window.c index 28132ff4..dab8dd20 100644 --- a/src/win32_window.c +++ b/src/win32_window.c @@ -691,7 +691,7 @@ static int createWindow(_GLFWwindow* window, const _GLFWwndconfig* wndconfig, const _GLFWfbconfig* fbconfig) { - int positionX, positionY, fullWidth, fullHeight; + int xpos, ypos, fullWidth, fullHeight; POINT cursorPos; WCHAR* wideTitle; @@ -702,8 +702,7 @@ static int createWindow(_GLFWwindow* window, { window->win32.dwStyle |= WS_POPUP; - positionX = wndconfig->monitor->positionX; - positionY = wndconfig->monitor->positionY; + _glfwPlatformGetMonitorPos(wndconfig->monitor, &xpos, &ypos); fullWidth = wndconfig->width; fullHeight = wndconfig->height; @@ -719,8 +718,8 @@ static int createWindow(_GLFWwindow* window, window->win32.dwExStyle |= WS_EX_WINDOWEDGE; } - positionX = CW_USEDEFAULT; - positionY = CW_USEDEFAULT; + xpos = CW_USEDEFAULT; + ypos = CW_USEDEFAULT; getFullWindowSize(window, wndconfig->width, wndconfig->height, @@ -739,7 +738,7 @@ static int createWindow(_GLFWwindow* window, _GLFW_WNDCLASSNAME, wideTitle, window->win32.dwStyle, - positionX, positionY, + xpos, ypos, fullWidth, fullHeight, NULL, // No parent window NULL, // No window menu diff --git a/src/x11_monitor.c b/src/x11_monitor.c index d53dd875..05f4583f 100644 --- a/src/x11_monitor.c +++ b/src/x11_monitor.c @@ -193,8 +193,7 @@ _GLFWmonitor** _glfwPlatformGetMonitors(int* found) } monitors[*found] = _glfwCreateMonitor(oi->name, - oi->mm_width, oi->mm_height, - ci->x, ci->y); + oi->mm_width, oi->mm_height); monitors[*found]->x11.output = output; monitors[*found]->x11.crtc = oi->crtc; @@ -220,8 +219,6 @@ _GLFWmonitor** _glfwPlatformGetMonitors(int* found) } else { - int widthMM, heightMM; - monitors = (_GLFWmonitor**) calloc(1, sizeof(_GLFWmonitor*)); if (!monitors) { @@ -229,16 +226,44 @@ _GLFWmonitor** _glfwPlatformGetMonitors(int* found) return NULL; } - widthMM = DisplayWidthMM(_glfw.x11.display, _glfw.x11.screen); - heightMM = DisplayHeightMM(_glfw.x11.display, _glfw.x11.screen); - - monitors[0] = _glfwCreateMonitor("Display", widthMM, heightMM, 0, 0); + monitors[0] = _glfwCreateMonitor("Display", + DisplayWidthMM(_glfw.x11.display, + _glfw.x11.screen), + DisplayHeightMM(_glfw.x11.display, + _glfw.x11.screen)); *found = 1; } return monitors; } +void _glfwPlatformGetMonitorPos(_GLFWmonitor* monitor, int* xpos, int* ypos) +{ + if (_glfw.x11.randr.available) + { + XRRScreenResources* sr; + XRRCrtcInfo* ci; + + sr = XRRGetScreenResources(_glfw.x11.display, _glfw.x11.root); + ci = XRRGetCrtcInfo(_glfw.x11.display, sr, monitor->x11.crtc); + + if (xpos) + *xpos = ci->x; + if (ypos) + *ypos = ci->y; + + XRRFreeCrtcInfo(ci); + XRRFreeScreenResources(sr); + } + else + { + if (xpos) + *xpos = 0; + if (ypos) + *ypos = 0; + } +} + GLFWvidmode* _glfwPlatformGetVideoModes(_GLFWmonitor* monitor, int* found) { GLFWvidmode* result; diff --git a/src/x11_window.c b/src/x11_window.c index 43cd4be3..f58cd66f 100644 --- a/src/x11_window.c +++ b/src/x11_window.c @@ -199,8 +199,7 @@ static GLboolean createWindow(_GLFWwindow* window, if (wndconfig->monitor) { hints->flags |= PPosition; - hints->x = wndconfig->monitor->positionX; - hints->y = wndconfig->monitor->positionY; + _glfwPlatformGetMonitorPos(wndconfig->monitor, &hints->x, &hints->y); } if (!wndconfig->resizable)