wayland/window: Correct detection whether to send configure

When deciding if `configure` event should be sent,
`meta_window_wayland_move_resize_internal` compares requested window size
with `window->rect` size. However, `window->rect` is only updated when `commit`
is received. So the following sequence produces incorrect result:

1. a window initially has size `size1`
2. `move_resize_internal` is called with `size2`. `configure` is sent
3. `move_resize_internal` is called with `size1` to restore original size,
but `commit` for `size2` haven't arrived yet. So `window->rect` still has size
`size1`, and thus new `configure` is not sent
4. `commit` for `size2` arrives, window changes size to `size2`

Expected window size in the end: `size1`
Actual: `size2`

To fix the issue, take size from pending `configure` events into account.

Fixes https://gitlab.gnome.org/GNOME/mutter/-/issues/1627

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1755>
This commit is contained in:
Aleksandr Mezin
2021-03-05 14:38:57 +06:00
committed by Marge Bot
parent 56fc09151d
commit 236e9ec68f
3 changed files with 49 additions and 6 deletions

View File

@ -22,6 +22,8 @@
#include "wayland/meta-wayland-window-configuration.h"
#include "wayland/meta-window-wayland.h"
static uint32_t global_serial_counter = 0;
static gboolean
@ -51,6 +53,13 @@ meta_wayland_window_configuration_new (MetaWindow *window,
MetaGravity gravity)
{
MetaWaylandWindowConfiguration *configuration;
MetaWindowWayland *wl_window = META_WINDOW_WAYLAND (window);
int pending_width;
int pending_height;
meta_window_wayland_get_pending_size (wl_window,
&pending_width,
&pending_height);
configuration = g_new0 (MetaWaylandWindowConfiguration, 1);
*configuration = (MetaWaylandWindowConfiguration) {
@ -72,8 +81,8 @@ meta_wayland_window_configuration_new (MetaWindow *window,
if (flags & META_MOVE_RESIZE_RESIZE_ACTION ||
is_window_size_fixed (window) ||
window->rect.width != width ||
window->rect.height != height)
pending_width != width ||
pending_height != height)
{
configuration->has_size = TRUE;
configuration->width = width;