From 6902a724ce0f89ef448ae46adeab055630c30bec Mon Sep 17 00:00:00 2001 From: Sebastian Keller Date: Wed, 27 Oct 2021 23:44:47 +0200 Subject: [PATCH] window: Store unconstrained_rect everytime a size is requested Currently the stored unconstrained_rect is only ever updated if there was a move, resize or state change according to the move_resize_internal implementation. For Wayland windows however resizes or state changes are done in two steps, first the new configuration is sent to the client and then once client acknowledges it, it is set on the mutter side in another move_resize_internal call. Only the second call would result in the unconstrained_rect being updated. This started causing problems when unfullscreening windows was immediately followed by a strut change. These strut changes started happening in gnome-shell due to the visibility of the panel now being considered for the struts and the presence of a fullscreen causing it to be hidden until unfullscreen. In this situation first the unfullscreen would resize the window to its pre-fullscreen size as expected, but then the strut change triggers another window resize. This window resize is based on the stored unconstrained_rect, which is still at the fullscreen size because the unfullscreen resize only has sent its configuration, but it has not been acknowledged yet. As a result the strut change causes a resize to the fullscreen size which due to the constraints now looks like a maximized window. To fix this always update the unconstrained_rect when the requested size has changed, but not when a previous request has been acknowledged unless it is originating from the client itself. If this included the move_resize_internal call from acknowledging the size as well, it would be possible for this to be delayed long enough on the client side to overwrite an intermediate resize originating from mutter. And if this did not include resizes originating from the client, clients would not be able to set an initial window size. Fixes https://gitlab.gnome.org/GNOME/mutter/-/issues/1973 Part-of: --- src/core/window.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/core/window.c b/src/core/window.c index 0f0c644d6..ff4816eea 100644 --- a/src/core/window.c +++ b/src/core/window.c @@ -4162,8 +4162,13 @@ meta_window_move_resize_internal (MetaWindow *window, g_signal_emit (window, window_signals[SIZE_CHANGED], 0); } - if (moved_or_resized || did_placement) - window->unconstrained_rect = unconstrained_rect; + /* Only update the stored size when requested but not when a + * (potentially outdated) request completes */ + if (!(flags & META_MOVE_RESIZE_WAYLAND_FINISH_MOVE_RESIZE) || + flags & META_MOVE_RESIZE_WAYLAND_CLIENT_RESIZE) + { + window->unconstrained_rect = unconstrained_rect; + } if ((moved_or_resized || did_placement ||