浏览代码

synchronize with latest glx fixes

David Rose 17 年之前
父节点
当前提交
5ff71bc8df
共有 2 个文件被更改,包括 153 次插入9 次删除
  1. 151 8
      panda/src/tinydisplay/tinyXGraphicsWindow.cxx
  2. 2 1
      panda/src/tinydisplay/tinyXGraphicsWindow.h

+ 151 - 8
panda/src/tinydisplay/tinyXGraphicsWindow.cxx

@@ -1250,7 +1250,7 @@ handle_keystroke(XKeyEvent &event) {
 
 
   } else {
   } else {
     // Without an input context, just get the ascii keypress.
     // 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()) {
     if (button.has_ascii_equivalent()) {
       _input_devices[0].keystroke(button.get_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);
   _input_devices[0].set_pointer_in_window(event.x, event.y);
 
 
   // Now get the raw unshifted button.
   // 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()) {
   if (button != ButtonHandle::none()) {
     _input_devices[0].button_down(button);
     _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);
   _input_devices[0].set_pointer_in_window(event.x, event.y);
 
 
   // Now get the raw unshifted button.
   // 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()) {
   if (button != ButtonHandle::none()) {
     _input_devices[0].button_up(button);
     _input_devices[0].button_up(button);
   }
   }
@@ -1298,18 +1316,107 @@ handle_keyrelease(XKeyEvent &event) {
 //               keyboard button indicated by the given key event.
 //               keyboard button indicated by the given key event.
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
 ButtonHandle TinyXGraphicsWindow::
 ButtonHandle TinyXGraphicsWindow::
-get_button(XKeyEvent &key_event) {
+get_button(XKeyEvent &key_event, bool allow_shift) {
   KeySym key = XLookupKeysym(&key_event, 0);
   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) {
   switch (key) {
   case XK_BackSpace:
   case XK_BackSpace:
     return KeyboardButton::backspace();
     return KeyboardButton::backspace();
   case XK_Tab:
   case XK_Tab:
+  case XK_KP_Tab:
     return KeyboardButton::tab();
     return KeyboardButton::tab();
   case XK_Return:
   case XK_Return:
+  case XK_KP_Enter:
     return KeyboardButton::enter();
     return KeyboardButton::enter();
   case XK_Escape:
   case XK_Escape:
     return KeyboardButton::escape();
     return KeyboardButton::escape();
+  case XK_KP_Space:
   case XK_space:
   case XK_space:
     return KeyboardButton::space();
     return KeyboardButton::space();
   case XK_exclam:
   case XK_exclam:
@@ -1331,36 +1438,52 @@ get_button(XKeyEvent &key_event) {
   case XK_parenright:
   case XK_parenright:
     return KeyboardButton::ascii_key(')');
     return KeyboardButton::ascii_key(')');
   case XK_asterisk:
   case XK_asterisk:
+  case XK_KP_Multiply:
     return KeyboardButton::ascii_key('*');
     return KeyboardButton::ascii_key('*');
   case XK_plus:
   case XK_plus:
+  case XK_KP_Add:
     return KeyboardButton::ascii_key('+');
     return KeyboardButton::ascii_key('+');
   case XK_comma:
   case XK_comma:
+  case XK_KP_Separator:
     return KeyboardButton::ascii_key(',');
     return KeyboardButton::ascii_key(',');
   case XK_minus:
   case XK_minus:
+  case XK_KP_Subtract:
     return KeyboardButton::ascii_key('-');
     return KeyboardButton::ascii_key('-');
   case XK_period:
   case XK_period:
+  case XK_KP_Decimal:
     return KeyboardButton::ascii_key('.');
     return KeyboardButton::ascii_key('.');
   case XK_slash:
   case XK_slash:
+  case XK_KP_Divide:
     return KeyboardButton::ascii_key('/');
     return KeyboardButton::ascii_key('/');
   case XK_0:
   case XK_0:
+  case XK_KP_0:
     return KeyboardButton::ascii_key('0');
     return KeyboardButton::ascii_key('0');
   case XK_1:
   case XK_1:
+  case XK_KP_1:
     return KeyboardButton::ascii_key('1');
     return KeyboardButton::ascii_key('1');
   case XK_2:
   case XK_2:
+  case XK_KP_2:
     return KeyboardButton::ascii_key('2');
     return KeyboardButton::ascii_key('2');
   case XK_3:
   case XK_3:
+  case XK_KP_3:
     return KeyboardButton::ascii_key('3');
     return KeyboardButton::ascii_key('3');
   case XK_4:
   case XK_4:
+  case XK_KP_4:
     return KeyboardButton::ascii_key('4');
     return KeyboardButton::ascii_key('4');
   case XK_5:
   case XK_5:
+  case XK_KP_5:
     return KeyboardButton::ascii_key('5');
     return KeyboardButton::ascii_key('5');
   case XK_6:
   case XK_6:
+  case XK_KP_6:
     return KeyboardButton::ascii_key('6');
     return KeyboardButton::ascii_key('6');
   case XK_7:
   case XK_7:
+  case XK_KP_7:
     return KeyboardButton::ascii_key('7');
     return KeyboardButton::ascii_key('7');
   case XK_8:
   case XK_8:
+  case XK_KP_8:
     return KeyboardButton::ascii_key('8');
     return KeyboardButton::ascii_key('8');
   case XK_9:
   case XK_9:
+  case XK_KP_9:
     return KeyboardButton::ascii_key('9');
     return KeyboardButton::ascii_key('9');
   case XK_colon:
   case XK_colon:
     return KeyboardButton::ascii_key(':');
     return KeyboardButton::ascii_key(':');
@@ -1369,6 +1492,7 @@ get_button(XKeyEvent &key_event) {
   case XK_less:
   case XK_less:
     return KeyboardButton::ascii_key('<');
     return KeyboardButton::ascii_key('<');
   case XK_equal:
   case XK_equal:
+  case XK_KP_Equal:
     return KeyboardButton::ascii_key('=');
     return KeyboardButton::ascii_key('=');
   case XK_greater:
   case XK_greater:
     return KeyboardButton::ascii_key('>');
     return KeyboardButton::ascii_key('>');
@@ -1501,12 +1625,16 @@ get_button(XKeyEvent &key_event) {
   case XK_asciitilde:
   case XK_asciitilde:
     return KeyboardButton::ascii_key('~');
     return KeyboardButton::ascii_key('~');
   case XK_F1:
   case XK_F1:
+  case XK_KP_F1:
     return KeyboardButton::f1();
     return KeyboardButton::f1();
   case XK_F2:
   case XK_F2:
+  case XK_KP_F2:
     return KeyboardButton::f2();
     return KeyboardButton::f2();
   case XK_F3:
   case XK_F3:
+  case XK_KP_F3:
     return KeyboardButton::f3();
     return KeyboardButton::f3();
   case XK_F4:
   case XK_F4:
+  case XK_KP_F4:
     return KeyboardButton::f4();
     return KeyboardButton::f4();
   case XK_F5:
   case XK_F5:
     return KeyboardButton::f5();
     return KeyboardButton::f5();
@@ -1554,15 +1682,26 @@ get_button(XKeyEvent &key_event) {
   case XK_KP_Delete:
   case XK_KP_Delete:
   case XK_Delete:
   case XK_Delete:
     return KeyboardButton::del();
     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:
   case XK_Shift_L:
+    return KeyboardButton::lshift();
   case XK_Shift_R:
   case XK_Shift_R:
-    return KeyboardButton::shift();
+    return KeyboardButton::rshift();
   case XK_Control_L:
   case XK_Control_L:
+    return KeyboardButton::lcontrol();
   case XK_Control_R:
   case XK_Control_R:
-    return KeyboardButton::control();
+    return KeyboardButton::rcontrol();
   case XK_Alt_L:
   case XK_Alt_L:
+    return KeyboardButton::lalt();
   case XK_Alt_R:
   case XK_Alt_R:
-    return KeyboardButton::alt();
+    return KeyboardButton::ralt();
   case XK_Meta_L:
   case XK_Meta_L:
   case XK_Meta_R:
   case XK_Meta_R:
     return KeyboardButton::meta();
     return KeyboardButton::meta();
@@ -1588,7 +1727,11 @@ get_mouse_button(XButtonEvent &button_event) {
     return MouseButton::wheel_up();
     return MouseButton::wheel_up();
   } else if (index == x_wheel_down_button) {
   } else if (index == x_wheel_down_button) {
     return MouseButton::wheel_down();
     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);
     return MouseButton::button(index - 1);
   }
   }
 }
 }

+ 2 - 1
panda/src/tinydisplay/tinyXGraphicsWindow.h

@@ -62,7 +62,8 @@ private:
   void handle_keypress(XKeyEvent &event);
   void handle_keypress(XKeyEvent &event);
   void handle_keyrelease(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);
   ButtonHandle get_mouse_button(XButtonEvent &button_event);
 
 
   static Bool check_event(Display *display, XEvent *event, char *arg);
   static Bool check_event(Display *display, XEvent *event, char *arg);