diff --git a/include/types/wlr_keyboard.h b/include/types/wlr_keyboard.h index 7cd26e8a5..bdae09bdd 100644 --- a/include/types/wlr_keyboard.h +++ b/include/types/wlr_keyboard.h @@ -1,6 +1,6 @@ #include -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); diff --git a/types/wlr_keyboard.c b/types/wlr_keyboard.c index 81d45a624..5eff3ba39 100644 --- a/types/wlr_keyboard.c +++ b/types/wlr_keyboard.c @@ -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;