[PATCH weston v2] libweston-desktop/xdg-shell-v6: Actually send same-as-current configure if needed
Jonas Ådahl
jadahl at gmail.com
Wed Oct 18 09:01:14 UTC 2017
On Wed, Oct 18, 2017 at 10:58:44AM +0200, Quentin Glidic wrote:
> From: Quentin Glidic <sardemff7+git at sardemff7.net>
>
> 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 <sardemff7+git at sardemff7.net>
Reviewed-by: Jonas Ådahl <jadahl at gmail.com>
> ---
> v2: Actually check against latest configure, as Jonas suggested
>
>
> 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 d82a507fa..4db3748b7 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 &&
> --
> 2.13.4
>
More information about the wayland-devel
mailing list