|
|
@@ -357,13 +357,11 @@ Keyboard::Key getKey(int keycode, int metastate)
|
|
|
case AKEYCODE_PERIOD:
|
|
|
return Keyboard::KEY_PERIOD;
|
|
|
case AKEYCODE_ALT_LEFT:
|
|
|
- return Keyboard::KEY_LEFT_ALT;
|
|
|
case AKEYCODE_ALT_RIGHT:
|
|
|
- return Keyboard::KEY_RIGHT_ALT;
|
|
|
+ return Keyboard::KEY_ALT;
|
|
|
case AKEYCODE_SHIFT_LEFT:
|
|
|
- return Keyboard::KEY_LEFT_SHIFT;
|
|
|
case AKEYCODE_SHIFT_RIGHT:
|
|
|
- return Keyboard::KEY_RIGHT_SHIFT;
|
|
|
+ return Keyboard::KEY_SHIFT;
|
|
|
case AKEYCODE_TAB:
|
|
|
return Keyboard::KEY_TAB;
|
|
|
case AKEYCODE_SPACE:
|
|
|
@@ -398,33 +396,161 @@ Keyboard::Key getKey(int keycode, int metastate)
|
|
|
return Keyboard::KEY_PG_UP;
|
|
|
case AKEYCODE_PAGE_DOWN:
|
|
|
return Keyboard::KEY_PG_DOWN;
|
|
|
+ case AKEYCODE_MENU:
|
|
|
+ return Keyboard::KEY_MENU;
|
|
|
+ case AKEYCODE_SEARCH:
|
|
|
+ return Keyboard::KEY_SEARCH;
|
|
|
default:
|
|
|
return Keyboard::KEY_NONE;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+/**
|
|
|
+ * Returns the unicode value for the given keycode or zero if the key is not a valid printable character.
|
|
|
+ */
|
|
|
+static int getUnicode(int keycode, int metastate)
|
|
|
+{
|
|
|
+ if (keycode == AKEYCODE_DEL)
|
|
|
+ return 0x0008;
|
|
|
+ // TODO: Doesn't support unicode currently.
|
|
|
+ Keyboard::Key key = getKey(keycode, metastate);
|
|
|
+ switch (key)
|
|
|
+ {
|
|
|
+ case Keyboard::KEY_BACKSPACE:
|
|
|
+ return 0x0008;
|
|
|
+ case Keyboard::KEY_TAB:
|
|
|
+ return 0x0009;
|
|
|
+ case Keyboard::KEY_RETURN:
|
|
|
+ case Keyboard::KEY_KP_ENTER:
|
|
|
+ return 0x000A;
|
|
|
+ case Keyboard::KEY_ESCAPE:
|
|
|
+ return 0x001B;
|
|
|
+ case Keyboard::KEY_SPACE:
|
|
|
+ case Keyboard::KEY_EXCLAM:
|
|
|
+ case Keyboard::KEY_QUOTE:
|
|
|
+ case Keyboard::KEY_NUMBER:
|
|
|
+ case Keyboard::KEY_DOLLAR:
|
|
|
+ case Keyboard::KEY_PERCENT:
|
|
|
+ case Keyboard::KEY_CIRCUMFLEX:
|
|
|
+ case Keyboard::KEY_AMPERSAND:
|
|
|
+ case Keyboard::KEY_APOSTROPHE:
|
|
|
+ case Keyboard::KEY_LEFT_PARENTHESIS:
|
|
|
+ case Keyboard::KEY_RIGHT_PARENTHESIS:
|
|
|
+ case Keyboard::KEY_ASTERISK:
|
|
|
+ case Keyboard::KEY_PLUS:
|
|
|
+ case Keyboard::KEY_COMMA:
|
|
|
+ case Keyboard::KEY_MINUS:
|
|
|
+ case Keyboard::KEY_PERIOD:
|
|
|
+ case Keyboard::KEY_SLASH:
|
|
|
+ case Keyboard::KEY_ZERO:
|
|
|
+ case Keyboard::KEY_ONE:
|
|
|
+ case Keyboard::KEY_TWO:
|
|
|
+ case Keyboard::KEY_THREE:
|
|
|
+ case Keyboard::KEY_FOUR:
|
|
|
+ case Keyboard::KEY_FIVE:
|
|
|
+ case Keyboard::KEY_SIX:
|
|
|
+ case Keyboard::KEY_SEVEN:
|
|
|
+ case Keyboard::KEY_EIGHT:
|
|
|
+ case Keyboard::KEY_NINE:
|
|
|
+ case Keyboard::KEY_COLON:
|
|
|
+ case Keyboard::KEY_SEMICOLON:
|
|
|
+ case Keyboard::KEY_LESS_THAN:
|
|
|
+ case Keyboard::KEY_EQUAL:
|
|
|
+ case Keyboard::KEY_GREATER_THAN:
|
|
|
+ case Keyboard::KEY_QUESTION:
|
|
|
+ case Keyboard::KEY_AT:
|
|
|
+ case Keyboard::KEY_CAPITAL_A:
|
|
|
+ case Keyboard::KEY_CAPITAL_B:
|
|
|
+ case Keyboard::KEY_CAPITAL_C:
|
|
|
+ case Keyboard::KEY_CAPITAL_D:
|
|
|
+ case Keyboard::KEY_CAPITAL_E:
|
|
|
+ case Keyboard::KEY_CAPITAL_F:
|
|
|
+ case Keyboard::KEY_CAPITAL_G:
|
|
|
+ case Keyboard::KEY_CAPITAL_H:
|
|
|
+ case Keyboard::KEY_CAPITAL_I:
|
|
|
+ case Keyboard::KEY_CAPITAL_J:
|
|
|
+ case Keyboard::KEY_CAPITAL_K:
|
|
|
+ case Keyboard::KEY_CAPITAL_L:
|
|
|
+ case Keyboard::KEY_CAPITAL_M:
|
|
|
+ case Keyboard::KEY_CAPITAL_N:
|
|
|
+ case Keyboard::KEY_CAPITAL_O:
|
|
|
+ case Keyboard::KEY_CAPITAL_P:
|
|
|
+ case Keyboard::KEY_CAPITAL_Q:
|
|
|
+ case Keyboard::KEY_CAPITAL_R:
|
|
|
+ case Keyboard::KEY_CAPITAL_S:
|
|
|
+ case Keyboard::KEY_CAPITAL_T:
|
|
|
+ case Keyboard::KEY_CAPITAL_U:
|
|
|
+ case Keyboard::KEY_CAPITAL_V:
|
|
|
+ case Keyboard::KEY_CAPITAL_W:
|
|
|
+ case Keyboard::KEY_CAPITAL_X:
|
|
|
+ case Keyboard::KEY_CAPITAL_Y:
|
|
|
+ case Keyboard::KEY_CAPITAL_Z:
|
|
|
+ case Keyboard::KEY_LEFT_BRACKET:
|
|
|
+ case Keyboard::KEY_BACK_SLASH:
|
|
|
+ case Keyboard::KEY_RIGHT_BRACKET:
|
|
|
+ case Keyboard::KEY_UNDERSCORE:
|
|
|
+ case Keyboard::KEY_GRAVE:
|
|
|
+ case Keyboard::KEY_A:
|
|
|
+ case Keyboard::KEY_B:
|
|
|
+ case Keyboard::KEY_C:
|
|
|
+ case Keyboard::KEY_D:
|
|
|
+ case Keyboard::KEY_E:
|
|
|
+ case Keyboard::KEY_F:
|
|
|
+ case Keyboard::KEY_G:
|
|
|
+ case Keyboard::KEY_H:
|
|
|
+ case Keyboard::KEY_I:
|
|
|
+ case Keyboard::KEY_J:
|
|
|
+ case Keyboard::KEY_K:
|
|
|
+ case Keyboard::KEY_L:
|
|
|
+ case Keyboard::KEY_M:
|
|
|
+ case Keyboard::KEY_N:
|
|
|
+ case Keyboard::KEY_O:
|
|
|
+ case Keyboard::KEY_P:
|
|
|
+ case Keyboard::KEY_Q:
|
|
|
+ case Keyboard::KEY_R:
|
|
|
+ case Keyboard::KEY_S:
|
|
|
+ case Keyboard::KEY_T:
|
|
|
+ case Keyboard::KEY_U:
|
|
|
+ case Keyboard::KEY_V:
|
|
|
+ case Keyboard::KEY_W:
|
|
|
+ case Keyboard::KEY_X:
|
|
|
+ case Keyboard::KEY_Y:
|
|
|
+ case Keyboard::KEY_Z:
|
|
|
+ case Keyboard::KEY_LEFT_BRACE:
|
|
|
+ case Keyboard::KEY_BAR:
|
|
|
+ case Keyboard::KEY_RIGHT_BRACE:
|
|
|
+ case Keyboard::KEY_TILDE:
|
|
|
+ return key;
|
|
|
+ default:
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
// Process the next input event.
|
|
|
static int32_t engine_handle_input(struct android_app* app, AInputEvent* event)
|
|
|
{
|
|
|
if (AInputEvent_getType(event) == AINPUT_EVENT_TYPE_MOTION)
|
|
|
{
|
|
|
int32_t data = AMotionEvent_getAction(event);
|
|
|
- int contactIndex = data >> AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT;
|
|
|
Touch::TouchEvent touchEvent;
|
|
|
- switch (data & AMOTION_EVENT_ACTION_MASK)
|
|
|
+ size_t pointerCount = AMotionEvent_getPointerCount(event);
|
|
|
+ for (size_t i = 0; i < pointerCount; ++i)
|
|
|
{
|
|
|
- case AMOTION_EVENT_ACTION_DOWN:
|
|
|
- touchEvent = Touch::TOUCH_PRESS;
|
|
|
- break;
|
|
|
- case AMOTION_EVENT_ACTION_UP:
|
|
|
- touchEvent = Touch::TOUCH_RELEASE;
|
|
|
- break;
|
|
|
- case AMOTION_EVENT_ACTION_MOVE:
|
|
|
- touchEvent = Touch::TOUCH_MOVE;
|
|
|
- break;
|
|
|
+ switch (data & AMOTION_EVENT_ACTION_MASK)
|
|
|
+ {
|
|
|
+ case AMOTION_EVENT_ACTION_DOWN:
|
|
|
+ touchEvent = Touch::TOUCH_PRESS;
|
|
|
+ break;
|
|
|
+ case AMOTION_EVENT_ACTION_UP:
|
|
|
+ touchEvent = Touch::TOUCH_RELEASE;
|
|
|
+ break;
|
|
|
+ case AMOTION_EVENT_ACTION_MOVE:
|
|
|
+ touchEvent = Touch::TOUCH_MOVE;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ size_t pointerId = AMotionEvent_getPointerId(event, i);
|
|
|
+ Game::getInstance()->touchEvent(touchEvent, AMotionEvent_getX(event, i), AMotionEvent_getY(event, i), pointerId);
|
|
|
}
|
|
|
-
|
|
|
- Game::getInstance()->touchEvent(touchEvent, AMotionEvent_getX(event, 0), AMotionEvent_getY(event, 0), contactIndex);
|
|
|
return 1;
|
|
|
}
|
|
|
else if (AInputEvent_getType(event) == AINPUT_EVENT_TYPE_KEY)
|
|
|
@@ -437,6 +563,8 @@ static int32_t engine_handle_input(struct android_app* app, AInputEvent* event)
|
|
|
{
|
|
|
case AKEY_EVENT_ACTION_DOWN:
|
|
|
Game::getInstance()->keyEvent(Keyboard::KEY_PRESS, getKey(keycode, metastate));
|
|
|
+ if (int character = getUnicode(keycode, metastate))
|
|
|
+ Game::getInstance()->keyEvent(Keyboard::KEY_CHAR, character);
|
|
|
break;
|
|
|
|
|
|
case AKEY_EVENT_ACTION_UP:
|