From 7e78f30739908b88a9530b4709fa587c7318530a Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Mon, 5 Apr 2021 13:47:50 +0530 Subject: [PATCH] Wayland: Fix un-maximizing a window not restoring its size to what it was before being maximized --- docs/changelog.rst | 3 +++ glfw/wl_platform.h | 4 ++++ glfw/wl_window.c | 15 +++++++++++++-- 3 files changed, 20 insertions(+), 2 deletions(-) diff --git a/docs/changelog.rst b/docs/changelog.rst index 3fa92b234..b46de6420 100644 --- a/docs/changelog.rst +++ b/docs/changelog.rst @@ -151,6 +151,9 @@ To update |kitty|, :doc:`follow the instructions `. - Wayland: Fix mouse handling when using client side decorations +- Wayland: Fix un-maximizing a window not restoring its size to what it was + before being maximized + - GNOME/Wayland: Improve window decorations the titlebar now shows the window title (:iss:`3284`) diff --git a/glfw/wl_platform.h b/glfw/wl_platform.h index 4b9201406..1a6e9c44e 100644 --- a/glfw/wl_platform.h +++ b/glfw/wl_platform.h @@ -185,6 +185,10 @@ typedef struct _GLFWwindowWayland struct wl_callback *current_wl_callback; } frameCallbackData; + struct { + int32_t width, height; + } size_before_maximize; + } _GLFWwindowWayland; typedef enum _GLFWWaylandOfferType diff --git a/glfw/wl_window.c b/glfw/wl_window.c index e0d2bd30e..a1ffeb22b 100644 --- a/glfw/wl_window.c +++ b/glfw/wl_window.c @@ -425,6 +425,18 @@ static void xdgToplevelHandleConfigure(void* data, break; } } + bool window_maximized = !window->wl.maximized && maximized; + bool window_unmaximized = window->wl.maximized && !maximized; + if (window_maximized) { + window->wl.size_before_maximize.width = window->wl.width; + window->wl.size_before_maximize.height = window->wl.height; + } else if (window_unmaximized && window->wl.size_before_maximize.width > 0 && window->wl.size_before_maximize.height > 0) { + width = window->wl.size_before_maximize.width; + height = window->wl.size_before_maximize.height; + window->wl.size_before_maximize.width = 0; + window->wl.size_before_maximize.height = 0; + } + window->wl.maximized = maximized; if (width != 0 && height != 0) { @@ -538,6 +550,7 @@ static bool createXdgSurface(_GLFWwindow* window) } else if (window->wl.maximized) { + window->wl.maximized = false; xdg_toplevel_set_maximized(window->wl.xdg.toplevel); setIdleInhibitor(window, false); setXdgDecorations(window); @@ -950,7 +963,6 @@ void _glfwPlatformRestoreWindow(_GLFWwindow* window) // minimized, so there is nothing to do in this case. } _glfwInputWindowMonitor(window, NULL); - window->wl.maximized = false; } void _glfwPlatformMaximizeWindow(_GLFWwindow* window) @@ -959,7 +971,6 @@ void _glfwPlatformMaximizeWindow(_GLFWwindow* window) { xdg_toplevel_set_maximized(window->wl.xdg.toplevel); } - window->wl.maximized = true; } void _glfwPlatformShowWindow(_GLFWwindow* window)