summaryrefslogtreecommitdiff
path: root/i3lock.c
diff options
context:
space:
mode:
authorMichael Stapelberg <michael@stapelberg.de>2010-11-08 14:39:53 +0100
committerMichael Stapelberg <michael@stapelberg.de>2010-11-08 14:43:07 +0100
commitf891929d34b1ddad224550c1dbf15c542e59c106 (patch)
tree7bbf4300b77138f5f06c787b96d6f7cf4d7c10f2 /i3lock.c
parent3a22727bffbf9519ed81e7cce7a73ed0774788db (diff)
Bugfix: Handle numpad keys correctly (Thanks Pascal)
Diffstat (limited to 'i3lock.c')
-rw-r--r--i3lock.c31
1 files changed, 20 insertions, 11 deletions
diff --git a/i3lock.c b/i3lock.c
index 2d2cc89..198d334 100644
--- a/i3lock.c
+++ b/i3lock.c
@@ -120,17 +120,15 @@ static void handle_key_release(xcb_key_release_event_t *event) {
static void handle_key_press(xcb_key_press_event_t *event) {
//printf("keypress %d, state raw = %d\n", event->detail, event->state);
- /* fix state */
- if (modeswitch_active)
- event->state |= modeswitchmask;
-
- /* Apparantly, after activating numlock once, the numlock modifier
- * stays turned on (use xev(1) to verify). So, to resolve useful
- * keysyms, we remove the numlock flag from the event state */
- event->state &= ~numlockmask;
-
- xcb_keysym_t sym = xcb_key_press_lookup_keysym(symbols, event, event->state);
- switch (sym) {
+ xcb_keysym_t sym0, sym1, sym;
+ if (modeswitch_active) {
+ sym0 = xcb_key_press_lookup_keysym(symbols, event, 4);
+ sym1 = xcb_key_press_lookup_keysym(symbols, event, 5);
+ } else {
+ sym0 = xcb_key_press_lookup_keysym(symbols, event, 0);
+ sym1 = xcb_key_press_lookup_keysym(symbols, event, 1);
+ }
+ switch (sym0) {
case XK_Mode_switch:
//printf("Mode switch enabled\n");
modeswitch_active = true;
@@ -157,6 +155,17 @@ static void handle_key_press(xcb_key_press_event_t *event) {
if ((input_position + 8) >= sizeof(password))
return;
+ if ((event->state & numlockmask) && xcb_is_keypad_key(sym1)) {
+ /* this key was a keypad key */
+ if ((event->state & XCB_MOD_MASK_SHIFT))
+ sym = sym0;
+ else sym = sym1;
+ } else {
+ if ((event->state & XCB_MOD_MASK_SHIFT))
+ sym = sym1;
+ else sym = sym0;
+ }
+
#if 0
/* FIXME: handle all of these? */
printf("is_keypad_key = %d\n", xcb_is_keypad_key(sym));