Add tracking of which window 'owns' a monitor

This commit is contained in:
Camilla Berglund 2016-02-23 12:34:35 +01:00
parent ea888114fa
commit 99c925efd8
5 changed files with 60 additions and 27 deletions

View File

@ -73,9 +73,9 @@ static float transformY(float y)
return CGDisplayBounds(CGMainDisplayID()).size.height - y; return CGDisplayBounds(CGMainDisplayID()).size.height - y;
} }
// Enter full screen mode // Make the specified window and its video mode active on its monitor
// //
static GLFWbool enterFullscreenMode(_GLFWwindow* window) static GLFWbool acquireMonitor(_GLFWwindow* window)
{ {
const GLFWbool status = _glfwSetVideoModeNS(window->monitor, &window->videoMode); const GLFWbool status = _glfwSetVideoModeNS(window->monitor, &window->videoMode);
const CGRect bounds = CGDisplayBounds(window->monitor->ns.displayID); const CGRect bounds = CGDisplayBounds(window->monitor->ns.displayID);
@ -85,14 +85,20 @@ static GLFWbool enterFullscreenMode(_GLFWwindow* window)
bounds.size.height); bounds.size.height);
[window->ns.object setFrame:frame display:YES]; [window->ns.object setFrame:frame display:YES];
_glfwPlatformFocusWindow(window); _glfwPlatformFocusWindow(window);
_glfwInputMonitorWindowChange(window->monitor, window);
return status; return status;
} }
// Leave full screen mode // Remove the window and restore the original video mode
// //
static void leaveFullscreenMode(_GLFWwindow* window) static void releaseMonitor(_GLFWwindow* window)
{ {
if (window->monitor->window != window)
return;
_glfwInputMonitorWindowChange(window->monitor, NULL);
_glfwRestoreVideoModeNS(window->monitor); _glfwRestoreVideoModeNS(window->monitor);
} }
@ -219,7 +225,7 @@ static const NSRange kEmptyRange = { NSNotFound, 0 };
- (void)windowDidMiniaturize:(NSNotification *)notification - (void)windowDidMiniaturize:(NSNotification *)notification
{ {
if (window->monitor) if (window->monitor)
leaveFullscreenMode(window); releaseMonitor(window);
_glfwInputWindowIconify(window, GLFW_TRUE); _glfwInputWindowIconify(window, GLFW_TRUE);
} }
@ -227,7 +233,7 @@ static const NSRange kEmptyRange = { NSNotFound, 0 };
- (void)windowDidDeminiaturize:(NSNotification *)notification - (void)windowDidDeminiaturize:(NSNotification *)notification
{ {
if (window->monitor) if (window->monitor)
enterFullscreenMode(window); acquireMonitor(window);
_glfwInputWindowIconify(window, GLFW_FALSE); _glfwInputWindowIconify(window, GLFW_FALSE);
} }
@ -999,7 +1005,7 @@ int _glfwPlatformCreateWindow(_GLFWwindow* window,
if (window->monitor) if (window->monitor)
{ {
_glfwPlatformShowWindow(window); _glfwPlatformShowWindow(window);
if (!enterFullscreenMode(window)) if (!acquireMonitor(window))
return GLFW_FALSE; return GLFW_FALSE;
} }
@ -1011,7 +1017,7 @@ void _glfwPlatformDestroyWindow(_GLFWwindow* window)
[window->ns.object orderOut:nil]; [window->ns.object orderOut:nil];
if (window->monitor) if (window->monitor)
leaveFullscreenMode(window); releaseMonitor(window);
if (window->context.api != GLFW_NO_API) if (window->context.api != GLFW_NO_API)
_glfwDestroyContextNSGL(window); _glfwDestroyContextNSGL(window);
@ -1070,7 +1076,7 @@ void _glfwPlatformGetWindowSize(_GLFWwindow* window, int* width, int* height)
void _glfwPlatformSetWindowSize(_GLFWwindow* window, int width, int height) void _glfwPlatformSetWindowSize(_GLFWwindow* window, int width, int height)
{ {
if (window->monitor) if (window->monitor)
enterFullscreenMode(window); acquireMonitor(window);
else else
[window->ns.object setContentSize:NSMakeSize(width, height)]; [window->ns.object setContentSize:NSMakeSize(width, height)];
} }

View File

@ -381,6 +381,9 @@ struct _GLFWmonitor
// Physical dimensions in millimeters. // Physical dimensions in millimeters.
int widthMM, heightMM; int widthMM, heightMM;
// The window whose video mode is current on this monitor
_GLFWwindow* window;
GLFWvidmode* modes; GLFWvidmode* modes;
int modeCount; int modeCount;
GLFWvidmode currentMode; GLFWvidmode currentMode;
@ -911,6 +914,10 @@ void _glfwInputCursorEnter(_GLFWwindow* window, GLFWbool entered);
*/ */
void _glfwInputMonitorChange(void); void _glfwInputMonitorChange(void);
/*! @ingroup event
*/
void _glfwInputMonitorWindowChange(_GLFWmonitor* monitor, _GLFWwindow* window);
/*! @brief Notifies shared code of an error. /*! @brief Notifies shared code of an error.
* @param[in] error The error code most suitable for the error. * @param[in] error The error code most suitable for the error.
* @param[in] format The `printf` style format string of the error * @param[in] format The `printf` style format string of the error

View File

@ -158,6 +158,11 @@ void _glfwInputMonitorChange(void)
_glfwFreeMonitors(monitors, monitorCount); _glfwFreeMonitors(monitors, monitorCount);
} }
void _glfwInputMonitorWindowChange(_GLFWmonitor* monitor, _GLFWwindow* window)
{
monitor->window = window;
}
////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////
////// GLFW internal API ////// ////// GLFW internal API //////

View File

@ -328,9 +328,9 @@ static int translateKey(WPARAM wParam, LPARAM lParam)
return _glfw.win32.publicKeys[HIWORD(lParam) & 0x1FF]; return _glfw.win32.publicKeys[HIWORD(lParam) & 0x1FF];
} }
// Enter full screen mode // Make the specified window and its video mode active on its monitor
// //
static GLFWbool enterFullscreenMode(_GLFWwindow* window) static GLFWbool acquireMonitor(_GLFWwindow* window)
{ {
GLFWvidmode mode; GLFWvidmode mode;
GLFWbool status; GLFWbool status;
@ -344,13 +344,18 @@ static GLFWbool enterFullscreenMode(_GLFWwindow* window)
SetWindowPos(window->win32.handle, HWND_TOPMOST, SetWindowPos(window->win32.handle, HWND_TOPMOST,
xpos, ypos, mode.width, mode.height, SWP_NOCOPYBITS); xpos, ypos, mode.width, mode.height, SWP_NOCOPYBITS);
_glfwInputMonitorWindowChange(window->monitor, window);
return status; return status;
} }
// Leave full screen mode // Remove the window and restore the original video mode
// //
static void leaveFullscreenMode(_GLFWwindow* window) static void releaseMonitor(_GLFWwindow* window)
{ {
if (window->monitor->window != window)
return;
_glfwInputMonitorWindowChange(window->monitor, NULL);
_glfwRestoreVideoModeWin32(window->monitor); _glfwRestoreVideoModeWin32(window->monitor);
} }
@ -597,7 +602,7 @@ static LRESULT CALLBACK windowProc(HWND hWnd, UINT uMsg,
{ {
window->win32.iconified = GLFW_TRUE; window->win32.iconified = GLFW_TRUE;
if (window->monitor) if (window->monitor)
leaveFullscreenMode(window); releaseMonitor(window);
_glfwInputWindowIconify(window, GLFW_TRUE); _glfwInputWindowIconify(window, GLFW_TRUE);
} }
@ -606,7 +611,7 @@ static LRESULT CALLBACK windowProc(HWND hWnd, UINT uMsg,
{ {
window->win32.iconified = GLFW_FALSE; window->win32.iconified = GLFW_FALSE;
if (window->monitor) if (window->monitor)
enterFullscreenMode(window); acquireMonitor(window);
_glfwInputWindowIconify(window, GLFW_FALSE); _glfwInputWindowIconify(window, GLFW_FALSE);
} }
@ -971,7 +976,7 @@ int _glfwPlatformCreateWindow(_GLFWwindow* window,
if (window->monitor) if (window->monitor)
{ {
_glfwPlatformShowWindow(window); _glfwPlatformShowWindow(window);
if (!enterFullscreenMode(window)) if (!acquireMonitor(window))
return GLFW_FALSE; return GLFW_FALSE;
} }
@ -981,7 +986,7 @@ int _glfwPlatformCreateWindow(_GLFWwindow* window,
void _glfwPlatformDestroyWindow(_GLFWwindow* window) void _glfwPlatformDestroyWindow(_GLFWwindow* window)
{ {
if (window->monitor) if (window->monitor)
leaveFullscreenMode(window); releaseMonitor(window);
if (window->context.api != GLFW_NO_API) if (window->context.api != GLFW_NO_API)
{ {
@ -1088,7 +1093,7 @@ void _glfwPlatformGetWindowSize(_GLFWwindow* window, int* width, int* height)
void _glfwPlatformSetWindowSize(_GLFWwindow* window, int width, int height) void _glfwPlatformSetWindowSize(_GLFWwindow* window, int width, int height)
{ {
if (window->monitor) if (window->monitor)
enterFullscreenMode(window); acquireMonitor(window);
else else
{ {
int fullWidth, fullHeight; int fullWidth, fullHeight;

View File

@ -711,10 +711,12 @@ static void pushSelectionToManager(_GLFWwindow* window)
} }
} }
// Enter full screen mode // Make the specified window and its video mode active on its monitor
// //
static void enterFullscreenMode(_GLFWwindow* window) static GLFWbool acquireMonitor(_GLFWwindow* window)
{ {
GLFWbool status;
if (_glfw.x11.saver.count == 0) if (_glfw.x11.saver.count == 0)
{ {
// Remember old screen saver settings // Remember old screen saver settings
@ -731,7 +733,7 @@ static void enterFullscreenMode(_GLFWwindow* window)
_glfw.x11.saver.count++; _glfw.x11.saver.count++;
_glfwSetVideoModeX11(window->monitor, &window->videoMode); status = _glfwSetVideoModeX11(window->monitor, &window->videoMode);
if (_glfw.x11.NET_WM_BYPASS_COMPOSITOR) if (_glfw.x11.NET_WM_BYPASS_COMPOSITOR)
{ {
@ -778,12 +780,19 @@ static void enterFullscreenMode(_GLFWwindow* window)
_glfw.x11.NET_WM_STATE_FULLSCREEN, _glfw.x11.NET_WM_STATE_FULLSCREEN,
0, 1, 0); 0, 1, 0);
} }
_glfwInputMonitorWindowChange(window->monitor, window);
return status;
} }
// Leave full screen mode // Remove the window and restore the original video mode
// //
static void leaveFullscreenMode(_GLFWwindow* window) static void releaseMonitor(_GLFWwindow* window)
{ {
if (window->monitor->window != window)
return;
_glfwInputMonitorWindowChange(window->monitor, NULL);
_glfwRestoreVideoModeX11(window->monitor); _glfwRestoreVideoModeX11(window->monitor);
_glfw.x11.saver.count--; _glfw.x11.saver.count--;
@ -1335,14 +1344,14 @@ static void processEvent(XEvent *event)
if (state == IconicState) if (state == IconicState)
{ {
if (window->monitor) if (window->monitor)
leaveFullscreenMode(window); releaseMonitor(window);
_glfwInputWindowIconify(window, GLFW_TRUE); _glfwInputWindowIconify(window, GLFW_TRUE);
} }
else if (state == NormalState) else if (state == NormalState)
{ {
if (window->monitor) if (window->monitor)
enterFullscreenMode(window); acquireMonitor(window);
_glfwInputWindowIconify(window, GLFW_FALSE); _glfwInputWindowIconify(window, GLFW_FALSE);
} }
@ -1450,7 +1459,8 @@ int _glfwPlatformCreateWindow(_GLFWwindow* window,
if (window->monitor) if (window->monitor)
{ {
_glfwPlatformShowWindow(window); _glfwPlatformShowWindow(window);
enterFullscreenMode(window); if (!acquireMonitor(window))
return GLFW_FALSE;
} }
return GLFW_TRUE; return GLFW_TRUE;
@ -1459,7 +1469,7 @@ int _glfwPlatformCreateWindow(_GLFWwindow* window,
void _glfwPlatformDestroyWindow(_GLFWwindow* window) void _glfwPlatformDestroyWindow(_GLFWwindow* window)
{ {
if (window->monitor) if (window->monitor)
leaveFullscreenMode(window); releaseMonitor(window);
if (window->x11.ic) if (window->x11.ic)
{ {