From aae74613c6650a69ffa52f8f65a76d45edc66998 Mon Sep 17 00:00:00 2001 From: Oscar Cowdery Lack Date: Thu, 3 Jan 2019 09:12:01 +1100 Subject: [PATCH] swaylock: Fix caps lock not updating immediately Partially fixes #2788. This change makes it so the lock screen is redrawn whenever the caps lock modifier state changes, rather on relying on the keypress event. This didn't work because caps lock is disabled when the key is released, not pressed, so the caps lock indicator does not go away until the next keypress event. --- password.c | 8 -------- seat.c | 6 +++++- 2 files changed, 5 insertions(+), 9 deletions(-) diff --git a/password.c b/password.c index 3059203..3bd113a 100644 --- a/password.c +++ b/password.c @@ -146,14 +146,6 @@ void swaylock_handle_key(struct swaylock_state *state, schedule_indicator_clear(state); break; case XKB_KEY_Caps_Lock: - /* The state is getting active after this - * so we need to manually toggle it */ - state->xkb.caps_lock = !state->xkb.caps_lock; - state->auth_state = AUTH_STATE_INPUT_NOP; - damage_state(state); - schedule_indicator_clear(state); - schedule_password_clear(state); - break; case XKB_KEY_Shift_L: case XKB_KEY_Shift_R: case XKB_KEY_Control_L: diff --git a/seat.c b/seat.c index 7b72114..f0b1385 100644 --- a/seat.c +++ b/seat.c @@ -63,8 +63,12 @@ static void keyboard_modifiers(void *data, struct wl_keyboard *wl_keyboard, struct swaylock_state *state = data; xkb_state_update_mask(state->xkb.state, mods_depressed, mods_latched, mods_locked, 0, 0, group); - state->xkb.caps_lock = xkb_state_mod_name_is_active(state->xkb.state, + int caps_lock = xkb_state_mod_name_is_active(state->xkb.state, XKB_MOD_NAME_CAPS, XKB_STATE_MODS_LOCKED); + if (caps_lock != state->xkb.caps_lock) { + state->xkb.caps_lock = caps_lock; + damage_state(state); + } state->xkb.control = xkb_state_mod_name_is_active(state->xkb.state, XKB_MOD_NAME_CTRL, XKB_STATE_MODS_DEPRESSED | XKB_STATE_MODS_LATCHED);