aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/wlr/xwayland.h1
-rw-r--r--xwayland/xwayland.c20
2 files changed, 21 insertions, 0 deletions
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);
}