mirror of
https://gitlab.freedesktop.org/wlroots/wlroots.git
synced 2026-03-17 05:34:14 -04:00
virtual-keyboard: handle seat destroy
We must make the virtual keyboard inert when the seat is destroyed.
This commit is contained in:
parent
ec746d3e3e
commit
1fa8bb8f7a
2 changed files with 31 additions and 14 deletions
|
|
@ -113,21 +113,24 @@ static void virtual_keyboard_modifiers(struct wl_client *client,
|
|||
mods_depressed, mods_latched, mods_locked, group);
|
||||
}
|
||||
|
||||
static void virtual_keyboard_destroy_resource(struct wl_resource *resource) {
|
||||
struct wlr_virtual_keyboard_v1 *keyboard =
|
||||
wlr_virtual_keyboard_v1_from_resource(resource);
|
||||
if (keyboard == NULL) {
|
||||
return;
|
||||
}
|
||||
|
||||
wlr_keyboard_finish(&keyboard->keyboard);
|
||||
|
||||
wl_resource_set_user_data(keyboard->resource, NULL);
|
||||
wl_list_remove(&keyboard->link);
|
||||
free(keyboard);
|
||||
static void virtual_keyboard_destroy(struct wlr_virtual_keyboard_v1 *virtual_keyboard) {
|
||||
wlr_keyboard_finish(&virtual_keyboard->keyboard);
|
||||
wl_resource_set_user_data(virtual_keyboard->resource, NULL);
|
||||
wl_list_remove(&virtual_keyboard->seat_destroy.link);
|
||||
wl_list_remove(&virtual_keyboard->link);
|
||||
free(virtual_keyboard);
|
||||
}
|
||||
|
||||
static void virtual_keyboard_destroy(struct wl_client *client,
|
||||
static void virtual_keyboard_destroy_resource(struct wl_resource *resource) {
|
||||
struct wlr_virtual_keyboard_v1 *virtual_keyboard =
|
||||
wlr_virtual_keyboard_v1_from_resource(resource);
|
||||
if (virtual_keyboard == NULL) {
|
||||
return;
|
||||
}
|
||||
virtual_keyboard_destroy(virtual_keyboard);
|
||||
}
|
||||
|
||||
static void virtual_keyboard_handle_destroy(struct wl_client *client,
|
||||
struct wl_resource *resource) {
|
||||
wl_resource_destroy(resource);
|
||||
}
|
||||
|
|
@ -136,7 +139,7 @@ static const struct zwp_virtual_keyboard_v1_interface virtual_keyboard_impl = {
|
|||
.keymap = virtual_keyboard_keymap,
|
||||
.key = virtual_keyboard_key,
|
||||
.modifiers = virtual_keyboard_modifiers,
|
||||
.destroy = virtual_keyboard_destroy,
|
||||
.destroy = virtual_keyboard_handle_destroy,
|
||||
};
|
||||
|
||||
static const struct zwp_virtual_keyboard_manager_v1_interface manager_impl;
|
||||
|
|
@ -148,6 +151,13 @@ static struct wlr_virtual_keyboard_manager_v1 *manager_from_resource(
|
|||
return wl_resource_get_user_data(resource);
|
||||
}
|
||||
|
||||
static void virtual_keyboard_handle_seat_destroy(struct wl_listener *listener,
|
||||
void *data) {
|
||||
struct wlr_virtual_keyboard_v1 *virtual_keyboard = wl_container_of(listener, virtual_keyboard,
|
||||
seat_destroy);
|
||||
virtual_keyboard_destroy(virtual_keyboard);
|
||||
}
|
||||
|
||||
static void virtual_keyboard_manager_create_virtual_keyboard(
|
||||
struct wl_client *client, struct wl_resource *resource,
|
||||
struct wl_resource *seat, uint32_t id) {
|
||||
|
|
@ -181,6 +191,9 @@ static void virtual_keyboard_manager_create_virtual_keyboard(
|
|||
virtual_keyboard->seat = seat_client->seat;
|
||||
wl_resource_set_user_data(keyboard_resource, virtual_keyboard);
|
||||
|
||||
wl_signal_add(&seat_client->events.destroy, &virtual_keyboard->seat_destroy);
|
||||
virtual_keyboard->seat_destroy.notify = virtual_keyboard_handle_seat_destroy;
|
||||
|
||||
wl_list_insert(&manager->virtual_keyboards, &virtual_keyboard->link);
|
||||
|
||||
wl_signal_emit_mutable(&manager->events.new_virtual_keyboard,
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue