From dea602623d672b918e0845320de5f8304a0a1211 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Camilla=20L=C3=B6wy?= Date: Thu, 9 Jun 2022 21:31:44 +0200 Subject: [PATCH] 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 ddd087d6627d19655d78196b5836c1d090b59506) --- CONTRIBUTORS.md | 1 + README.md | 4 +++ src/wl_platform.h | 3 +-- src/wl_window.c | 62 ++++++++++++++++++++++++++++------------------- 4 files changed, 43 insertions(+), 27 deletions(-) diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md index bd16bbd3..b39b44b8 100644 --- a/CONTRIBUTORS.md +++ b/CONTRIBUTORS.md @@ -156,6 +156,7 @@ video tutorials. - Christopher Pelloux - Arturo J. PĂ©rez - Vladimir Perminov + - Olivier Perret - Anthony Pesch - Orson Peters - Emmanuel Gil Peyrot diff --git a/README.md b/README.md index 9212eeac..c1b9b2c4 100644 --- a/README.md +++ b/README.md @@ -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 diff --git a/src/wl_platform.h b/src/wl_platform.h index c4e2db2d..618b9dbb 100644 --- a/src/wl_platform.h +++ b/src/wl_platform.h @@ -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; diff --git a/src/wl_window.c b/src/wl_window.c index 139ab4b9..b35b7319 100644 --- a/src/wl_window.c +++ b/src/wl_window.c @@ -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 (window->wl.activated && !activated) { - if (!activated || !fullscreen) - { + 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)