Browse Source

Bugfix: Handle numpad keys correctly (Thanks Pascal)

master
Michael Stapelberg 14 years ago
parent
commit
f891929d34
  1. 31
      i3lock.c
  2. 4
      keysym2ucs.c

31
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) { static void handle_key_press(xcb_key_press_event_t *event) {
//printf("keypress %d, state raw = %d\n", event->detail, event->state); //printf("keypress %d, state raw = %d\n", event->detail, event->state);
/* fix state */ xcb_keysym_t sym0, sym1, sym;
if (modeswitch_active) if (modeswitch_active) {
event->state |= modeswitchmask; sym0 = xcb_key_press_lookup_keysym(symbols, event, 4);
sym1 = xcb_key_press_lookup_keysym(symbols, event, 5);
/* Apparantly, after activating numlock once, the numlock modifier } else {
* stays turned on (use xev(1) to verify). So, to resolve useful sym0 = xcb_key_press_lookup_keysym(symbols, event, 0);
* keysyms, we remove the numlock flag from the event state */ sym1 = xcb_key_press_lookup_keysym(symbols, event, 1);
event->state &= ~numlockmask; }
switch (sym0) {
xcb_keysym_t sym = xcb_key_press_lookup_keysym(symbols, event, event->state);
switch (sym) {
case XK_Mode_switch: case XK_Mode_switch:
//printf("Mode switch enabled\n"); //printf("Mode switch enabled\n");
modeswitch_active = true; modeswitch_active = true;
@ -157,6 +155,17 @@ static void handle_key_press(xcb_key_press_event_t *event) {
if ((input_position + 8) >= sizeof(password)) if ((input_position + 8) >= sizeof(password))
return; 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 #if 0
/* FIXME: handle all of these? */ /* FIXME: handle all of these? */
printf("is_keypad_key = %d\n", xcb_is_keypad_key(sym)); printf("is_keypad_key = %d\n", xcb_is_keypad_key(sym));

4
keysym2ucs.c

@ -825,6 +825,10 @@ long keysym2ucs(xcb_keysym_t keysym)
(keysym >= 0x00a0 && keysym <= 0x00ff)) (keysym >= 0x00a0 && keysym <= 0x00ff))
return keysym; 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 */ /* also check for directly encoded 24-bit UCS characters */
if ((keysym & 0xff000000) == 0x01000000) if ((keysym & 0xff000000) == 0x01000000)
return keysym & 0x00ffffff; return keysym & 0x00ffffff;

Loading…
Cancel
Save