diff --git a/src/wayland/meta-wayland-window-configuration.c b/src/wayland/meta-wayland-window-configuration.c index 6a91a7141..c3de8a777 100644 --- a/src/wayland/meta-wayland-window-configuration.c +++ b/src/wayland/meta-wayland-window-configuration.c @@ -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; diff --git a/src/wayland/meta-window-wayland.c b/src/wayland/meta-window-wayland.c index 31e0ef103..b37b13efb 100644 --- a/src/wayland/meta-window-wayland.c +++ b/src/wayland/meta-window-wayland.c @@ -301,6 +301,12 @@ meta_window_wayland_move_resize_internal (MetaWindow *window, } else { + int pending_width; + int pending_height; + meta_window_wayland_get_pending_size (wl_window, + &pending_width, + &pending_height); + if (window->placement.rule) { switch (window->placement.state) @@ -315,8 +321,8 @@ meta_window_wayland_move_resize_internal (MetaWindow *window, if (flags & META_MOVE_RESIZE_PLACEMENT_CHANGED || rel_x != wl_window->last_sent_rel_x || rel_y != wl_window->last_sent_rel_y || - constrained_rect.width != window->rect.width || - constrained_rect.height != window->rect.height) + constrained_rect.width != pending_width || + constrained_rect.height != pending_height) { MetaWaylandWindowConfiguration *configuration; @@ -349,8 +355,8 @@ meta_window_wayland_move_resize_internal (MetaWindow *window, break; } } - else if (constrained_rect.width != window->rect.width || - constrained_rect.height != window->rect.height || + else if (constrained_rect.width != pending_width || + constrained_rect.height != pending_height || flags & META_MOVE_RESIZE_STATE_CHANGED) { MetaWaylandWindowConfiguration *configuration; @@ -1204,3 +1210,27 @@ meta_window_wayland_get_max_size (MetaWindow *window, scale = 1.0 / (float) meta_window_wayland_get_geometry_scale (window); scale_size (width, height, scale); } + +void +meta_window_wayland_get_pending_size (MetaWindowWayland *wl_window, + int *width, + int *height) +{ + MetaWindow *window = META_WINDOW (wl_window); + GList *l; + + for (l = wl_window->pending_configurations; l; l = l->next) + { + MetaWaylandWindowConfiguration *configuration = l->data; + + if (configuration->has_size) + { + *width = configuration->width; + *height = configuration->height; + return; + } + } + + *width = window->rect.width; + *height = window->rect.height; +} diff --git a/src/wayland/meta-window-wayland.h b/src/wayland/meta-window-wayland.h index db152daaa..c242757df 100644 --- a/src/wayland/meta-window-wayland.h +++ b/src/wayland/meta-window-wayland.h @@ -77,4 +77,8 @@ void meta_window_wayland_get_max_size (MetaWindow *window, int *width, int *height); +void meta_window_wayland_get_pending_size (MetaWindowWayland *wl_window, + int *width, + int *height); + #endif