|
|
@@ -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();
|