diff --git a/types/seat/wlr_seat_keyboard.c b/types/seat/wlr_seat_keyboard.c index 56f83b7f4..3227035e2 100644 --- a/types/seat/wlr_seat_keyboard.c +++ b/types/seat/wlr_seat_keyboard.c @@ -122,6 +122,11 @@ void wlr_seat_set_keyboard(struct wlr_seat *seat, return; } + // send the keymap only if it has changed + bool needs_keymap_update = + !seat->keyboard_state.keyboard || !keyboard || + seat->keyboard_state.keyboard->keymap != keyboard->keymap; + if (seat->keyboard_state.keyboard) { wl_list_remove(&seat->keyboard_state.keyboard_destroy.link); wl_list_remove(&seat->keyboard_state.keyboard_keymap.link); @@ -145,7 +150,9 @@ void wlr_seat_set_keyboard(struct wlr_seat *seat, struct wlr_seat_client *client; wl_list_for_each(client, &seat->clients, link) { - seat_client_send_keymap(client, keyboard); + if (needs_keymap_update) { + seat_client_send_keymap(client, keyboard); + } seat_client_send_repeat_info(client, keyboard); }