/* Simple DirectMedia Layer Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software. Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. 3. This notice may not be removed or altered from any source distribution. */ #include "SDL_internal.h" #ifdef SDL_VIDEO_DRIVER_ANDROID #include #include "../../events/SDL_events_c.h" #include "SDL_androidkeyboard.h" #include "../../core/android/SDL_android.h" #define TYPE_CLASS_TEXT 0x00000001 #define TYPE_CLASS_NUMBER 0x00000002 #define TYPE_CLASS_PHONE 0x00000003 #define TYPE_CLASS_DATETIME 0x00000004 #define TYPE_DATETIME_VARIATION_NORMAL 0x00000000 #define TYPE_DATETIME_VARIATION_DATE 0x00000010 #define TYPE_DATETIME_VARIATION_TIME 0x00000020 #define TYPE_NUMBER_VARIATION_NORMAL 0x00000000 #define TYPE_NUMBER_VARIATION_PASSWORD 0x00000010 #define TYPE_NUMBER_FLAG_SIGNED 0x00001000 #define TYPE_NUMBER_FLAG_DECIMAL 0x00002000 #define TYPE_TEXT_FLAG_CAP_CHARACTERS 0x00001000 #define TYPE_TEXT_FLAG_CAP_WORDS 0x00002000 #define TYPE_TEXT_FLAG_CAP_SENTENCES 0x00004000 #define TYPE_TEXT_FLAG_AUTO_CORRECT 0x00008000 #define TYPE_TEXT_FLAG_AUTO_COMPLETE 0x00010000 #define TYPE_TEXT_FLAG_MULTI_LINE 0x00020000 #define TYPE_TEXT_FLAG_IME_MULTI_LINE 0x00040000 #define TYPE_TEXT_FLAG_NO_SUGGESTIONS 0x00080000 #define TYPE_TEXT_VARIATION_NORMAL 0x00000000 #define TYPE_TEXT_VARIATION_URI 0x00000010 #define TYPE_TEXT_VARIATION_EMAIL_ADDRESS 0x00000020 #define TYPE_TEXT_VARIATION_EMAIL_SUBJECT 0x00000030 #define TYPE_TEXT_VARIATION_SHORT_MESSAGE 0x00000040 #define TYPE_TEXT_VARIATION_LONG_MESSAGE 0x00000050 #define TYPE_TEXT_VARIATION_PERSON_NAME 0x00000060 #define TYPE_TEXT_VARIATION_POSTAL_ADDRESS 0x00000070 #define TYPE_TEXT_VARIATION_PASSWORD 0x00000080 #define TYPE_TEXT_VARIATION_VISIBLE_PASSWORD 0x00000090 #define TYPE_TEXT_VARIATION_WEB_EDIT_TEXT 0x000000a0 #define TYPE_TEXT_VARIATION_FILTER 0x000000b0 #define TYPE_TEXT_VARIATION_PHONETIC 0x000000c0 #define TYPE_TEXT_VARIATION_WEB_EMAIL_ADDRESS 0x000000d0 #define TYPE_TEXT_VARIATION_WEB_PASSWORD 0x000000e0 static SDL_Scancode Android_Keycodes[] = { SDL_SCANCODE_UNKNOWN, // AKEYCODE_UNKNOWN SDL_SCANCODE_SOFTLEFT, // AKEYCODE_SOFT_LEFT SDL_SCANCODE_SOFTRIGHT, // AKEYCODE_SOFT_RIGHT SDL_SCANCODE_AC_HOME, // AKEYCODE_HOME SDL_SCANCODE_AC_BACK, // AKEYCODE_BACK SDL_SCANCODE_CALL, // AKEYCODE_CALL SDL_SCANCODE_ENDCALL, // AKEYCODE_ENDCALL SDL_SCANCODE_0, // AKEYCODE_0 SDL_SCANCODE_1, // AKEYCODE_1 SDL_SCANCODE_2, // AKEYCODE_2 SDL_SCANCODE_3, // AKEYCODE_3 SDL_SCANCODE_4, // AKEYCODE_4 SDL_SCANCODE_5, // AKEYCODE_5 SDL_SCANCODE_6, // AKEYCODE_6 SDL_SCANCODE_7, // AKEYCODE_7 SDL_SCANCODE_8, // AKEYCODE_8 SDL_SCANCODE_9, // AKEYCODE_9 SDL_SCANCODE_UNKNOWN, // AKEYCODE_STAR SDL_SCANCODE_UNKNOWN, // AKEYCODE_POUND SDL_SCANCODE_UP, // AKEYCODE_DPAD_UP SDL_SCANCODE_DOWN, // AKEYCODE_DPAD_DOWN SDL_SCANCODE_LEFT, // AKEYCODE_DPAD_LEFT SDL_SCANCODE_RIGHT, // AKEYCODE_DPAD_RIGHT SDL_SCANCODE_SELECT, // AKEYCODE_DPAD_CENTER SDL_SCANCODE_VOLUMEUP, // AKEYCODE_VOLUME_UP SDL_SCANCODE_VOLUMEDOWN, // AKEYCODE_VOLUME_DOWN SDL_SCANCODE_POWER, // AKEYCODE_POWER SDL_SCANCODE_UNKNOWN, // AKEYCODE_CAMERA SDL_SCANCODE_CLEAR, // AKEYCODE_CLEAR SDL_SCANCODE_A, // AKEYCODE_A SDL_SCANCODE_B, // AKEYCODE_B SDL_SCANCODE_C, // AKEYCODE_C SDL_SCANCODE_D, // AKEYCODE_D SDL_SCANCODE_E, // AKEYCODE_E SDL_SCANCODE_F, // AKEYCODE_F SDL_SCANCODE_G, // AKEYCODE_G SDL_SCANCODE_H, // AKEYCODE_H SDL_SCANCODE_I, // AKEYCODE_I SDL_SCANCODE_J, // AKEYCODE_J SDL_SCANCODE_K, // AKEYCODE_K SDL_SCANCODE_L, // AKEYCODE_L SDL_SCANCODE_M, // AKEYCODE_M SDL_SCANCODE_N, // AKEYCODE_N SDL_SCANCODE_O, // AKEYCODE_O SDL_SCANCODE_P, // AKEYCODE_P SDL_SCANCODE_Q, // AKEYCODE_Q SDL_SCANCODE_R, // AKEYCODE_R SDL_SCANCODE_S, // AKEYCODE_S SDL_SCANCODE_T, // AKEYCODE_T SDL_SCANCODE_U, // AKEYCODE_U SDL_SCANCODE_V, // AKEYCODE_V SDL_SCANCODE_W, // AKEYCODE_W SDL_SCANCODE_X, // AKEYCODE_X SDL_SCANCODE_Y, // AKEYCODE_Y SDL_SCANCODE_Z, // AKEYCODE_Z SDL_SCANCODE_COMMA, // AKEYCODE_COMMA SDL_SCANCODE_PERIOD, // AKEYCODE_PERIOD SDL_SCANCODE_LALT, // AKEYCODE_ALT_LEFT SDL_SCANCODE_RALT, // AKEYCODE_ALT_RIGHT SDL_SCANCODE_LSHIFT, // AKEYCODE_SHIFT_LEFT SDL_SCANCODE_RSHIFT, // AKEYCODE_SHIFT_RIGHT SDL_SCANCODE_TAB, // AKEYCODE_TAB SDL_SCANCODE_SPACE, // AKEYCODE_SPACE SDL_SCANCODE_UNKNOWN, // AKEYCODE_SYM SDL_SCANCODE_UNKNOWN, // AKEYCODE_EXPLORER SDL_SCANCODE_UNKNOWN, // AKEYCODE_ENVELOPE SDL_SCANCODE_RETURN, // AKEYCODE_ENTER SDL_SCANCODE_BACKSPACE, // AKEYCODE_DEL SDL_SCANCODE_GRAVE, // AKEYCODE_GRAVE SDL_SCANCODE_MINUS, // AKEYCODE_MINUS SDL_SCANCODE_EQUALS, // AKEYCODE_EQUALS SDL_SCANCODE_LEFTBRACKET, // AKEYCODE_LEFT_BRACKET SDL_SCANCODE_RIGHTBRACKET, // AKEYCODE_RIGHT_BRACKET SDL_SCANCODE_BACKSLASH, // AKEYCODE_BACKSLASH SDL_SCANCODE_SEMICOLON, // AKEYCODE_SEMICOLON SDL_SCANCODE_APOSTROPHE, // AKEYCODE_APOSTROPHE SDL_SCANCODE_SLASH, // AKEYCODE_SLASH SDL_SCANCODE_UNKNOWN, // AKEYCODE_AT SDL_SCANCODE_UNKNOWN, // AKEYCODE_NUM SDL_SCANCODE_UNKNOWN, // AKEYCODE_HEADSETHOOK SDL_SCANCODE_UNKNOWN, // AKEYCODE_FOCUS SDL_SCANCODE_UNKNOWN, // AKEYCODE_PLUS SDL_SCANCODE_MENU, // AKEYCODE_MENU SDL_SCANCODE_UNKNOWN, // AKEYCODE_NOTIFICATION SDL_SCANCODE_AC_SEARCH, // AKEYCODE_SEARCH SDL_SCANCODE_MEDIA_PLAY_PAUSE, // AKEYCODE_MEDIA_PLAY_PAUSE SDL_SCANCODE_MEDIA_STOP, // AKEYCODE_MEDIA_STOP SDL_SCANCODE_MEDIA_NEXT_TRACK, // AKEYCODE_MEDIA_NEXT SDL_SCANCODE_MEDIA_PREVIOUS_TRACK, // AKEYCODE_MEDIA_PREVIOUS SDL_SCANCODE_MEDIA_REWIND, // AKEYCODE_MEDIA_REWIND SDL_SCANCODE_MEDIA_FAST_FORWARD, // AKEYCODE_MEDIA_FAST_FORWARD SDL_SCANCODE_MUTE, // AKEYCODE_MUTE SDL_SCANCODE_PAGEUP, // AKEYCODE_PAGE_UP SDL_SCANCODE_PAGEDOWN, // AKEYCODE_PAGE_DOWN SDL_SCANCODE_UNKNOWN, // AKEYCODE_PICTSYMBOLS SDL_SCANCODE_UNKNOWN, // AKEYCODE_SWITCH_CHARSET SDL_SCANCODE_UNKNOWN, // AKEYCODE_BUTTON_A SDL_SCANCODE_UNKNOWN, // AKEYCODE_BUTTON_B SDL_SCANCODE_UNKNOWN, // AKEYCODE_BUTTON_C SDL_SCANCODE_UNKNOWN, // AKEYCODE_BUTTON_X SDL_SCANCODE_UNKNOWN, // AKEYCODE_BUTTON_Y SDL_SCANCODE_UNKNOWN, // AKEYCODE_BUTTON_Z SDL_SCANCODE_UNKNOWN, // AKEYCODE_BUTTON_L1 SDL_SCANCODE_UNKNOWN, // AKEYCODE_BUTTON_R1 SDL_SCANCODE_UNKNOWN, // AKEYCODE_BUTTON_L2 SDL_SCANCODE_UNKNOWN, // AKEYCODE_BUTTON_R2 SDL_SCANCODE_UNKNOWN, // AKEYCODE_BUTTON_THUMBL SDL_SCANCODE_UNKNOWN, // AKEYCODE_BUTTON_THUMBR SDL_SCANCODE_UNKNOWN, // AKEYCODE_BUTTON_START SDL_SCANCODE_UNKNOWN, // AKEYCODE_BUTTON_SELECT SDL_SCANCODE_UNKNOWN, // AKEYCODE_BUTTON_MODE SDL_SCANCODE_ESCAPE, // AKEYCODE_ESCAPE SDL_SCANCODE_DELETE, // AKEYCODE_FORWARD_DEL SDL_SCANCODE_LCTRL, // AKEYCODE_CTRL_LEFT SDL_SCANCODE_RCTRL, // AKEYCODE_CTRL_RIGHT SDL_SCANCODE_CAPSLOCK, // AKEYCODE_CAPS_LOCK SDL_SCANCODE_SCROLLLOCK, // AKEYCODE_SCROLL_LOCK SDL_SCANCODE_LGUI, // AKEYCODE_META_LEFT SDL_SCANCODE_RGUI, // AKEYCODE_META_RIGHT SDL_SCANCODE_UNKNOWN, // AKEYCODE_FUNCTION SDL_SCANCODE_PRINTSCREEN, // AKEYCODE_SYSRQ SDL_SCANCODE_PAUSE, // AKEYCODE_BREAK SDL_SCANCODE_HOME, // AKEYCODE_MOVE_HOME SDL_SCANCODE_END, // AKEYCODE_MOVE_END SDL_SCANCODE_INSERT, // AKEYCODE_INSERT SDL_SCANCODE_AC_FORWARD, // AKEYCODE_FORWARD SDL_SCANCODE_MEDIA_PLAY, // AKEYCODE_MEDIA_PLAY SDL_SCANCODE_MEDIA_PAUSE, // AKEYCODE_MEDIA_PAUSE SDL_SCANCODE_UNKNOWN, // AKEYCODE_MEDIA_CLOSE SDL_SCANCODE_MEDIA_EJECT, // AKEYCODE_MEDIA_EJECT SDL_SCANCODE_MEDIA_RECORD, // AKEYCODE_MEDIA_RECORD SDL_SCANCODE_F1, // AKEYCODE_F1 SDL_SCANCODE_F2, // AKEYCODE_F2 SDL_SCANCODE_F3, // AKEYCODE_F3 SDL_SCANCODE_F4, // AKEYCODE_F4 SDL_SCANCODE_F5, // AKEYCODE_F5 SDL_SCANCODE_F6, // AKEYCODE_F6 SDL_SCANCODE_F7, // AKEYCODE_F7 SDL_SCANCODE_F8, // AKEYCODE_F8 SDL_SCANCODE_F9, // AKEYCODE_F9 SDL_SCANCODE_F10, // AKEYCODE_F10 SDL_SCANCODE_F11, // AKEYCODE_F11 SDL_SCANCODE_F12, // AKEYCODE_F12 SDL_SCANCODE_NUMLOCKCLEAR, // AKEYCODE_NUM_LOCK SDL_SCANCODE_KP_0, // AKEYCODE_NUMPAD_0 SDL_SCANCODE_KP_1, // AKEYCODE_NUMPAD_1 SDL_SCANCODE_KP_2, // AKEYCODE_NUMPAD_2 SDL_SCANCODE_KP_3, // AKEYCODE_NUMPAD_3 SDL_SCANCODE_KP_4, // AKEYCODE_NUMPAD_4 SDL_SCANCODE_KP_5, // AKEYCODE_NUMPAD_5 SDL_SCANCODE_KP_6, // AKEYCODE_NUMPAD_6 SDL_SCANCODE_KP_7, // AKEYCODE_NUMPAD_7 SDL_SCANCODE_KP_8, // AKEYCODE_NUMPAD_8 SDL_SCANCODE_KP_9, // AKEYCODE_NUMPAD_9 SDL_SCANCODE_KP_DIVIDE, // AKEYCODE_NUMPAD_DIVIDE SDL_SCANCODE_KP_MULTIPLY, // AKEYCODE_NUMPAD_MULTIPLY SDL_SCANCODE_KP_MINUS, // AKEYCODE_NUMPAD_SUBTRACT SDL_SCANCODE_KP_PLUS, // AKEYCODE_NUMPAD_ADD SDL_SCANCODE_KP_PERIOD, // AKEYCODE_NUMPAD_DOT SDL_SCANCODE_KP_COMMA, // AKEYCODE_NUMPAD_COMMA SDL_SCANCODE_KP_ENTER, // AKEYCODE_NUMPAD_ENTER SDL_SCANCODE_KP_EQUALS, // AKEYCODE_NUMPAD_EQUALS SDL_SCANCODE_KP_LEFTPAREN, // AKEYCODE_NUMPAD_LEFT_PAREN SDL_SCANCODE_KP_RIGHTPAREN, // AKEYCODE_NUMPAD_RIGHT_PAREN SDL_SCANCODE_UNKNOWN, // AKEYCODE_VOLUME_MUTE SDL_SCANCODE_UNKNOWN, // AKEYCODE_INFO SDL_SCANCODE_CHANNEL_INCREMENT, // AKEYCODE_CHANNEL_UP SDL_SCANCODE_CHANNEL_INCREMENT, // AKEYCODE_CHANNEL_DOWN SDL_SCANCODE_UNKNOWN, // AKEYCODE_ZOOM_IN SDL_SCANCODE_UNKNOWN, // AKEYCODE_ZOOM_OUT SDL_SCANCODE_UNKNOWN, // AKEYCODE_TV SDL_SCANCODE_UNKNOWN, // AKEYCODE_WINDOW SDL_SCANCODE_UNKNOWN, // AKEYCODE_GUIDE SDL_SCANCODE_UNKNOWN, // AKEYCODE_DVR SDL_SCANCODE_AC_BOOKMARKS, // AKEYCODE_BOOKMARK SDL_SCANCODE_UNKNOWN, // AKEYCODE_CAPTIONS SDL_SCANCODE_UNKNOWN, // AKEYCODE_SETTINGS SDL_SCANCODE_UNKNOWN, // AKEYCODE_TV_POWER SDL_SCANCODE_UNKNOWN, // AKEYCODE_TV_INPUT SDL_SCANCODE_UNKNOWN, // AKEYCODE_STB_POWER SDL_SCANCODE_UNKNOWN, // AKEYCODE_STB_INPUT SDL_SCANCODE_UNKNOWN, // AKEYCODE_AVR_POWER SDL_SCANCODE_UNKNOWN, // AKEYCODE_AVR_INPUT SDL_SCANCODE_UNKNOWN, // AKEYCODE_PROG_RED SDL_SCANCODE_UNKNOWN, // AKEYCODE_PROG_GREEN SDL_SCANCODE_UNKNOWN, // AKEYCODE_PROG_YELLOW SDL_SCANCODE_UNKNOWN, // AKEYCODE_PROG_BLUE SDL_SCANCODE_UNKNOWN, // AKEYCODE_APP_SWITCH SDL_SCANCODE_UNKNOWN, // AKEYCODE_BUTTON_1 SDL_SCANCODE_UNKNOWN, // AKEYCODE_BUTTON_2 SDL_SCANCODE_UNKNOWN, // AKEYCODE_BUTTON_3 SDL_SCANCODE_UNKNOWN, // AKEYCODE_BUTTON_4 SDL_SCANCODE_UNKNOWN, // AKEYCODE_BUTTON_5 SDL_SCANCODE_UNKNOWN, // AKEYCODE_BUTTON_6 SDL_SCANCODE_UNKNOWN, // AKEYCODE_BUTTON_7 SDL_SCANCODE_UNKNOWN, // AKEYCODE_BUTTON_8 SDL_SCANCODE_UNKNOWN, // AKEYCODE_BUTTON_9 SDL_SCANCODE_UNKNOWN, // AKEYCODE_BUTTON_10 SDL_SCANCODE_UNKNOWN, // AKEYCODE_BUTTON_11 SDL_SCANCODE_UNKNOWN, // AKEYCODE_BUTTON_12 SDL_SCANCODE_UNKNOWN, // AKEYCODE_BUTTON_13 SDL_SCANCODE_UNKNOWN, // AKEYCODE_BUTTON_14 SDL_SCANCODE_UNKNOWN, // AKEYCODE_BUTTON_15 SDL_SCANCODE_UNKNOWN, // AKEYCODE_BUTTON_16 SDL_SCANCODE_UNKNOWN, // AKEYCODE_LANGUAGE_SWITCH SDL_SCANCODE_UNKNOWN, // AKEYCODE_MANNER_MODE SDL_SCANCODE_UNKNOWN, // AKEYCODE_3D_MODE SDL_SCANCODE_UNKNOWN, // AKEYCODE_CONTACTS SDL_SCANCODE_UNKNOWN, // AKEYCODE_CALENDAR SDL_SCANCODE_UNKNOWN, // AKEYCODE_MUSIC SDL_SCANCODE_UNKNOWN, // AKEYCODE_CALCULATOR SDL_SCANCODE_LANG5, // AKEYCODE_ZENKAKU_HANKAKU SDL_SCANCODE_UNKNOWN, // AKEYCODE_EISU SDL_SCANCODE_INTERNATIONAL5, // AKEYCODE_MUHENKAN SDL_SCANCODE_INTERNATIONAL4, // AKEYCODE_HENKAN SDL_SCANCODE_LANG3, // AKEYCODE_KATAKANA_HIRAGANA SDL_SCANCODE_INTERNATIONAL3, // AKEYCODE_YEN SDL_SCANCODE_UNKNOWN, // AKEYCODE_RO SDL_SCANCODE_UNKNOWN, // AKEYCODE_KANA SDL_SCANCODE_UNKNOWN, // AKEYCODE_ASSIST SDL_SCANCODE_UNKNOWN, // AKEYCODE_BRIGHTNESS_DOWN SDL_SCANCODE_UNKNOWN, // AKEYCODE_BRIGHTNESS_UP SDL_SCANCODE_UNKNOWN, // AKEYCODE_MEDIA_AUDIO_TRACK SDL_SCANCODE_SLEEP, // AKEYCODE_SLEEP SDL_SCANCODE_UNKNOWN, // AKEYCODE_WAKEUP SDL_SCANCODE_UNKNOWN, // AKEYCODE_PAIRING SDL_SCANCODE_UNKNOWN, // AKEYCODE_MEDIA_TOP_MENU SDL_SCANCODE_UNKNOWN, // AKEYCODE_11 SDL_SCANCODE_UNKNOWN, // AKEYCODE_12 SDL_SCANCODE_UNKNOWN, // AKEYCODE_LAST_CHANNEL SDL_SCANCODE_UNKNOWN, // AKEYCODE_TV_DATA_SERVICE SDL_SCANCODE_UNKNOWN, // AKEYCODE_VOICE_ASSIST SDL_SCANCODE_UNKNOWN, // AKEYCODE_TV_RADIO_SERVICE SDL_SCANCODE_UNKNOWN, // AKEYCODE_TV_TELETEXT SDL_SCANCODE_UNKNOWN, // AKEYCODE_TV_NUMBER_ENTRY SDL_SCANCODE_UNKNOWN, // AKEYCODE_TV_TERRESTRIAL_ANALOG SDL_SCANCODE_UNKNOWN, // AKEYCODE_TV_TERRESTRIAL_DIGITAL SDL_SCANCODE_UNKNOWN, // AKEYCODE_TV_SATELLITE SDL_SCANCODE_UNKNOWN, // AKEYCODE_TV_SATELLITE_BS SDL_SCANCODE_UNKNOWN, // AKEYCODE_TV_SATELLITE_CS SDL_SCANCODE_UNKNOWN, // AKEYCODE_TV_SATELLITE_SERVICE SDL_SCANCODE_UNKNOWN, // AKEYCODE_TV_NETWORK SDL_SCANCODE_UNKNOWN, // AKEYCODE_TV_ANTENNA_CABLE SDL_SCANCODE_UNKNOWN, // AKEYCODE_TV_INPUT_HDMI_1 SDL_SCANCODE_UNKNOWN, // AKEYCODE_TV_INPUT_HDMI_2 SDL_SCANCODE_UNKNOWN, // AKEYCODE_TV_INPUT_HDMI_3 SDL_SCANCODE_UNKNOWN, // AKEYCODE_TV_INPUT_HDMI_4 SDL_SCANCODE_UNKNOWN, // AKEYCODE_TV_INPUT_COMPOSITE_1 SDL_SCANCODE_UNKNOWN, // AKEYCODE_TV_INPUT_COMPOSITE_2 SDL_SCANCODE_UNKNOWN, // AKEYCODE_TV_INPUT_COMPONENT_1 SDL_SCANCODE_UNKNOWN, // AKEYCODE_TV_INPUT_COMPONENT_2 SDL_SCANCODE_UNKNOWN, // AKEYCODE_TV_INPUT_VGA_1 SDL_SCANCODE_UNKNOWN, // AKEYCODE_TV_AUDIO_DESCRIPTION SDL_SCANCODE_UNKNOWN, // AKEYCODE_TV_AUDIO_DESCRIPTION_MIX_UP SDL_SCANCODE_UNKNOWN, // AKEYCODE_TV_AUDIO_DESCRIPTION_MIX_DOWN SDL_SCANCODE_UNKNOWN, // AKEYCODE_TV_ZOOM_MODE SDL_SCANCODE_UNKNOWN, // AKEYCODE_TV_CONTENTS_MENU SDL_SCANCODE_UNKNOWN, // AKEYCODE_TV_MEDIA_CONTEXT_MENU SDL_SCANCODE_UNKNOWN, // AKEYCODE_TV_TIMER_PROGRAMMING SDL_SCANCODE_HELP, // AKEYCODE_HELP SDL_SCANCODE_UNKNOWN, // AKEYCODE_NAVIGATE_PREVIOUS SDL_SCANCODE_UNKNOWN, // AKEYCODE_NAVIGATE_NEXT SDL_SCANCODE_UNKNOWN, // AKEYCODE_NAVIGATE_IN SDL_SCANCODE_UNKNOWN, // AKEYCODE_NAVIGATE_OUT SDL_SCANCODE_UNKNOWN, // AKEYCODE_STEM_PRIMARY SDL_SCANCODE_UNKNOWN, // AKEYCODE_STEM_1 SDL_SCANCODE_UNKNOWN, // AKEYCODE_STEM_2 SDL_SCANCODE_UNKNOWN, // AKEYCODE_STEM_3 SDL_SCANCODE_UNKNOWN, // AKEYCODE_DPAD_UP_LEFT SDL_SCANCODE_UNKNOWN, // AKEYCODE_DPAD_DOWN_LEFT SDL_SCANCODE_UNKNOWN, // AKEYCODE_DPAD_UP_RIGHT SDL_SCANCODE_UNKNOWN, // AKEYCODE_DPAD_DOWN_RIGHT SDL_SCANCODE_UNKNOWN, // AKEYCODE_MEDIA_SKIP_FORWARD SDL_SCANCODE_UNKNOWN, // AKEYCODE_MEDIA_SKIP_BACKWARD SDL_SCANCODE_UNKNOWN, // AKEYCODE_MEDIA_STEP_FORWARD SDL_SCANCODE_UNKNOWN, // AKEYCODE_MEDIA_STEP_BACKWARD SDL_SCANCODE_UNKNOWN, // AKEYCODE_SOFT_SLEEP SDL_SCANCODE_CUT, // AKEYCODE_CUT SDL_SCANCODE_COPY, // AKEYCODE_COPY SDL_SCANCODE_PASTE, // AKEYCODE_PASTE }; static bool SDL_screen_keyboard_shown; static SDL_Scancode TranslateKeycode(int keycode) { SDL_Scancode scancode = SDL_SCANCODE_UNKNOWN; if (keycode < SDL_arraysize(Android_Keycodes)) { scancode = Android_Keycodes[keycode]; } if (scancode == SDL_SCANCODE_UNKNOWN) { __android_log_print(ANDROID_LOG_INFO, "SDL", "Unknown keycode %d", keycode); } return scancode; } void Android_OnKeyDown(int keycode) { SDL_SendKeyboardKey(0, SDL_DEFAULT_KEYBOARD_ID, keycode, TranslateKeycode(keycode), true); } void Android_OnKeyUp(int keycode) { SDL_SendKeyboardKey(0, SDL_DEFAULT_KEYBOARD_ID, keycode, TranslateKeycode(keycode), false); } bool Android_HasScreenKeyboardSupport(SDL_VideoDevice *_this) { return true; } void Android_ShowScreenKeyboard(SDL_VideoDevice *_this, SDL_Window *window, SDL_PropertiesID props) { int input_type = 0; if (SDL_HasProperty(props, SDL_PROP_TEXTINPUT_ANDROID_INPUTTYPE_NUMBER)) { input_type = (int)SDL_GetNumberProperty(props, SDL_PROP_TEXTINPUT_ANDROID_INPUTTYPE_NUMBER, 0); } else { switch (SDL_GetTextInputType(props)) { default: case SDL_TEXTINPUT_TYPE_TEXT: input_type = (TYPE_CLASS_TEXT | TYPE_TEXT_VARIATION_NORMAL); break; case SDL_TEXTINPUT_TYPE_TEXT_NAME: input_type = (TYPE_CLASS_TEXT | TYPE_TEXT_VARIATION_PERSON_NAME); break; case SDL_TEXTINPUT_TYPE_TEXT_EMAIL: input_type = (TYPE_CLASS_TEXT | TYPE_TEXT_VARIATION_EMAIL_ADDRESS); break; case SDL_TEXTINPUT_TYPE_TEXT_USERNAME: input_type = (TYPE_CLASS_TEXT | TYPE_TEXT_VARIATION_NORMAL); break; case SDL_TEXTINPUT_TYPE_TEXT_PASSWORD_HIDDEN: input_type = (TYPE_CLASS_TEXT | TYPE_TEXT_VARIATION_PASSWORD); break; case SDL_TEXTINPUT_TYPE_TEXT_PASSWORD_VISIBLE: input_type = (TYPE_CLASS_TEXT | TYPE_TEXT_VARIATION_VISIBLE_PASSWORD); break; case SDL_TEXTINPUT_TYPE_NUMBER: input_type = (TYPE_CLASS_NUMBER | TYPE_NUMBER_VARIATION_NORMAL); break; case SDL_TEXTINPUT_TYPE_NUMBER_PASSWORD_HIDDEN: input_type = (TYPE_CLASS_NUMBER | TYPE_NUMBER_VARIATION_PASSWORD); break; case SDL_TEXTINPUT_TYPE_NUMBER_PASSWORD_VISIBLE: input_type = (TYPE_CLASS_NUMBER | TYPE_NUMBER_VARIATION_NORMAL); break; } switch (SDL_GetTextInputCapitalization(props)) { default: case SDL_CAPITALIZE_NONE: break; case SDL_CAPITALIZE_LETTERS: input_type |= TYPE_TEXT_FLAG_CAP_CHARACTERS; break; case SDL_CAPITALIZE_WORDS: input_type |= TYPE_TEXT_FLAG_CAP_WORDS; break; case SDL_CAPITALIZE_SENTENCES: input_type |= TYPE_TEXT_FLAG_CAP_SENTENCES; break; } if (SDL_GetTextInputAutocorrect(props)) { input_type |= (TYPE_TEXT_FLAG_AUTO_CORRECT | TYPE_TEXT_FLAG_AUTO_COMPLETE); } if (SDL_GetTextInputMultiline(props)) { input_type |= TYPE_TEXT_FLAG_MULTI_LINE; } } Android_JNI_ShowScreenKeyboard(input_type, &window->text_input_rect); SDL_screen_keyboard_shown = true; } void Android_HideScreenKeyboard(SDL_VideoDevice *_this, SDL_Window *window) { Android_JNI_HideScreenKeyboard(); SDL_screen_keyboard_shown = false; } void Android_RestoreScreenKeyboardOnResume(SDL_VideoDevice *_this, SDL_Window *window) { if (SDL_screen_keyboard_shown) { Android_ShowScreenKeyboard(_this, window, window->text_input_props); } } bool Android_IsScreenKeyboardShown(SDL_VideoDevice *_this, SDL_Window *window) { return Android_JNI_IsScreenKeyboardShown(); } #endif // SDL_VIDEO_DRIVER_ANDROID