wlr_keyboard: don't emit key event for duplicated keycodes

This fixes the memory leak in wlr_keyboard_group.keys. The leak happened
because wlr_keyboard.keycodes never contains duplicated keycodes while
wlr_keyboard_group.keys can, so calling wlr_keyboard_finish() for all
the wlr_keyboards in wlr_keyboard_group doesn't always free all the keys
in wlr_keyboard_group.keys.
This commit is contained in:
tokyo4j 2024-11-19 10:13:23 +09:00 committed by Kirill Primak
parent c0d4d7217b
commit e21899037a
2 changed files with 8 additions and 4 deletions

View file

@ -1,6 +1,6 @@
#include <wlr/types/wlr_keyboard.h>
void keyboard_key_update(struct wlr_keyboard *keyboard,
bool keyboard_key_update(struct wlr_keyboard *keyboard,
struct wlr_keyboard_key_event *event);
bool keyboard_modifier_update(struct wlr_keyboard *keyboard);

View file

@ -66,8 +66,9 @@ bool keyboard_modifier_update(struct wlr_keyboard *keyboard) {
return true;
}
void keyboard_key_update(struct wlr_keyboard *keyboard,
bool keyboard_key_update(struct wlr_keyboard *keyboard,
struct wlr_keyboard_key_event *event) {
size_t old_num_keycodes = keyboard->num_keycodes;
if (event->state == WL_KEYBOARD_KEY_STATE_PRESSED) {
set_add(keyboard->keycodes, &keyboard->num_keycodes,
WLR_KEYBOARD_KEYS_CAP, event->keycode);
@ -78,6 +79,8 @@ void keyboard_key_update(struct wlr_keyboard *keyboard,
}
assert(keyboard->num_keycodes <= WLR_KEYBOARD_KEYS_CAP);
return old_num_keycodes != keyboard->num_keycodes;
}
void wlr_keyboard_notify_modifiers(struct wlr_keyboard *keyboard,
@ -99,8 +102,9 @@ void wlr_keyboard_notify_modifiers(struct wlr_keyboard *keyboard,
void wlr_keyboard_notify_key(struct wlr_keyboard *keyboard,
struct wlr_keyboard_key_event *event) {
keyboard_key_update(keyboard, event);
wl_signal_emit_mutable(&keyboard->events.key, event);
if (keyboard_key_update(keyboard, event)) {
wl_signal_emit_mutable(&keyboard->events.key, event);
}
if (keyboard->xkb_state == NULL) {
return;