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
This commit is contained in:
Dominique Martinet 2018-06-08 21:58:01 +09:00
parent 515f03c94c
commit d68ddd1532
2 changed files with 15 additions and 32 deletions

View File

@ -139,6 +139,14 @@ void swaylock_handle_key(struct swaylock_state *state,
state->auth_state = AUTH_STATE_INPUT_NOP; state->auth_state = AUTH_STATE_INPUT_NOP;
damage_state(state); damage_state(state);
break; 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: default:
if (codepoint) { if (codepoint) {
append_ch(&state->password, codepoint); append_ch(&state->password, codepoint);

39
seat.c
View File

@ -7,28 +7,6 @@
#include "swaylock/swaylock.h" #include "swaylock/swaylock.h"
#include "swaylock/seat.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, static void keyboard_keymap(void *data, struct wl_keyboard *wl_keyboard,
uint32_t format, int32_t fd, uint32_t size) { uint32_t format, int32_t fd, uint32_t size) {
struct swaylock_state *state = data; 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) { uint32_t mods_locked, uint32_t group) {
struct swaylock_state *state = data; struct swaylock_state *state = data;
xkb_state_update_mask(state->xkb.state, xkb_state_update_mask(state->xkb.state,
mods_depressed, mods_latched, mods_locked, 0, 0, group); mods_depressed, mods_latched, mods_locked, 0, 0, group);
xkb_mod_mask_t mask = xkb_state_serialize_mods(state->xkb.state, state->xkb.caps_lock = xkb_state_mod_name_is_active(state->xkb.state,
XKB_STATE_MODS_DEPRESSED | XKB_STATE_MODS_LATCHED); XKB_MOD_NAME_CAPS, XKB_STATE_MODS_LOCKED);
state->xkb.modifiers = 0; state->xkb.control = xkb_state_mod_name_is_active(state->xkb.state,
state->xkb.caps_lock = xkb_state_mod_name_is_active(state->xkb.state, XKB_MOD_NAME_CAPS, XKB_STATE_MODS_LOCKED); XKB_MOD_NAME_CTRL,
for (uint32_t i = 0; i < MASK_LAST; ++i) { XKB_STATE_MODS_DEPRESSED | XKB_STATE_MODS_LATCHED);
if (mask & state->xkb.masks[i]) {
state->xkb.modifiers |= XKB_MODS[i];
}
}
} }
static void keyboard_repeat_info(void *data, struct wl_keyboard *wl_keyboard, static void keyboard_repeat_info(void *data, struct wl_keyboard *wl_keyboard,