thunderbrew/vendor/sdl-3.2.10/src/video/android/SDL_androidkeyboard.c
2025-04-12 04:38:19 -04:00

468 lines
22 KiB
C

/*
Simple DirectMedia Layer
Copyright (C) 1997-2025 Sam Lantinga <slouken@libsdl.org>
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 <android/log.h>
#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