Browse Source

android: handle right mouse button, more external keyboard keys

rdb 7 years ago
parent
commit
18afcdbd0a

+ 82 - 6
panda/src/androiddisplay/androidGraphicsWindow.cxx

@@ -44,7 +44,8 @@ AndroidGraphicsWindow(GraphicsEngine *engine, GraphicsPipe *pipe,
                       int flags,
                       GraphicsStateGuardian *gsg,
                       GraphicsOutput *host) :
-  GraphicsWindow(engine, pipe, name, fb_prop, win_prop, flags, gsg, host)
+  GraphicsWindow(engine, pipe, name, fb_prop, win_prop, flags, gsg, host),
+  _mouse_button_state(0)
 {
   AndroidGraphicsPipe *android_pipe;
   DCAST_INTO_V(android_pipe, _pipe);
@@ -533,10 +534,29 @@ handle_motion_event(const AInputEvent *event) {
   int32_t action = AMotionEvent_getAction(event);
   action &= AMOTION_EVENT_ACTION_MASK;
 
-  if (action == AMOTION_EVENT_ACTION_DOWN) {
-    _input_devices[0].button_down(MouseButton::one());
-  } else if (action == AMOTION_EVENT_ACTION_UP) {
-    _input_devices[0].button_up(MouseButton::one());
+  if (action == AMOTION_EVENT_ACTION_DOWN ||
+      action == AMOTION_EVENT_ACTION_UP) {
+    // The up event doesn't let us know which button is up, so we need to
+    // keep track of the button state ourselves.
+    int32_t button_state = AMotionEvent_getButtonState(event);
+    int32_t changed = _mouse_button_state ^ button_state;
+    if (changed != 0) {
+      if (changed & AMOTION_EVENT_BUTTON_PRIMARY) {
+        if (button_state & AMOTION_EVENT_BUTTON_PRIMARY) {
+          _input_devices[0].button_down(MouseButton::one());
+        } else {
+          _input_devices[0].button_up(MouseButton::one());
+        }
+      }
+      if (changed & AMOTION_EVENT_BUTTON_SECONDARY) {
+        if (button_state & AMOTION_EVENT_BUTTON_SECONDARY) {
+          _input_devices[0].button_down(MouseButton::three());
+        } else {
+          _input_devices[0].button_up(MouseButton::three());
+        }
+      }
+      _mouse_button_state = button_state;
+    }
   }
 
   float x = AMotionEvent_getX(event, 0) - _app->contentRect.left;
@@ -675,7 +695,7 @@ map_button(int32_t keycode) {
     case AKEYCODE_ENTER:
       return KeyboardButton::enter();
     case AKEYCODE_DEL:
-      return KeyboardButton::del();
+      return KeyboardButton::backspace();
     case AKEYCODE_GRAVE:
       return KeyboardButton::ascii_key('`');
     case AKEYCODE_MINUS:
@@ -703,6 +723,7 @@ map_button(int32_t keycode) {
     case AKEYCODE_PLUS:
       return KeyboardButton::ascii_key('+');
     case AKEYCODE_MENU:
+      return KeyboardButton::menu();
     case AKEYCODE_NOTIFICATION:
     case AKEYCODE_SEARCH:
     case AKEYCODE_MEDIA_PLAY_PAUSE:
@@ -734,6 +755,61 @@ map_button(int32_t keycode) {
     case AKEYCODE_BUTTON_START:
     case AKEYCODE_BUTTON_SELECT:
     case AKEYCODE_BUTTON_MODE:
+      break;
+    case AKEYCODE_ESCAPE:
+      return KeyboardButton::escape();
+    case AKEYCODE_FORWARD_DEL:
+      return KeyboardButton::del();
+    case AKEYCODE_CTRL_LEFT:
+      return KeyboardButton::lcontrol();
+    case AKEYCODE_CTRL_RIGHT:
+      return KeyboardButton::rcontrol();
+    case AKEYCODE_CAPS_LOCK:
+      return KeyboardButton::caps_lock();
+    case AKEYCODE_SCROLL_LOCK:
+      return KeyboardButton::scroll_lock();
+    case AKEYCODE_META_LEFT:
+      return KeyboardButton::lmeta();
+    case AKEYCODE_META_RIGHT:
+      return KeyboardButton::rmeta();
+    case AKEYCODE_FUNCTION:
+      break;
+    case AKEYCODE_SYSRQ:
+      return KeyboardButton::print_screen();
+    case AKEYCODE_BREAK:
+      return KeyboardButton::pause();
+    case AKEYCODE_MOVE_HOME:
+      return KeyboardButton::home();
+    case AKEYCODE_MOVE_END:
+      return KeyboardButton::end();
+    case AKEYCODE_INSERT:
+      return KeyboardButton::insert();
+    case AKEYCODE_F1:
+      return KeyboardButton::f1();
+    case AKEYCODE_F2:
+      return KeyboardButton::f2();
+    case AKEYCODE_F3:
+      return KeyboardButton::f3();
+    case AKEYCODE_F4:
+      return KeyboardButton::f4();
+    case AKEYCODE_F5:
+      return KeyboardButton::f5();
+    case AKEYCODE_F6:
+      return KeyboardButton::f6();
+    case AKEYCODE_F7:
+      return KeyboardButton::f7();
+    case AKEYCODE_F8:
+      return KeyboardButton::f8();
+    case AKEYCODE_F9:
+      return KeyboardButton::f9();
+    case AKEYCODE_F10:
+      return KeyboardButton::f10();
+    case AKEYCODE_F11:
+      return KeyboardButton::f11();
+    case AKEYCODE_F12:
+      return KeyboardButton::f12();
+    case AKEYCODE_NUM_LOCK:
+      return KeyboardButton::num_lock();
     default:
       break;
   }

+ 2 - 0
panda/src/androiddisplay/androidGraphicsWindow.h

@@ -71,6 +71,8 @@ private:
   EGLDisplay _egl_display;
   EGLSurface _egl_surface;
 
+  int32_t _mouse_button_state;
+
   const ARect *rect;
 
 public: