xwayland: Clear the "xwl-window" tag on unrealize

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 <ofourdan@redhat.com>
Reviewed-by: Michel Dänzer <mdaenzer@redhat.com>
Fixes: e37f18ee9 - xwayland: Delay wl_surface destruction
This commit is contained in:
Olivier Fourdan 2022-10-17 16:39:30 +02:00 committed by Olivier Fourdan
parent cb33e0d278
commit a1d14aa8c5

View File

@ -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); 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 Bool
is_surface_from_xwl_window(struct wl_surface *surface) is_surface_from_xwl_window(struct wl_surface *surface)
{ {
@ -893,9 +899,13 @@ release_wl_surface_for_window(struct xwl_window *xwl_window)
return; return;
} }
/* Otherwise, schedule the destruction later, to mitigate the race /* Break the wl_surface / xwl_window relationship */
* between X11 and Wayland processing so that the compositor has the wl_surface_set_user_data(xwl_window->surface, NULL);
* time to establish the association before the wl_surface is destroyed. 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 = xnfcalloc(1, sizeof *xwl_wl_surface);
xwl_wl_surface->wl_surface = xwl_window->surface; xwl_wl_surface->wl_surface = xwl_window->surface;