handle keypad buttons

This commit is contained in:
David Rose 2008-06-25 19:31:52 +00:00
parent 080b5176d6
commit 18542336a2
2 changed files with 92 additions and 0 deletions

View File

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

View File

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