Modules/Graphics/private/android/AndroidKeys.cpp
Шурупов Илья Викторович 5817d4e7bf Add an Android window
AndroidWindow implements the platform window on native_app_glue: it
follows the window lifecycle, scales by screen density, delivers touch,
pen, mouse, scroll and keyboard input with pressure, tilt and batched
history, shows the soft keyboard for text fields, and keeps a local
clipboard. runAndroidApplication unpacks bundled assets into the app's
data directory and runs an application entry from android_main. The
Graphics window library, ImGui and native_app_glue now build for
Android.
2026-10-17 09:19:48 +03:00

128 lines
4.5 KiB
C++

#include "AndroidKeys.hpp"
#include <android/keycodes.h>
#include <unordered_map>
namespace tp::android {
namespace {
const std::unordered_map<int32_t, InputID>& keyCodes() {
static const std::unordered_map<int32_t, InputID> keys = {
{ AKEYCODE_SPACE, InputID::SPACE },
{ AKEYCODE_APOSTROPHE, InputID::APOSTROPHE },
{ AKEYCODE_COMMA, InputID::COMMA },
{ AKEYCODE_MINUS, InputID::MINUS },
{ AKEYCODE_PERIOD, InputID::PERIOD },
{ AKEYCODE_SLASH, InputID::SLASH },
{ AKEYCODE_0, InputID::N0 },
{ AKEYCODE_1, InputID::N1 },
{ AKEYCODE_2, InputID::N2 },
{ AKEYCODE_3, InputID::N3 },
{ AKEYCODE_4, InputID::N4 },
{ AKEYCODE_5, InputID::N5 },
{ AKEYCODE_6, InputID::N6 },
{ AKEYCODE_7, InputID::N7 },
{ AKEYCODE_8, InputID::N8 },
{ AKEYCODE_9, InputID::N9 },
{ AKEYCODE_SEMICOLON, InputID::SEMICOLON },
{ AKEYCODE_EQUALS, InputID::EQUAL },
{ AKEYCODE_A, InputID::A },
{ AKEYCODE_B, InputID::B },
{ AKEYCODE_C, InputID::C },
{ AKEYCODE_D, InputID::D },
{ AKEYCODE_E, InputID::E },
{ AKEYCODE_F, InputID::F },
{ AKEYCODE_G, InputID::G },
{ AKEYCODE_H, InputID::H },
{ AKEYCODE_I, InputID::I },
{ AKEYCODE_J, InputID::J },
{ AKEYCODE_K, InputID::K },
{ AKEYCODE_L, InputID::L },
{ AKEYCODE_M, InputID::M },
{ AKEYCODE_N, InputID::N },
{ AKEYCODE_O, InputID::O },
{ AKEYCODE_P, InputID::P },
{ AKEYCODE_Q, InputID::Q },
{ AKEYCODE_R, InputID::R },
{ AKEYCODE_S, InputID::S },
{ AKEYCODE_T, InputID::T },
{ AKEYCODE_U, InputID::U },
{ AKEYCODE_V, InputID::V },
{ AKEYCODE_W, InputID::W },
{ AKEYCODE_X, InputID::X },
{ AKEYCODE_Y, InputID::Y },
{ AKEYCODE_Z, InputID::Z },
{ AKEYCODE_LEFT_BRACKET, InputID::LEFT_BRACKET },
{ AKEYCODE_BACKSLASH, InputID::BACKSLASH },
{ AKEYCODE_RIGHT_BRACKET, InputID::RIGHT_BRACKET },
{ AKEYCODE_GRAVE, InputID::GRAVE_ACCENT },
{ AKEYCODE_ESCAPE, InputID::ESCAPE },
{ AKEYCODE_ENTER, InputID::ENTER },
{ AKEYCODE_TAB, InputID::TAB },
{ AKEYCODE_DEL, InputID::BACKSPACE },
{ AKEYCODE_INSERT, InputID::INSERT },
{ AKEYCODE_FORWARD_DEL, InputID::DELETE_KEY },
{ AKEYCODE_DPAD_RIGHT, InputID::RIGHT },
{ AKEYCODE_DPAD_LEFT, InputID::LEFT },
{ AKEYCODE_DPAD_DOWN, InputID::DOWN },
{ AKEYCODE_DPAD_UP, InputID::UP },
{ AKEYCODE_PAGE_UP, InputID::PAGE_UP },
{ AKEYCODE_PAGE_DOWN, InputID::PAGE_DOWN },
{ AKEYCODE_MOVE_HOME, InputID::HOME },
{ AKEYCODE_MOVE_END, InputID::END },
{ AKEYCODE_CAPS_LOCK, InputID::CAPS_LOCK },
{ AKEYCODE_SCROLL_LOCK, InputID::SCROLL_LOCK },
{ AKEYCODE_NUM_LOCK, InputID::NUM_LOCK },
{ AKEYCODE_SYSRQ, InputID::PRINT_SCREEN },
{ AKEYCODE_BREAK, InputID::PAUSE },
{ AKEYCODE_F1, InputID::F1 },
{ AKEYCODE_F2, InputID::F2 },
{ AKEYCODE_F3, InputID::F3 },
{ AKEYCODE_F4, InputID::F4 },
{ AKEYCODE_F5, InputID::F5 },
{ AKEYCODE_F6, InputID::F6 },
{ AKEYCODE_F7, InputID::F7 },
{ AKEYCODE_F8, InputID::F8 },
{ AKEYCODE_F9, InputID::F9 },
{ AKEYCODE_F10, InputID::F10 },
{ AKEYCODE_F11, InputID::F11 },
{ AKEYCODE_F12, InputID::F12 },
{ AKEYCODE_NUMPAD_0, InputID::KP_0 },
{ AKEYCODE_NUMPAD_1, InputID::KP_1 },
{ AKEYCODE_NUMPAD_2, InputID::KP_2 },
{ AKEYCODE_NUMPAD_3, InputID::KP_3 },
{ AKEYCODE_NUMPAD_4, InputID::KP_4 },
{ AKEYCODE_NUMPAD_5, InputID::KP_5 },
{ AKEYCODE_NUMPAD_6, InputID::KP_6 },
{ AKEYCODE_NUMPAD_7, InputID::KP_7 },
{ AKEYCODE_NUMPAD_8, InputID::KP_8 },
{ AKEYCODE_NUMPAD_9, InputID::KP_9 },
{ AKEYCODE_NUMPAD_DOT, InputID::KP_DECIMAL },
{ AKEYCODE_NUMPAD_DIVIDE, InputID::KP_DIVIDE },
{ AKEYCODE_NUMPAD_MULTIPLY, InputID::KP_MULTIPLY },
{ AKEYCODE_NUMPAD_SUBTRACT, InputID::KP_SUBTRACT },
{ AKEYCODE_NUMPAD_ADD, InputID::KP_ADD },
{ AKEYCODE_NUMPAD_ENTER, InputID::KP_ENTER },
{ AKEYCODE_NUMPAD_EQUALS, InputID::KP_EQUAL },
{ AKEYCODE_SHIFT_LEFT, InputID::LEFT_SHIFT },
{ AKEYCODE_CTRL_LEFT, InputID::LEFT_CONTROL },
{ AKEYCODE_ALT_LEFT, InputID::LEFT_ALT },
{ AKEYCODE_META_LEFT, InputID::LEFT_SUPER },
{ AKEYCODE_SHIFT_RIGHT, InputID::RIGHT_SHIFT },
{ AKEYCODE_CTRL_RIGHT, InputID::RIGHT_CONTROL },
{ AKEYCODE_ALT_RIGHT, InputID::RIGHT_ALT },
{ AKEYCODE_META_RIGHT, InputID::RIGHT_SUPER },
{ AKEYCODE_MENU, InputID::MENU },
};
return keys;
}
}
std::optional<InputID> inputFromKeyCode(int32_t keyCode) {
const auto& keys = keyCodes();
const auto found = keys.find(keyCode);
if (found == keys.end()) return std::nullopt;
return found->second;
}
}