wlr_keyboard_group: fix leak of wlr_keyboard_group->keys

If the underlying wlr_keyboard emits duplicated key-presses,
wlr_keyboard_group->keys might not be empty even after calling
wlr_keyboard_group_remove_keyboard() for all of the keyboards.
This commit is contained in:
tokyo4j 2025-02-15 16:47:52 +09:00 committed by Kirill Primak
parent ff55f91055
commit 766a228da4

View file

@ -307,10 +307,19 @@ void wlr_keyboard_group_remove_keyboard(struct wlr_keyboard_group *group,
} }
void wlr_keyboard_group_destroy(struct wlr_keyboard_group *group) { void wlr_keyboard_group_destroy(struct wlr_keyboard_group *group) {
struct keyboard_group_device *device, *tmp; struct keyboard_group_device *device, *tmp_device;
wl_list_for_each_safe(device, tmp, &group->devices, link) { wl_list_for_each_safe(device, tmp_device, &group->devices, link) {
wlr_keyboard_group_remove_keyboard(group, device->keyboard); wlr_keyboard_group_remove_keyboard(group, device->keyboard);
} }
// Now group->keys might not be empty if a wlr_keyboard has emitted
// duplicated key presses
struct keyboard_group_key *key, *tmp_key;
wl_list_for_each_safe(key, tmp_key, &group->keys, link) {
wl_list_remove(&key->link);
free(key);
}
wlr_keyboard_finish(&group->keyboard); wlr_keyboard_finish(&group->keyboard);
wl_list_remove(&group->events.enter.listener_list); wl_list_remove(&group->events.enter.listener_list);
wl_list_remove(&group->events.leave.listener_list); wl_list_remove(&group->events.leave.listener_list);