mirror of
https://github.com/gwm17/glfw.git
synced 2024-11-23 02:38:52 -05:00
Add tracking of which window 'owns' a monitor
This commit is contained in:
parent
ea888114fa
commit
99c925efd8
|
@ -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)];
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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 //////
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue
Block a user