diff options
-rw-r--r-- | include/swaylock/seat.h | 26 | ||||
-rw-r--r-- | swaylock/password.c | 8 | ||||
-rw-r--r-- | swaylock/seat.c | 39 |
3 files changed, 16 insertions, 57 deletions
diff --git a/include/swaylock/seat.h b/include/swaylock/seat.h index 180ea7a0..4bcf40c0 100644 --- a/include/swaylock/seat.h +++ b/include/swaylock/seat.h | |||
@@ -2,36 +2,12 @@ | |||
2 | #define _SWAYLOCK_SEAT_H | 2 | #define _SWAYLOCK_SEAT_H |
3 | #include <xkbcommon/xkbcommon.h> | 3 | #include <xkbcommon/xkbcommon.h> |
4 | 4 | ||
5 | enum mod_bit { | ||
6 | MOD_SHIFT = 1<<0, | ||
7 | MOD_CAPS = 1<<1, | ||
8 | MOD_CTRL = 1<<2, | ||
9 | MOD_ALT = 1<<3, | ||
10 | MOD_MOD2 = 1<<4, | ||
11 | MOD_MOD3 = 1<<5, | ||
12 | MOD_LOGO = 1<<6, | ||
13 | MOD_MOD5 = 1<<7, | ||
14 | }; | ||
15 | |||
16 | enum mask { | ||
17 | MASK_SHIFT, | ||
18 | MASK_CAPS, | ||
19 | MASK_CTRL, | ||
20 | MASK_ALT, | ||
21 | MASK_MOD2, | ||
22 | MASK_MOD3, | ||
23 | MASK_LOGO, | ||
24 | MASK_MOD5, | ||
25 | MASK_LAST | ||
26 | }; | ||
27 | |||
28 | struct swaylock_xkb { | 5 | struct swaylock_xkb { |
29 | uint32_t modifiers; | ||
30 | bool caps_lock; | 6 | bool caps_lock; |
7 | bool control; | ||
31 | struct xkb_state *state; | 8 | struct xkb_state *state; |
32 | struct xkb_context *context; | 9 | struct xkb_context *context; |
33 | struct xkb_keymap *keymap; | 10 | struct xkb_keymap *keymap; |
34 | xkb_mod_mask_t masks[MASK_LAST]; | ||
35 | }; | 11 | }; |
36 | 12 | ||
37 | extern const struct wl_seat_listener seat_listener; | 13 | extern const struct wl_seat_listener seat_listener; |
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, | |||
139 | state->auth_state = AUTH_STATE_INPUT_NOP; | 139 | state->auth_state = AUTH_STATE_INPUT_NOP; |
140 | damage_state(state); | 140 | damage_state(state); |
141 | break; | 141 | break; |
142 | case XKB_KEY_u: | ||
143 | if (state->xkb.control) { | ||
144 | clear_password_buffer(&state->password); | ||
145 | state->auth_state = AUTH_STATE_CLEAR; | ||
146 | damage_state(state); | ||
147 | break; | ||
148 | } | ||
149 | // fallthrough | ||
142 | default: | 150 | default: |
143 | if (codepoint) { | 151 | if (codepoint) { |
144 | append_ch(&state->password, codepoint); | 152 | 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 @@ | |||
7 | #include "swaylock/swaylock.h" | 7 | #include "swaylock/swaylock.h" |
8 | #include "swaylock/seat.h" | 8 | #include "swaylock/seat.h" |
9 | 9 | ||
10 | const char *XKB_MASK_NAMES[MASK_LAST] = { | ||
11 | XKB_MOD_NAME_SHIFT, | ||
12 | XKB_MOD_NAME_CAPS, | ||
13 | XKB_MOD_NAME_CTRL, | ||
14 | XKB_MOD_NAME_ALT, | ||
15 | "Mod2", | ||
16 | "Mod3", | ||
17 | XKB_MOD_NAME_LOGO, | ||
18 | "Mod5", | ||
19 | }; | ||
20 | |||
21 | const enum mod_bit XKB_MODS[MASK_LAST] = { | ||
22 | MOD_SHIFT, | ||
23 | MOD_CAPS, | ||
24 | MOD_CTRL, | ||
25 | MOD_ALT, | ||
26 | MOD_MOD2, | ||
27 | MOD_MOD3, | ||
28 | MOD_LOGO, | ||
29 | MOD_MOD5 | ||
30 | }; | ||
31 | |||
32 | static void keyboard_keymap(void *data, struct wl_keyboard *wl_keyboard, | 10 | static void keyboard_keymap(void *data, struct wl_keyboard *wl_keyboard, |
33 | uint32_t format, int32_t fd, uint32_t size) { | 11 | uint32_t format, int32_t fd, uint32_t size) { |
34 | struct swaylock_state *state = data; | 12 | struct swaylock_state *state = data; |
@@ -84,16 +62,13 @@ static void keyboard_modifiers(void *data, struct wl_keyboard *wl_keyboard, | |||
84 | uint32_t mods_locked, uint32_t group) { | 62 | uint32_t mods_locked, uint32_t group) { |
85 | struct swaylock_state *state = data; | 63 | struct swaylock_state *state = data; |
86 | xkb_state_update_mask(state->xkb.state, | 64 | xkb_state_update_mask(state->xkb.state, |
87 | mods_depressed, mods_latched, mods_locked, 0, 0, group); | 65 | mods_depressed, mods_latched, mods_locked, 0, 0, group); |
88 | xkb_mod_mask_t mask = xkb_state_serialize_mods(state->xkb.state, | 66 | state->xkb.caps_lock = xkb_state_mod_name_is_active(state->xkb.state, |
89 | XKB_STATE_MODS_DEPRESSED | XKB_STATE_MODS_LATCHED); | 67 | XKB_MOD_NAME_CAPS, XKB_STATE_MODS_LOCKED); |
90 | state->xkb.modifiers = 0; | 68 | state->xkb.control = xkb_state_mod_name_is_active(state->xkb.state, |
91 | state->xkb.caps_lock = xkb_state_mod_name_is_active(state->xkb.state, XKB_MOD_NAME_CAPS, XKB_STATE_MODS_LOCKED); | 69 | XKB_MOD_NAME_CTRL, |
92 | for (uint32_t i = 0; i < MASK_LAST; ++i) { | 70 | XKB_STATE_MODS_DEPRESSED | XKB_STATE_MODS_LATCHED); |
93 | if (mask & state->xkb.masks[i]) { | 71 | |
94 | state->xkb.modifiers |= XKB_MODS[i]; | ||
95 | } | ||
96 | } | ||
97 | } | 72 | } |
98 | 73 | ||
99 | static void keyboard_repeat_info(void *data, struct wl_keyboard *wl_keyboard, | 74 | static void keyboard_repeat_info(void *data, struct wl_keyboard *wl_keyboard, |