From c78ce0770a8c75d63853c6c85f789b68f56ee3ed Mon Sep 17 00:00:00 2001 From: Dominique Martinet Date: Fri, 8 Jun 2018 21:58:01 +0900 Subject: swaylock: implement ^U to clear buffer The whole state->xcb.modifiers thing didn't work at all (always 0) The xkb doc says "[xkb_state_serialize_mods] should not be used in regular clients; please use the xkb_state_mod_*_is_active API instead" so here it is --- swaylock/password.c | 8 ++++++++ swaylock/seat.c | 39 +++++++-------------------------------- 2 files changed, 15 insertions(+), 32 deletions(-) (limited to 'swaylock') diff --git a/swaylock/password.c b/swaylock/password.c index 6d493309..bb32286e 100644 --- a/swaylock/password.c +++ b/swaylock/password.c @@ -139,6 +139,14 @@ void swaylock_handle_key(struct swaylock_state *state, state->auth_state = AUTH_STATE_INPUT_NOP; damage_state(state); break; + case XKB_KEY_u: + if (state->xkb.control) { + clear_password_buffer(&state->password); + state->auth_state = AUTH_STATE_CLEAR; + damage_state(state); + break; + } + // fallthrough default: if (codepoint) { append_ch(&state->password, codepoint); diff --git a/swaylock/seat.c b/swaylock/seat.c index a81899a6..6c66d220 100644 --- a/swaylock/seat.c +++ b/swaylock/seat.c @@ -7,28 +7,6 @@ #include "swaylock/swaylock.h" #include "swaylock/seat.h" -const char *XKB_MASK_NAMES[MASK_LAST] = { - XKB_MOD_NAME_SHIFT, - XKB_MOD_NAME_CAPS, - XKB_MOD_NAME_CTRL, - XKB_MOD_NAME_ALT, - "Mod2", - "Mod3", - XKB_MOD_NAME_LOGO, - "Mod5", -}; - -const enum mod_bit XKB_MODS[MASK_LAST] = { - MOD_SHIFT, - MOD_CAPS, - MOD_CTRL, - MOD_ALT, - MOD_MOD2, - MOD_MOD3, - MOD_LOGO, - MOD_MOD5 -}; - static void keyboard_keymap(void *data, struct wl_keyboard *wl_keyboard, uint32_t format, int32_t fd, uint32_t size) { struct swaylock_state *state = data; @@ -84,16 +62,13 @@ static void keyboard_modifiers(void *data, struct wl_keyboard *wl_keyboard, uint32_t mods_locked, uint32_t group) { struct swaylock_state *state = data; xkb_state_update_mask(state->xkb.state, - mods_depressed, mods_latched, mods_locked, 0, 0, group); - xkb_mod_mask_t mask = xkb_state_serialize_mods(state->xkb.state, - XKB_STATE_MODS_DEPRESSED | XKB_STATE_MODS_LATCHED); - state->xkb.modifiers = 0; - state->xkb.caps_lock = xkb_state_mod_name_is_active(state->xkb.state, XKB_MOD_NAME_CAPS, XKB_STATE_MODS_LOCKED); - for (uint32_t i = 0; i < MASK_LAST; ++i) { - if (mask & state->xkb.masks[i]) { - state->xkb.modifiers |= XKB_MODS[i]; - } - } + mods_depressed, mods_latched, mods_locked, 0, 0, group); + state->xkb.caps_lock = xkb_state_mod_name_is_active(state->xkb.state, + XKB_MOD_NAME_CAPS, XKB_STATE_MODS_LOCKED); + state->xkb.control = xkb_state_mod_name_is_active(state->xkb.state, + XKB_MOD_NAME_CTRL, + XKB_STATE_MODS_DEPRESSED | XKB_STATE_MODS_LATCHED); + } static void keyboard_repeat_info(void *data, struct wl_keyboard *wl_keyboard, -- cgit v1.2.3-54-g00ecf