xwayland: listen to wlr_seat destroy signal

This commit is contained in:
Dominique Martinet 2017-12-29 17:55:16 +01:00
parent 58488ec5ce
commit e0eafa0429
2 changed files with 21 additions and 0 deletions

View file

@ -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;

View file

@ -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);
}