mirror of
https://gitlab.freedesktop.org/wlroots/wlroots.git
synced 2026-03-29 07:58:24 -04:00
virtual-keyboard: handle seat destroy
We must make the virtual keyboard inert when the seat is destroyed.
(cherry picked from commit 1fa8bb8f7a)
This commit is contained in:
parent
6a902237ef
commit
88718e84c9
2 changed files with 31 additions and 14 deletions
|
|
@ -33,6 +33,10 @@ struct wlr_virtual_keyboard_v1 {
|
||||||
bool has_keymap;
|
bool has_keymap;
|
||||||
|
|
||||||
struct wl_list link; // wlr_virtual_keyboard_manager_v1.virtual_keyboards
|
struct wl_list link; // wlr_virtual_keyboard_manager_v1.virtual_keyboards
|
||||||
|
|
||||||
|
struct {
|
||||||
|
struct wl_listener seat_destroy;
|
||||||
|
} WLR_PRIVATE;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct wlr_virtual_keyboard_manager_v1* wlr_virtual_keyboard_manager_v1_create(
|
struct wlr_virtual_keyboard_manager_v1* wlr_virtual_keyboard_manager_v1_create(
|
||||||
|
|
|
||||||
|
|
@ -113,21 +113,24 @@ static void virtual_keyboard_modifiers(struct wl_client *client,
|
||||||
mods_depressed, mods_latched, mods_locked, group);
|
mods_depressed, mods_latched, mods_locked, group);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void virtual_keyboard_destroy_resource(struct wl_resource *resource) {
|
static void virtual_keyboard_destroy(struct wlr_virtual_keyboard_v1 *virtual_keyboard) {
|
||||||
struct wlr_virtual_keyboard_v1 *keyboard =
|
wlr_keyboard_finish(&virtual_keyboard->keyboard);
|
||||||
wlr_virtual_keyboard_v1_from_resource(resource);
|
wl_resource_set_user_data(virtual_keyboard->resource, NULL);
|
||||||
if (keyboard == NULL) {
|
wl_list_remove(&virtual_keyboard->seat_destroy.link);
|
||||||
return;
|
wl_list_remove(&virtual_keyboard->link);
|
||||||
}
|
free(virtual_keyboard);
|
||||||
|
|
||||||
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 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) {
|
struct wl_resource *resource) {
|
||||||
wl_resource_destroy(resource);
|
wl_resource_destroy(resource);
|
||||||
}
|
}
|
||||||
|
|
@ -136,7 +139,7 @@ static const struct zwp_virtual_keyboard_v1_interface virtual_keyboard_impl = {
|
||||||
.keymap = virtual_keyboard_keymap,
|
.keymap = virtual_keyboard_keymap,
|
||||||
.key = virtual_keyboard_key,
|
.key = virtual_keyboard_key,
|
||||||
.modifiers = virtual_keyboard_modifiers,
|
.modifiers = virtual_keyboard_modifiers,
|
||||||
.destroy = virtual_keyboard_destroy,
|
.destroy = virtual_keyboard_handle_destroy,
|
||||||
};
|
};
|
||||||
|
|
||||||
static const struct zwp_virtual_keyboard_manager_v1_interface manager_impl;
|
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);
|
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(
|
static void virtual_keyboard_manager_create_virtual_keyboard(
|
||||||
struct wl_client *client, struct wl_resource *resource,
|
struct wl_client *client, struct wl_resource *resource,
|
||||||
struct wl_resource *seat, uint32_t id) {
|
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;
|
virtual_keyboard->seat = seat_client->seat;
|
||||||
wl_resource_set_user_data(keyboard_resource, virtual_keyboard);
|
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_list_insert(&manager->virtual_keyboards, &virtual_keyboard->link);
|
||||||
|
|
||||||
wl_signal_emit_mutable(&manager->events.new_virtual_keyboard,
|
wl_signal_emit_mutable(&manager->events.new_virtual_keyboard,
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue