diff options
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)); |