input/seat: handle wlr_seat destroy

This commit is contained in:
Simon Ser 2024-03-04 13:48:43 +01:00
parent 5e18ed3cf0
commit b5fd7de8ab
3 changed files with 11 additions and 5 deletions

View file

@ -118,6 +118,7 @@ struct sway_seat {
struct sway_input_method_relay im_relay;
struct wl_listener destroy;
struct wl_listener focus_destroy;
struct wl_listener new_node;
struct wl_listener request_start_drag;
@ -151,8 +152,6 @@ struct sway_keyboard_shortcuts_inhibitor {
struct sway_seat *seat_create(const char *seat_name);
void seat_destroy(struct sway_seat *seat);
void seat_add_device(struct sway_seat *seat,
struct sway_input_device *device);

View file

@ -191,7 +191,7 @@ static void destroy_removed_seats(struct sway_config *old_config,
seat_name_cmp, seat_config->name) < 0) {
seat = input_manager_get_seat(seat_config->name, false);
if (seat) {
seat_destroy(seat);
wlr_seat_destroy(seat->wlr_seat);
}
}
}

View file

@ -66,9 +66,13 @@ static void seat_node_destroy(struct sway_seat_node *seat_node) {
free(seat_node);
}
void seat_destroy(struct sway_seat *seat) {
static void handle_destroy(struct wl_listener *listener, void *data) {
struct sway_seat *seat = wl_container_of(listener, seat, destroy);
if (seat == config->handler_context.seat) {
config->handler_context.seat = input_manager_get_default_seat();
if (seat == config->handler_context.seat) {
config->handler_context.seat = NULL;
}
}
struct sway_seat_device *seat_device, *next;
wl_list_for_each_safe(seat_device, next, &seat->devices, link) {
@ -82,12 +86,12 @@ void seat_destroy(struct sway_seat *seat) {
sway_input_method_relay_finish(&seat->im_relay);
sway_cursor_destroy(seat->cursor);
wl_list_remove(&seat->new_node.link);
wl_list_remove(&seat->destroy.link);
wl_list_remove(&seat->request_start_drag.link);
wl_list_remove(&seat->start_drag.link);
wl_list_remove(&seat->request_set_selection.link);
wl_list_remove(&seat->request_set_primary_selection.link);
wl_list_remove(&seat->link);
wlr_seat_destroy(seat->wlr_seat);
for (int i = 0; i < seat->deferred_bindings->length; i++) {
free_sway_binding(seat->deferred_bindings->items[i]);
}
@ -555,6 +559,9 @@ struct sway_seat *seat_create(const char *seat_name) {
wl_signal_add(&root->events.new_node, &seat->new_node);
seat->new_node.notify = handle_new_node;
wl_signal_add(&seat->wlr_seat->events.destroy, &seat->destroy);
seat->destroy.notify = handle_destroy;
wl_signal_add(&seat->wlr_seat->events.request_start_drag,
&seat->request_start_drag);
seat->request_start_drag.notify = handle_request_start_drag;