aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLibravatar Dominique Martinet <asmadeus@codewreck.org>2018-06-08 21:58:01 +0900
committerLibravatar Dominique Martinet <asmadeus@codewreck.org>2018-06-08 22:42:15 +0900
commitc78ce0770a8c75d63853c6c85f789b68f56ee3ed (patch)
tree578c0249b9ecf8eb8579b828862db3107d1a22bd
parentMerge pull request #2119 from martinetd/gcc-strtruncation (diff)
downloadsway-c78ce0770a8c75d63853c6c85f789b68f56ee3ed.tar.gz
sway-c78ce0770a8c75d63853c6c85f789b68f56ee3ed.tar.zst
sway-c78ce0770a8c75d63853c6c85f789b68f56ee3ed.zip
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
-rw-r--r--include/swaylock/seat.h26
-rw-r--r--swaylock/password.c8
-rw-r--r--swaylock/seat.c39
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
5enum 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
16enum 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
28struct swaylock_xkb { 5struct 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
37extern const struct wl_seat_listener seat_listener; 13extern 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
10const 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
21const 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
32static void keyboard_keymap(void *data, struct wl_keyboard *wl_keyboard, 10static 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
99static void keyboard_repeat_info(void *data, struct wl_keyboard *wl_keyboard, 74static void keyboard_repeat_info(void *data, struct wl_keyboard *wl_keyboard,