From a1d14aa8c5afbae2f99aa68454d429aed5852b72 Mon Sep 17 00:00:00 2001 From: Olivier Fourdan Date: Mon, 17 Oct 2022 16:39:30 +0200 Subject: [PATCH] xwayland: Clear the "xwl-window" tag on unrealize MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Now that we keep the Wayland surface around for longer than the xwl_window, we might get events for that surface after the X11 window is unrealized. Make sure we untag the Wayland surface when the Wayland surface is delayed, to break the wl_surface/xwl_window relationship, so that events for that surface are discarded by Xwayland. Signed-off-by: Olivier Fourdan Reviewed-by: Michel Dänzer Fixes: e37f18ee9 - xwayland: Delay wl_surface destruction --- hw/xwayland/xwayland-window.c | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/hw/xwayland/xwayland-window.c b/hw/xwayland/xwayland-window.c index 549de18eb..2a88c89ea 100644 --- a/hw/xwayland/xwayland-window.c +++ b/hw/xwayland/xwayland-window.c @@ -121,6 +121,12 @@ xwl_window_set_xwayland_tag(struct xwl_window *xwl_window) wl_proxy_set_tag((struct wl_proxy *)xwl_window->surface, &xwl_surface_tag); } +static void +xwl_window_clear_xwayland_tag(struct xwl_window *xwl_window) +{ + wl_proxy_set_tag((struct wl_proxy *)xwl_window->surface, NULL); +} + Bool is_surface_from_xwl_window(struct wl_surface *surface) { @@ -893,9 +899,13 @@ release_wl_surface_for_window(struct xwl_window *xwl_window) return; } - /* Otherwise, schedule the destruction later, to mitigate the race - * between X11 and Wayland processing so that the compositor has the - * time to establish the association before the wl_surface is destroyed. + /* Break the wl_surface / xwl_window relationship */ + wl_surface_set_user_data(xwl_window->surface, NULL); + xwl_window_clear_xwayland_tag(xwl_window); + + /* Schedule the destruction later, to mitigate the race between X11 + * and Wayland processing so that the compositor has the time to + * establish the association before the wl_surface is destroyed. */ xwl_wl_surface = xnfcalloc(1, sizeof *xwl_wl_surface); xwl_wl_surface->wl_surface = xwl_window->surface;