Browse Source

a bit more osx keyboard/mouse support

David Rose 19 năm trước cách đây
mục cha
commit
9744dbfc0b

+ 16 - 8
panda/src/osxdisplay/osxGraphicsWindow.cxx

@@ -1325,7 +1325,7 @@ void osxGraphicsWindow::SystemSetWindowForground(bool forground)
      case 121:  nk = KeyboardButton::page_down();				  break;
      case 115:  nk = KeyboardButton::home();				  break;
      case 119:  nk = KeyboardButton::end();				  break;
-         //	case    :  nk = KeyboardButton::insert();			  break;			
+     case 114:  nk = KeyboardButton::help();			  break;			
      case 117:  nk = KeyboardButton::del();			  break;			
 
          //	case  71:  nk = KeyboardButton::num_lock()        break; 
@@ -1358,13 +1358,18 @@ void osxGraphicsWindow::SystemSetWindowForground(bool forground)
      case  44:  nk = KeyboardButton::ascii_key('/');				  break;
 
      default:
-         //		 printf (" Untranslated KeyCode: %lu (0x%lX)\n", key, key);
-         // not sure this is right .. but no mapping for keypad and such
-         // this at least does a best gess..
-
-         char charCode =  0;	
-         if(GetEventParameter( event, kEventParamKeyMacCharCodes, typeChar, nil, sizeof( charCode ), nil, &charCode ) == noErr)
-             nk = KeyboardButton::ascii_key(charCode);	
+       if (osxdisplay_cat.is_debug()) {
+         osxdisplay_cat.debug()
+           << " Untranslated KeyCode: " << key
+           << " (0x" << hex << key << dec << ")\n";
+       }
+
+       // not sure this is right .. but no mapping for keypad and such
+       // this at least does a best gess..
+       
+       char charCode =  0;	
+       if(GetEventParameter( event, kEventParamKeyMacCharCodes, typeChar, nil, sizeof( charCode ), nil, &charCode ) == noErr)
+         nk = KeyboardButton::ascii_key(charCode);	
      }
      return nk;
  }
@@ -1386,6 +1391,9 @@ void osxGraphicsWindow::SystemSetWindowForground(bool forground)
 
      if ((changed & (controlKey | rightControlKey)) != 0) 
 		SendKeyEvent(KeyboardButton::control(),(newModifiers & (controlKey | rightControlKey)) != 0);
+
+     if ((changed & cmdKey) != 0) 
+		SendKeyEvent(KeyboardButton::meta(),(newModifiers & cmdKey) != 0);
 	
     if ((changed & alphaLock) != 0) 
 		SendKeyEvent(KeyboardButton::caps_lock(),(newModifiers & alphaLock) != 0);

+ 2 - 0
panda/src/putil/keyboardButton.cxx

@@ -82,6 +82,7 @@ DEFINE_KEYBD_BUTTON_HANDLE(home)
 DEFINE_KEYBD_BUTTON_HANDLE(end)
 DEFINE_KEYBD_BUTTON_HANDLE(insert)
 DEFINE_KEYBD_BUTTON_HANDLE(del)
+DEFINE_KEYBD_BUTTON_HANDLE(help)
 DEFINE_KEYBD_BUTTON_HANDLE(meta)
 DEFINE_KEYBD_BUTTON_HANDLE(caps_lock)
 DEFINE_KEYBD_BUTTON_HANDLE(shift_lock)
@@ -142,6 +143,7 @@ init_keyboard_buttons() {
   ButtonRegistry::ptr()->register_button(_home, "home");
   ButtonRegistry::ptr()->register_button(_end, "end");
   ButtonRegistry::ptr()->register_button(_insert, "insert");
+  ButtonRegistry::ptr()->register_button(_help, "help");
 
   ButtonRegistry::ptr()->register_button(_shift, "shift");
   ButtonRegistry::ptr()->register_button(_control, "control");

+ 1 - 0
panda/src/putil/keyboardButton.h

@@ -63,6 +63,7 @@ PUBLISHED:
   static ButtonHandle end();
   static ButtonHandle insert();
   static ButtonHandle del();  // delete is a C++ keyword.
+  static ButtonHandle help();
 
   static ButtonHandle shift();
   static ButtonHandle control();

+ 33 - 11
panda/src/tform/trackball.cxx

@@ -25,6 +25,7 @@
 #include "modifierButtons.h"
 #include "linmath_events.h"
 #include "mouseButton.h"
+#include "keyboardButton.h"
 
 TypeHandle Trackball::_type_handle;
 
@@ -32,8 +33,6 @@ TypeHandle Trackball::_type_handle;
 #define B1_MASK 0x01
 #define B2_MASK 0x02
 #define B3_MASK 0x04
-#define B4_MASK 0x08
-#define B5_MASK 0x10
 
 ////////////////////////////////////////////////////////////////////
 //     Function: Trackball::Constructor
@@ -66,8 +65,14 @@ Trackball(const string &name) :
   watch_button(MouseButton::one());
   watch_button(MouseButton::two());
   watch_button(MouseButton::three());
-  watch_button(MouseButton::four());
-  watch_button(MouseButton::five());
+
+  // In OSX mode, we need to use the command and option key in
+  // conjunction with the (one) mouse button.  We can go ahead and
+  // keep this code live in other platforms too; it doesn't do any
+  // harm.
+  watch_button(KeyboardButton::meta());
+  watch_button(KeyboardButton::alt());
+  watch_button(KeyboardButton::control());
 }
 
 ////////////////////////////////////////////////////////////////////
@@ -553,7 +558,30 @@ do_transmit_data(DataGraphTraverser *, const DataNodeTransmit &input,
     int this_button = 0;
     
     if (is_down(MouseButton::one())) {
-      this_button |= B1_MASK;
+      if (is_down(KeyboardButton::meta())) {
+        // Wait, the user is holding down the command key in
+        // conjunction with mouse button 1.  This changes its meaning
+        // to either mouse 2 and/or mouse 3, according to whether the
+        // alt or control key is also held down.
+            
+        if (is_down(KeyboardButton::alt())) {
+          // Command + alt: B2 + B3.
+          this_button |= B2_MASK | B3_MASK;
+
+        } else if (is_down(KeyboardButton::control())) {
+          // Command + control: B2.
+          this_button |= B2_MASK;
+
+        } else {
+          // Command key by itself: B3.
+          this_button |= B3_MASK;
+        }
+
+      } else {
+        // Without the command key, a mouse 1 button is a mouse 1
+        // button.
+        this_button |= B1_MASK;
+      }
     }
     if (is_down(MouseButton::two())) {
       this_button |= B2_MASK;
@@ -561,12 +589,6 @@ do_transmit_data(DataGraphTraverser *, const DataNodeTransmit &input,
     if (is_down(MouseButton::three())) {
       this_button |= B3_MASK;
     }
-    if (is_down(MouseButton::four())) {
-      this_button |= B4_MASK;
-    }
-    if (is_down(MouseButton::five())) {
-      this_button |= B5_MASK;
-    }
     
     float x = this_x - _lastx;
     float y = this_y - _lasty;