mirror of
				https://github.com/glfw/glfw.git
				synced 2025-10-31 04:32:26 +00: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