From f891929d34b1ddad224550c1dbf15c542e59c106 Mon Sep 17 00:00:00 2001 From: Michael Stapelberg Date: Mon, 8 Nov 2010 14:39:53 +0100 Subject: Bugfix: Handle numpad keys correctly (Thanks Pascal) --- i3lock.c | 31 ++++++++++++++++++++----------- 1 file changed, 20 insertions(+), 11 deletions(-) (limited to 'i3lock.c') 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)); -- cgit v1.1