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:
parent
cb33e0d278
commit
a1d14aa8c5
|
@ -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;
|
||||||
|
|
Loading…
Reference in New Issue