mirror of
				https://github.com/glfw/glfw.git
				synced 2025-10-31 12:42:26 +00:00 
			
		
		
		
	Wayland: Fix behavior of leaving full screen mode
These changes make GLFW fullscreen more consistent, but unfortunately
also make GLFW even more oblivious to user-initiated XDG shell
fullscreen changes.
Fixes #1995
(cherry picked from commit ddd087d662)
			
			
This commit is contained in:
		
							parent
							
								
									581fed38be
								
							
						
					
					
						commit
						dea602623d
					
				| @ -156,6 +156,7 @@ video tutorials. | ||||
|  - Christopher Pelloux | ||||
|  - Arturo J. Pérez | ||||
|  - Vladimir Perminov | ||||
|  - Olivier Perret | ||||
|  - Anthony Pesch | ||||
|  - Orson Peters | ||||
|  - Emmanuel Gil Peyrot | ||||
|  | ||||
| @ -150,6 +150,10 @@ information on what to include when reporting a bug. | ||||
|  - [Wayland] Bugfix: The OSMesa library was not unloaded on termination | ||||
|  - [Wayland] Bugfix: `glfwCreateWindow` could emit `GLFW_PLATFORM_ERROR` | ||||
|  - [Wayland] Bugfix: Lock key modifier bits were only set when lock keys were pressed | ||||
|  - [Wayland] Bugfix: A window leaving full screen mode would be iconified (#1995) | ||||
|  - [Wayland] Bugfix: A window leaving full screen mode ignored its desired size | ||||
|  - [Wayland] Bugfix: `glfwSetWindowMonitor` did not update windowed mode size | ||||
|  - [Wayland] Bugfix: `glfwRestoreWindow` would make a full screen window windowed | ||||
| 
 | ||||
| 
 | ||||
| ## Contact | ||||
|  | ||||
| @ -181,6 +181,7 @@ typedef struct _GLFWwindowWayland | ||||
|     int                         width, height; | ||||
|     GLFWbool                    visible; | ||||
|     GLFWbool                    maximized; | ||||
|     GLFWbool                    activated; | ||||
|     GLFWbool                    hovered; | ||||
|     GLFWbool                    transparent; | ||||
|     struct wl_surface*          surface; | ||||
| @ -212,8 +213,6 @@ typedef struct _GLFWwindowWayland | ||||
| 
 | ||||
|     struct zwp_idle_inhibitor_v1*          idleInhibitor; | ||||
| 
 | ||||
|     GLFWbool                    wasFullscreen; | ||||
| 
 | ||||
|     struct { | ||||
|         GLFWbool                           serverSide; | ||||
|         struct wl_buffer*                  buffer; | ||||
|  | ||||
| @ -471,21 +471,35 @@ static void setIdleInhibitor(_GLFWwindow* window, GLFWbool enable) | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| static void setFullscreen(_GLFWwindow* window, _GLFWmonitor* monitor, | ||||
|                           int refreshRate) | ||||
| // Make the specified window and its video mode active on its monitor
 | ||||
| //
 | ||||
| static void acquireMonitor(_GLFWwindow* window) | ||||
| { | ||||
|     if (window->wl.xdg.toplevel) | ||||
|     { | ||||
|         xdg_toplevel_set_fullscreen( | ||||
|             window->wl.xdg.toplevel, | ||||
|             monitor->wl.output); | ||||
|         xdg_toplevel_set_fullscreen(window->wl.xdg.toplevel, | ||||
|                                     window->monitor->wl.output); | ||||
|     } | ||||
| 
 | ||||
|     setIdleInhibitor(window, GLFW_TRUE); | ||||
| 
 | ||||
|     if (!window->wl.decorations.serverSide) | ||||
|         destroyDecorations(window); | ||||
| } | ||||
| 
 | ||||
| // Remove the window and restore the original video mode
 | ||||
| //
 | ||||
| static void releaseMonitor(_GLFWwindow* window) | ||||
| { | ||||
|     if (window->wl.xdg.toplevel) | ||||
|         xdg_toplevel_unset_fullscreen(window->wl.xdg.toplevel); | ||||
| 
 | ||||
|     setIdleInhibitor(window, GLFW_FALSE); | ||||
| 
 | ||||
|     if (!_glfw.wl.decorationManager) | ||||
|         createDecorations(window); | ||||
| } | ||||
| 
 | ||||
| static void xdgToplevelHandleConfigure(void* userData, | ||||
|                                        struct xdg_toplevel* toplevel, | ||||
|                                        int32_t width, | ||||
| @ -538,16 +552,13 @@ static void xdgToplevelHandleConfigure(void* userData, | ||||
|         _glfwInputWindowDamage(window); | ||||
|     } | ||||
| 
 | ||||
|     if (window->wl.wasFullscreen && window->autoIconify) | ||||
|     { | ||||
|         if (!activated || !fullscreen) | ||||
|     if (window->wl.activated && !activated) | ||||
|     { | ||||
|         if (window->monitor && window->autoIconify) | ||||
|             _glfwPlatformIconifyWindow(window); | ||||
|             window->wl.wasFullscreen = GLFW_FALSE; | ||||
|     } | ||||
|     } | ||||
|     if (fullscreen && activated) | ||||
|         window->wl.wasFullscreen = GLFW_TRUE; | ||||
| 
 | ||||
|     window->wl.activated = activated; | ||||
| } | ||||
| 
 | ||||
| static void xdgToplevelHandleClose(void* userData, | ||||
| @ -1960,15 +1971,12 @@ void _glfwPlatformRestoreWindow(_GLFWwindow* window) | ||||
| { | ||||
|     if (window->wl.xdg.toplevel) | ||||
|     { | ||||
|         if (window->monitor) | ||||
|             xdg_toplevel_unset_fullscreen(window->wl.xdg.toplevel); | ||||
|         if (window->wl.maximized) | ||||
|             xdg_toplevel_unset_maximized(window->wl.xdg.toplevel); | ||||
|         // There is no way to unset minimized, or even to know if we are
 | ||||
|         // minimized, so there is nothing to do here.
 | ||||
|     } | ||||
| 
 | ||||
|     _glfwInputWindowMonitor(window, NULL); | ||||
|     window->wl.maximized = GLFW_FALSE; | ||||
| } | ||||
| 
 | ||||
| @ -2025,19 +2033,23 @@ void _glfwPlatformSetWindowMonitor(_GLFWwindow* window, | ||||
|                                    int width, int height, | ||||
|                                    int refreshRate) | ||||
| { | ||||
|     if (monitor) | ||||
|     if (window->monitor == monitor) | ||||
|     { | ||||
|         setFullscreen(window, monitor, refreshRate); | ||||
|     } | ||||
|     else | ||||
|     { | ||||
|         if (window->wl.xdg.toplevel) | ||||
|             xdg_toplevel_unset_fullscreen(window->wl.xdg.toplevel); | ||||
|         setIdleInhibitor(window, GLFW_FALSE); | ||||
|         if (!_glfw.wl.decorationManager) | ||||
|             createDecorations(window); | ||||
|         if (!monitor) | ||||
|             _glfwPlatformSetWindowSize(window, width, height); | ||||
| 
 | ||||
|         return; | ||||
|     } | ||||
| 
 | ||||
|     if (window->monitor) | ||||
|         releaseMonitor(window); | ||||
| 
 | ||||
|     _glfwInputWindowMonitor(window, monitor); | ||||
| 
 | ||||
|     if (window->monitor) | ||||
|         acquireMonitor(window); | ||||
|     else | ||||
|         _glfwPlatformSetWindowSize(window, width, height); | ||||
| } | ||||
| 
 | ||||
| int _glfwPlatformWindowFocused(_GLFWwindow* window) | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user