Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

input/seat: handle wlr_seat destroy #8034

Draft
wants to merge 1 commit into
base: master
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
3 changes: 1 addition & 2 deletions include/sway/input/seat.h
Expand Up @@ -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;
Expand Down Expand Up @@ -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);

Expand Down
2 changes: 1 addition & 1 deletion sway/config.c
Expand Up @@ -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);
}
}
}
Expand Down
11 changes: 9 additions & 2 deletions sway/input/seat.c
Expand Up @@ -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) {
Expand All @@ -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]);
}
Expand Down Expand Up @@ -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;
Expand Down