diff options
author | Michael Stapelberg <michael@stapelberg.de> | 2010-11-08 14:39:53 +0100 |
---|---|---|
committer | Michael Stapelberg <michael@stapelberg.de> | 2010-11-08 14:43:07 +0100 |
commit | f891929d34b1ddad224550c1dbf15c542e59c106 (patch) | |
tree | 7bbf4300b77138f5f06c787b96d6f7cf4d7c10f2 /i3lock.c | |
parent | 3a22727bffbf9519ed81e7cce7a73ed0774788db (diff) |
Bugfix: Handle numpad keys correctly (Thanks Pascal)
Diffstat (limited to 'i3lock.c')
-rw-r--r-- | i3lock.c | 31 |
1 files changed, 20 insertions, 11 deletions
@@ -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)); |