mirror of
https://github.com/swaywm/sway.git
synced 2024-11-24 08:51:27 +00:00
input/seat: handle wlr_seat destroy
This commit is contained in:
parent
5e18ed3cf0
commit
b5fd7de8ab
|
@ -118,6 +118,7 @@ struct sway_seat {
|
||||||
|
|
||||||
struct sway_input_method_relay im_relay;
|
struct sway_input_method_relay im_relay;
|
||||||
|
|
||||||
|
struct wl_listener destroy;
|
||||||
struct wl_listener focus_destroy;
|
struct wl_listener focus_destroy;
|
||||||
struct wl_listener new_node;
|
struct wl_listener new_node;
|
||||||
struct wl_listener request_start_drag;
|
struct wl_listener request_start_drag;
|
||||||
|
@ -151,8 +152,6 @@ struct sway_keyboard_shortcuts_inhibitor {
|
||||||
|
|
||||||
struct sway_seat *seat_create(const char *seat_name);
|
struct sway_seat *seat_create(const char *seat_name);
|
||||||
|
|
||||||
void seat_destroy(struct sway_seat *seat);
|
|
||||||
|
|
||||||
void seat_add_device(struct sway_seat *seat,
|
void seat_add_device(struct sway_seat *seat,
|
||||||
struct sway_input_device *device);
|
struct sway_input_device *device);
|
||||||
|
|
||||||
|
|
|
@ -191,7 +191,7 @@ static void destroy_removed_seats(struct sway_config *old_config,
|
||||||
seat_name_cmp, seat_config->name) < 0) {
|
seat_name_cmp, seat_config->name) < 0) {
|
||||||
seat = input_manager_get_seat(seat_config->name, false);
|
seat = input_manager_get_seat(seat_config->name, false);
|
||||||
if (seat) {
|
if (seat) {
|
||||||
seat_destroy(seat);
|
wlr_seat_destroy(seat->wlr_seat);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -66,9 +66,13 @@ static void seat_node_destroy(struct sway_seat_node *seat_node) {
|
||||||
free(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) {
|
if (seat == config->handler_context.seat) {
|
||||||
config->handler_context.seat = input_manager_get_default_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;
|
struct sway_seat_device *seat_device, *next;
|
||||||
wl_list_for_each_safe(seat_device, next, &seat->devices, link) {
|
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_input_method_relay_finish(&seat->im_relay);
|
||||||
sway_cursor_destroy(seat->cursor);
|
sway_cursor_destroy(seat->cursor);
|
||||||
wl_list_remove(&seat->new_node.link);
|
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->request_start_drag.link);
|
||||||
wl_list_remove(&seat->start_drag.link);
|
wl_list_remove(&seat->start_drag.link);
|
||||||
wl_list_remove(&seat->request_set_selection.link);
|
wl_list_remove(&seat->request_set_selection.link);
|
||||||
wl_list_remove(&seat->request_set_primary_selection.link);
|
wl_list_remove(&seat->request_set_primary_selection.link);
|
||||||
wl_list_remove(&seat->link);
|
wl_list_remove(&seat->link);
|
||||||
wlr_seat_destroy(seat->wlr_seat);
|
|
||||||
for (int i = 0; i < seat->deferred_bindings->length; i++) {
|
for (int i = 0; i < seat->deferred_bindings->length; i++) {
|
||||||
free_sway_binding(seat->deferred_bindings->items[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);
|
wl_signal_add(&root->events.new_node, &seat->new_node);
|
||||||
seat->new_node.notify = handle_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,
|
wl_signal_add(&seat->wlr_seat->events.request_start_drag,
|
||||||
&seat->request_start_drag);
|
&seat->request_start_drag);
|
||||||
seat->request_start_drag.notify = handle_request_start_drag;
|
seat->request_start_drag.notify = handle_request_start_drag;
|
||||||
|
|
Loading…
Reference in a new issue