From e0eafa04293496b95f29fdaf42703f1fc1e29e2e Mon Sep 17 00:00:00 2001 From: Dominique Martinet Date: Fri, 29 Dec 2017 17:55:16 +0100 Subject: [PATCH] xwayland: listen to wlr_seat destroy signal --- include/wlr/xwayland.h | 1 + xwayland/xwayland.c | 20 ++++++++++++++++++++ 2 files changed, 21 insertions(+) diff --git a/include/wlr/xwayland.h b/include/wlr/xwayland.h index 8d71a7ab..d4590f97 100644 --- a/include/wlr/xwayland.h +++ b/include/wlr/xwayland.h @@ -28,6 +28,7 @@ struct wlr_xwayland { struct wl_event_source *sigusr1_source; struct wl_listener client_destroy; struct wl_listener display_destroy; + struct wl_listener seat_destroy; struct wlr_xwm *xwm; struct wlr_xwayland_cursor *cursor; diff --git a/xwayland/xwayland.c b/xwayland/xwayland.c index a0b6d1c3..e181d261 100644 --- a/xwayland/xwayland.c +++ b/xwayland/xwayland.c @@ -134,6 +134,7 @@ static void wlr_xwayland_finish(struct wlr_xwayland *wlr_xwayland) { free(wlr_xwayland->cursor); } + wlr_xwayland_set_seat(wlr_xwayland, NULL); xwm_destroy(wlr_xwayland->xwm); if (wlr_xwayland->client) { @@ -388,11 +389,30 @@ void wlr_xwayland_set_cursor(struct wlr_xwayland *wlr_xwayland, wlr_xwayland->cursor->hotspot_y = hotspot_y; } +static void wlr_xwayland_handle_seat_destroy(struct wl_listener *listener, + void *data) { + struct wlr_xwayland *xwayland = + wl_container_of(listener, xwayland, seat_destroy); + + wlr_xwayland_set_seat(xwayland, NULL); +} + void wlr_xwayland_set_seat(struct wlr_xwayland *xwayland, struct wlr_seat *seat) { + if (xwayland->seat) { + wl_list_remove(&xwayland->seat_destroy.link); + } + xwayland->seat = seat; if (xwayland->xwm) { xwm_set_seat(xwayland->xwm, seat); } + + if (seat == NULL) { + return; + } + + xwayland->seat_destroy.notify = wlr_xwayland_handle_seat_destroy; + wl_signal_add(&seat->events.destroy, &xwayland->seat_destroy); }