mirror of
https://gitlab.freedesktop.org/wlroots/wlroots.git
synced 2025-10-29 05:40:12 -04:00
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:
parent
c0d4d7217b
commit
e21899037a
2 changed files with 8 additions and 4 deletions
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue