From efade28db954ad02ac283a626238df04bae146da Mon Sep 17 00:00:00 2001 From: Quentin Glidic Date: Tue, 17 Oct 2017 16:14:49 +0200 Subject: [PATCH] libweston-desktop/xdg-shell-v6: Actually send same-as-current configure if needed MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit If a surface is in state A, and we just sent a configure for state B, setting back state A would be ignored, because state B has not been committed yet. Now, we check against the latest configured state (which is current state if configure list is empty). Reported on wlroots https://github.com/swaywm/wlroots/pull/280 Signed-off-by: Quentin Glidic Reviewed-by: Jonas Ã…dahl --- libweston-desktop/xdg-shell-v6.c | 31 +++++++++++++++++++++++++------ 1 file changed, 25 insertions(+), 6 deletions(-) diff --git a/libweston-desktop/xdg-shell-v6.c b/libweston-desktop/xdg-shell-v6.c index d82a507f..4db3748b 100644 --- a/libweston-desktop/xdg-shell-v6.c +++ b/libweston-desktop/xdg-shell-v6.c @@ -903,20 +903,39 @@ weston_desktop_xdg_surface_send_configure(void *user_data) static bool weston_desktop_xdg_toplevel_state_compare(struct weston_desktop_xdg_toplevel *toplevel) { + struct { + struct weston_desktop_xdg_toplevel_state state; + struct weston_size size; + } configured; + if (!toplevel->base.configured) return false; - if (toplevel->pending.state.activated != toplevel->current.state.activated) + if (wl_list_empty(&toplevel->base.configure_list)) { + /* Last configure is actually the current state, just use it */ + configured.state = toplevel->current.state; + configured.size.width = toplevel->base.surface->width; + configured.size.height = toplevel->base.surface->height; + } else { + struct weston_desktop_xdg_toplevel_configure *configure = + wl_container_of(toplevel->base.configure_list.prev, + configure, base.link); + + configured.state = configure->state; + configured.size = configure->size; + } + + if (toplevel->pending.state.activated != configured.state.activated) return false; - if (toplevel->pending.state.fullscreen != toplevel->current.state.fullscreen) + if (toplevel->pending.state.fullscreen != configured.state.fullscreen) return false; - if (toplevel->pending.state.maximized != toplevel->current.state.maximized) + if (toplevel->pending.state.maximized != configured.state.maximized) return false; - if (toplevel->pending.state.resizing != toplevel->current.state.resizing) + if (toplevel->pending.state.resizing != configured.state.resizing) return false; - if (toplevel->base.surface->width == toplevel->pending.size.width && - toplevel->base.surface->height == toplevel->pending.size.height) + if (toplevel->pending.size.width == configured.size.width && + toplevel->pending.size.height == configured.size.height) return true; if (toplevel->pending.size.width == 0 &&