From 5ff71bc8df0a6b1088781e10bd3db371c6b746f2 Mon Sep 17 00:00:00 2001 From: David Rose Date: Fri, 6 Mar 2009 21:59:15 +0000 Subject: [PATCH] synchronize with latest glx fixes --- panda/src/tinydisplay/tinyXGraphicsWindow.cxx | 159 +++++++++++++++++- panda/src/tinydisplay/tinyXGraphicsWindow.h | 3 +- 2 files changed, 153 insertions(+), 9 deletions(-) diff --git a/panda/src/tinydisplay/tinyXGraphicsWindow.cxx b/panda/src/tinydisplay/tinyXGraphicsWindow.cxx index 961741989c..1c460e09c4 100644 --- a/panda/src/tinydisplay/tinyXGraphicsWindow.cxx +++ b/panda/src/tinydisplay/tinyXGraphicsWindow.cxx @@ -1250,7 +1250,7 @@ handle_keystroke(XKeyEvent &event) { } else { // Without an input context, just get the ascii keypress. - ButtonHandle button = get_button(event); + ButtonHandle button = get_button(event, true); if (button.has_ascii_equivalent()) { _input_devices[0].keystroke(button.get_ascii_equivalent()); } @@ -1268,7 +1268,16 @@ handle_keypress(XKeyEvent &event) { _input_devices[0].set_pointer_in_window(event.x, event.y); // Now get the raw unshifted button. - ButtonHandle button = get_button(event); + ButtonHandle button = get_button(event, false); + if (button == KeyboardButton::lcontrol() || button == KeyboardButton::rcontrol()) { + _input_devices[0].button_down(KeyboardButton::control()); + } + if (button == KeyboardButton::lshift() || button == KeyboardButton::rshift()) { + _input_devices[0].button_down(KeyboardButton::shift()); + } + if (button == KeyboardButton::lalt() || button == KeyboardButton::ralt()) { + _input_devices[0].button_down(KeyboardButton::alt()); + } if (button != ButtonHandle::none()) { _input_devices[0].button_down(button); } @@ -1285,7 +1294,16 @@ handle_keyrelease(XKeyEvent &event) { _input_devices[0].set_pointer_in_window(event.x, event.y); // Now get the raw unshifted button. - ButtonHandle button = get_button(event); + ButtonHandle button = get_button(event, false); + if (button == KeyboardButton::lcontrol() || button == KeyboardButton::rcontrol()) { + _input_devices[0].button_up(KeyboardButton::control()); + } + if (button == KeyboardButton::lshift() || button == KeyboardButton::rshift()) { + _input_devices[0].button_up(KeyboardButton::shift()); + } + if (button == KeyboardButton::lalt() || button == KeyboardButton::ralt()) { + _input_devices[0].button_up(KeyboardButton::alt()); + } if (button != ButtonHandle::none()) { _input_devices[0].button_up(button); } @@ -1298,18 +1316,107 @@ handle_keyrelease(XKeyEvent &event) { // keyboard button indicated by the given key event. //////////////////////////////////////////////////////////////////// ButtonHandle TinyXGraphicsWindow:: -get_button(XKeyEvent &key_event) { +get_button(XKeyEvent &key_event, bool allow_shift) { 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 normal, un-numlocked key. + break; + + default: + break; + } + } + + if (allow_shift) { + // If shift is held down, get the shifted keysym. + if ((key_event.state & ShiftMask) != 0) { + KeySym k2 = XLookupKeysym(&key_event, 1); + ButtonHandle button = map_button(k2); + if (button != ButtonHandle::none()) { + return button; + } + } + + // If caps lock is down, shift lowercase letters to uppercase. We + // can do this in just the ASCII set, because we handle + // international keyboards elsewhere (via an input context). + if ((key_event.state & (ShiftMask | LockMask)) != 0) { + if (key >= XK_a and key <= XK_z) { + key += (XK_A - XK_a); + } + } + } + + 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: @@ -1331,36 +1438,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(':'); @@ -1369,6 +1492,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('>'); @@ -1501,12 +1625,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(); @@ -1554,15 +1682,26 @@ get_button(XKeyEvent &key_event) { case XK_KP_Delete: case XK_Delete: return KeyboardButton::del(); + case XK_Num_Lock: + return KeyboardButton::num_lock(); + case XK_Scroll_Lock: + return KeyboardButton::scroll_lock(); + case XK_Print: + return KeyboardButton::print_screen(); + case XK_Pause: + return KeyboardButton::pause(); case XK_Shift_L: + return KeyboardButton::lshift(); case XK_Shift_R: - return KeyboardButton::shift(); + return KeyboardButton::rshift(); case XK_Control_L: + return KeyboardButton::lcontrol(); case XK_Control_R: - return KeyboardButton::control(); + return KeyboardButton::rcontrol(); case XK_Alt_L: + return KeyboardButton::lalt(); case XK_Alt_R: - return KeyboardButton::alt(); + return KeyboardButton::ralt(); case XK_Meta_L: case XK_Meta_R: return KeyboardButton::meta(); @@ -1588,7 +1727,11 @@ get_mouse_button(XButtonEvent &button_event) { return MouseButton::wheel_up(); } else if (index == x_wheel_down_button) { return MouseButton::wheel_down(); - } else { + } else if (index == x_wheel_left_button) { + return MouseButton::wheel_left(); + } else if (index == x_wheel_right_button) { + return MouseButton::wheel_right(); + } else { return MouseButton::button(index - 1); } } diff --git a/panda/src/tinydisplay/tinyXGraphicsWindow.h b/panda/src/tinydisplay/tinyXGraphicsWindow.h index b5570407c7..835df53335 100644 --- a/panda/src/tinydisplay/tinyXGraphicsWindow.h +++ b/panda/src/tinydisplay/tinyXGraphicsWindow.h @@ -62,7 +62,8 @@ private: void handle_keypress(XKeyEvent &event); void handle_keyrelease(XKeyEvent &event); - ButtonHandle get_button(XKeyEvent &key_event); + ButtonHandle get_button(XKeyEvent &key_event, bool allow_shift); + ButtonHandle map_button(KeySym key); ButtonHandle get_mouse_button(XButtonEvent &button_event); static Bool check_event(Display *display, XEvent *event, char *arg);