diff --git a/panda/src/glxdisplay/glxGraphicsWindow.cxx b/panda/src/glxdisplay/glxGraphicsWindow.cxx index 7e72d26463..2ac49dbd5a 100644 --- a/panda/src/glxdisplay/glxGraphicsWindow.cxx +++ b/panda/src/glxdisplay/glxGraphicsWindow.cxx @@ -1244,6 +1244,7 @@ handle_keypress(XKeyEvent &event) { // Now get the raw unshifted button. ButtonHandle button = get_button(event); + cerr << button << "\n"; if (button != ButtonHandle::none()) { _input_devices[0].button_down(button); } @@ -1276,15 +1277,84 @@ ButtonHandle glxGraphicsWindow:: get_button(XKeyEvent &key_event) { KeySym key = XLookupKeysym(&key_event, 0); + if ((key_event.state & Mod2Mask) != 0) { + // Mod2Mask corresponds to NumLock being in effect. In this case, + // we want to get the alternate keysym associated with any keypad + // keys. Weird system. + KeySym k2; + ButtonHandle button; + switch (key) { + case XK_KP_Space: + case XK_KP_Tab: + case XK_KP_Enter: + case XK_KP_F1: + case XK_KP_F2: + case XK_KP_F3: + case XK_KP_F4: + case XK_KP_Equal: + case XK_KP_Multiply: + case XK_KP_Add: + case XK_KP_Separator: + case XK_KP_Subtract: + case XK_KP_Divide: + case XK_KP_Left: + case XK_KP_Up: + case XK_KP_Right: + case XK_KP_Down: + case XK_KP_Begin: + case XK_KP_Prior: + case XK_KP_Next: + case XK_KP_Home: + case XK_KP_End: + case XK_KP_Insert: + case XK_KP_Delete: + case XK_KP_0: + case XK_KP_1: + case XK_KP_2: + case XK_KP_3: + case XK_KP_4: + case XK_KP_5: + case XK_KP_6: + case XK_KP_7: + case XK_KP_8: + case XK_KP_9: + k2 = XLookupKeysym(&key_event, 1); + button = map_button(k2); + if (button != ButtonHandle::none()) { + return button; + } + // If that didn't produce a button we know, just fall through + // and handle the unshifted key. + break; + + default: + break; + } + } + + return map_button(key); +} + +//////////////////////////////////////////////////////////////////// +// Function: glxGraphicsWindow::map_button +// Access: Private +// Description: Maps from a single X keysym to Panda's ButtonHandle. +// Called by get_button(), above. +//////////////////////////////////////////////////////////////////// +ButtonHandle glxGraphicsWindow:: +map_button(KeySym key) { switch (key) { case XK_BackSpace: return KeyboardButton::backspace(); case XK_Tab: + case XK_KP_Tab: return KeyboardButton::tab(); case XK_Return: + case XK_KP_Enter: return KeyboardButton::enter(); case XK_Escape: return KeyboardButton::escape(); + case XK_KP_Space: case XK_space: return KeyboardButton::space(); case XK_exclam: @@ -1306,36 +1376,52 @@ get_button(XKeyEvent &key_event) { case XK_parenright: return KeyboardButton::ascii_key(')'); case XK_asterisk: + case XK_KP_Multiply: return KeyboardButton::ascii_key('*'); case XK_plus: + case XK_KP_Add: return KeyboardButton::ascii_key('+'); case XK_comma: + case XK_KP_Separator: return KeyboardButton::ascii_key(','); case XK_minus: + case XK_KP_Subtract: return KeyboardButton::ascii_key('-'); case XK_period: + case XK_KP_Decimal: return KeyboardButton::ascii_key('.'); case XK_slash: + case XK_KP_Divide: return KeyboardButton::ascii_key('/'); case XK_0: + case XK_KP_0: return KeyboardButton::ascii_key('0'); case XK_1: + case XK_KP_1: return KeyboardButton::ascii_key('1'); case XK_2: + case XK_KP_2: return KeyboardButton::ascii_key('2'); case XK_3: + case XK_KP_3: return KeyboardButton::ascii_key('3'); case XK_4: + case XK_KP_4: return KeyboardButton::ascii_key('4'); case XK_5: + case XK_KP_5: return KeyboardButton::ascii_key('5'); case XK_6: + case XK_KP_6: return KeyboardButton::ascii_key('6'); case XK_7: + case XK_KP_7: return KeyboardButton::ascii_key('7'); case XK_8: + case XK_KP_8: return KeyboardButton::ascii_key('8'); case XK_9: + case XK_KP_9: return KeyboardButton::ascii_key('9'); case XK_colon: return KeyboardButton::ascii_key(':'); @@ -1344,6 +1430,7 @@ get_button(XKeyEvent &key_event) { case XK_less: return KeyboardButton::ascii_key('<'); case XK_equal: + case XK_KP_Equal: return KeyboardButton::ascii_key('='); case XK_greater: return KeyboardButton::ascii_key('>'); @@ -1476,12 +1563,16 @@ get_button(XKeyEvent &key_event) { case XK_asciitilde: return KeyboardButton::ascii_key('~'); case XK_F1: + case XK_KP_F1: return KeyboardButton::f1(); case XK_F2: + case XK_KP_F2: return KeyboardButton::f2(); case XK_F3: + case XK_KP_F3: return KeyboardButton::f3(); case XK_F4: + case XK_KP_F4: return KeyboardButton::f4(); case XK_F5: return KeyboardButton::f5(); diff --git a/panda/src/glxdisplay/glxGraphicsWindow.h b/panda/src/glxdisplay/glxGraphicsWindow.h index 8aa990ffcb..0dcdbf8bcd 100644 --- a/panda/src/glxdisplay/glxGraphicsWindow.h +++ b/panda/src/glxdisplay/glxGraphicsWindow.h @@ -62,6 +62,7 @@ private: void handle_keyrelease(XKeyEvent &event); ButtonHandle get_button(XKeyEvent &key_event); + ButtonHandle map_button(KeySym key); ButtonHandle get_mouse_button(XButtonEvent &button_event); static Bool check_event(Display *display, XEvent *event, char *arg);