From f891929d34b1ddad224550c1dbf15c542e59c106 Mon Sep 17 00:00:00 2001 From: Michael Stapelberg Date: Mon, 8 Nov 2010 14:39:53 +0100 Subject: [PATCH] Bugfix: Handle numpad keys correctly (Thanks Pascal) --- i3lock.c | 31 ++++++++++++++++++++----------- keysym2ucs.c | 4 ++++ 2 files changed, 24 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)); diff --git a/keysym2ucs.c b/keysym2ucs.c index 3da51ed..9eecf6b 100644 --- a/keysym2ucs.c +++ b/keysym2ucs.c @@ -825,6 +825,10 @@ long keysym2ucs(xcb_keysym_t keysym) (keysym >= 0x00a0 && keysym <= 0x00ff)) return keysym; + /* check for numpad keys (direct mapping) */ + if ((keysym >= 0xff80 && keysym <= 0xffb9)) + return keysym & 0x7F; + /* also check for directly encoded 24-bit UCS characters */ if ((keysym & 0xff000000) == 0x01000000) return keysym & 0x00ffffff;