summaryrefslogtreecommitdiff
path: root/contrib/SDL-3.2.8/src/video/android/SDL_androidkeyboard.c
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/SDL-3.2.8/src/video/android/SDL_androidkeyboard.c')
-rw-r--r--contrib/SDL-3.2.8/src/video/android/SDL_androidkeyboard.c468
1 files changed, 468 insertions, 0 deletions
diff --git a/contrib/SDL-3.2.8/src/video/android/SDL_androidkeyboard.c b/contrib/SDL-3.2.8/src/video/android/SDL_androidkeyboard.c
new file mode 100644
index 0000000..03af7c6
--- /dev/null
+++ b/contrib/SDL-3.2.8/src/video/android/SDL_androidkeyboard.c
@@ -0,0 +1,468 @@
1/*
2 Simple DirectMedia Layer
3 Copyright (C) 1997-2025 Sam Lantinga <slouken@libsdl.org>
4
5 This software is provided 'as-is', without any express or implied
6 warranty. In no event will the authors be held liable for any damages
7 arising from the use of this software.
8
9 Permission is granted to anyone to use this software for any purpose,
10 including commercial applications, and to alter it and redistribute it
11 freely, subject to the following restrictions:
12
13 1. The origin of this software must not be misrepresented; you must not
14 claim that you wrote the original software. If you use this software
15 in a product, an acknowledgment in the product documentation would be
16 appreciated but is not required.
17 2. Altered source versions must be plainly marked as such, and must not be
18 misrepresented as being the original software.
19 3. This notice may not be removed or altered from any source distribution.
20*/
21#include "SDL_internal.h"
22
23#ifdef SDL_VIDEO_DRIVER_ANDROID
24
25#include <android/log.h>
26
27#include "../../events/SDL_events_c.h"
28
29#include "SDL_androidkeyboard.h"
30
31#include "../../core/android/SDL_android.h"
32
33#define TYPE_CLASS_TEXT 0x00000001
34#define TYPE_CLASS_NUMBER 0x00000002
35#define TYPE_CLASS_PHONE 0x00000003
36#define TYPE_CLASS_DATETIME 0x00000004
37
38#define TYPE_DATETIME_VARIATION_NORMAL 0x00000000
39#define TYPE_DATETIME_VARIATION_DATE 0x00000010
40#define TYPE_DATETIME_VARIATION_TIME 0x00000020
41
42#define TYPE_NUMBER_VARIATION_NORMAL 0x00000000
43#define TYPE_NUMBER_VARIATION_PASSWORD 0x00000010
44#define TYPE_NUMBER_FLAG_SIGNED 0x00001000
45#define TYPE_NUMBER_FLAG_DECIMAL 0x00002000
46
47#define TYPE_TEXT_FLAG_CAP_CHARACTERS 0x00001000
48#define TYPE_TEXT_FLAG_CAP_WORDS 0x00002000
49#define TYPE_TEXT_FLAG_CAP_SENTENCES 0x00004000
50#define TYPE_TEXT_FLAG_AUTO_CORRECT 0x00008000
51#define TYPE_TEXT_FLAG_AUTO_COMPLETE 0x00010000
52#define TYPE_TEXT_FLAG_MULTI_LINE 0x00020000
53#define TYPE_TEXT_FLAG_IME_MULTI_LINE 0x00040000
54#define TYPE_TEXT_FLAG_NO_SUGGESTIONS 0x00080000
55
56#define TYPE_TEXT_VARIATION_NORMAL 0x00000000
57#define TYPE_TEXT_VARIATION_URI 0x00000010
58#define TYPE_TEXT_VARIATION_EMAIL_ADDRESS 0x00000020
59#define TYPE_TEXT_VARIATION_EMAIL_SUBJECT 0x00000030
60#define TYPE_TEXT_VARIATION_SHORT_MESSAGE 0x00000040
61#define TYPE_TEXT_VARIATION_LONG_MESSAGE 0x00000050
62#define TYPE_TEXT_VARIATION_PERSON_NAME 0x00000060
63#define TYPE_TEXT_VARIATION_POSTAL_ADDRESS 0x00000070
64#define TYPE_TEXT_VARIATION_PASSWORD 0x00000080
65#define TYPE_TEXT_VARIATION_VISIBLE_PASSWORD 0x00000090
66#define TYPE_TEXT_VARIATION_WEB_EDIT_TEXT 0x000000a0
67#define TYPE_TEXT_VARIATION_FILTER 0x000000b0
68#define TYPE_TEXT_VARIATION_PHONETIC 0x000000c0
69#define TYPE_TEXT_VARIATION_WEB_EMAIL_ADDRESS 0x000000d0
70#define TYPE_TEXT_VARIATION_WEB_PASSWORD 0x000000e0
71
72
73static SDL_Scancode Android_Keycodes[] = {
74 SDL_SCANCODE_UNKNOWN, // AKEYCODE_UNKNOWN
75 SDL_SCANCODE_SOFTLEFT, // AKEYCODE_SOFT_LEFT
76 SDL_SCANCODE_SOFTRIGHT, // AKEYCODE_SOFT_RIGHT
77 SDL_SCANCODE_AC_HOME, // AKEYCODE_HOME
78 SDL_SCANCODE_AC_BACK, // AKEYCODE_BACK
79 SDL_SCANCODE_CALL, // AKEYCODE_CALL
80 SDL_SCANCODE_ENDCALL, // AKEYCODE_ENDCALL
81 SDL_SCANCODE_0, // AKEYCODE_0
82 SDL_SCANCODE_1, // AKEYCODE_1
83 SDL_SCANCODE_2, // AKEYCODE_2
84 SDL_SCANCODE_3, // AKEYCODE_3
85 SDL_SCANCODE_4, // AKEYCODE_4
86 SDL_SCANCODE_5, // AKEYCODE_5
87 SDL_SCANCODE_6, // AKEYCODE_6
88 SDL_SCANCODE_7, // AKEYCODE_7
89 SDL_SCANCODE_8, // AKEYCODE_8
90 SDL_SCANCODE_9, // AKEYCODE_9
91 SDL_SCANCODE_UNKNOWN, // AKEYCODE_STAR
92 SDL_SCANCODE_UNKNOWN, // AKEYCODE_POUND
93 SDL_SCANCODE_UP, // AKEYCODE_DPAD_UP
94 SDL_SCANCODE_DOWN, // AKEYCODE_DPAD_DOWN
95 SDL_SCANCODE_LEFT, // AKEYCODE_DPAD_LEFT
96 SDL_SCANCODE_RIGHT, // AKEYCODE_DPAD_RIGHT
97 SDL_SCANCODE_SELECT, // AKEYCODE_DPAD_CENTER
98 SDL_SCANCODE_VOLUMEUP, // AKEYCODE_VOLUME_UP
99 SDL_SCANCODE_VOLUMEDOWN, // AKEYCODE_VOLUME_DOWN
100 SDL_SCANCODE_POWER, // AKEYCODE_POWER
101 SDL_SCANCODE_UNKNOWN, // AKEYCODE_CAMERA
102 SDL_SCANCODE_CLEAR, // AKEYCODE_CLEAR
103 SDL_SCANCODE_A, // AKEYCODE_A
104 SDL_SCANCODE_B, // AKEYCODE_B
105 SDL_SCANCODE_C, // AKEYCODE_C
106 SDL_SCANCODE_D, // AKEYCODE_D
107 SDL_SCANCODE_E, // AKEYCODE_E
108 SDL_SCANCODE_F, // AKEYCODE_F
109 SDL_SCANCODE_G, // AKEYCODE_G
110 SDL_SCANCODE_H, // AKEYCODE_H
111 SDL_SCANCODE_I, // AKEYCODE_I
112 SDL_SCANCODE_J, // AKEYCODE_J
113 SDL_SCANCODE_K, // AKEYCODE_K
114 SDL_SCANCODE_L, // AKEYCODE_L
115 SDL_SCANCODE_M, // AKEYCODE_M
116 SDL_SCANCODE_N, // AKEYCODE_N
117 SDL_SCANCODE_O, // AKEYCODE_O
118 SDL_SCANCODE_P, // AKEYCODE_P
119 SDL_SCANCODE_Q, // AKEYCODE_Q
120 SDL_SCANCODE_R, // AKEYCODE_R
121 SDL_SCANCODE_S, // AKEYCODE_S
122 SDL_SCANCODE_T, // AKEYCODE_T
123 SDL_SCANCODE_U, // AKEYCODE_U
124 SDL_SCANCODE_V, // AKEYCODE_V
125 SDL_SCANCODE_W, // AKEYCODE_W
126 SDL_SCANCODE_X, // AKEYCODE_X
127 SDL_SCANCODE_Y, // AKEYCODE_Y
128 SDL_SCANCODE_Z, // AKEYCODE_Z
129 SDL_SCANCODE_COMMA, // AKEYCODE_COMMA
130 SDL_SCANCODE_PERIOD, // AKEYCODE_PERIOD
131 SDL_SCANCODE_LALT, // AKEYCODE_ALT_LEFT
132 SDL_SCANCODE_RALT, // AKEYCODE_ALT_RIGHT
133 SDL_SCANCODE_LSHIFT, // AKEYCODE_SHIFT_LEFT
134 SDL_SCANCODE_RSHIFT, // AKEYCODE_SHIFT_RIGHT
135 SDL_SCANCODE_TAB, // AKEYCODE_TAB
136 SDL_SCANCODE_SPACE, // AKEYCODE_SPACE
137 SDL_SCANCODE_UNKNOWN, // AKEYCODE_SYM
138 SDL_SCANCODE_UNKNOWN, // AKEYCODE_EXPLORER
139 SDL_SCANCODE_UNKNOWN, // AKEYCODE_ENVELOPE
140 SDL_SCANCODE_RETURN, // AKEYCODE_ENTER
141 SDL_SCANCODE_BACKSPACE, // AKEYCODE_DEL
142 SDL_SCANCODE_GRAVE, // AKEYCODE_GRAVE
143 SDL_SCANCODE_MINUS, // AKEYCODE_MINUS
144 SDL_SCANCODE_EQUALS, // AKEYCODE_EQUALS
145 SDL_SCANCODE_LEFTBRACKET, // AKEYCODE_LEFT_BRACKET
146 SDL_SCANCODE_RIGHTBRACKET, // AKEYCODE_RIGHT_BRACKET
147 SDL_SCANCODE_BACKSLASH, // AKEYCODE_BACKSLASH
148 SDL_SCANCODE_SEMICOLON, // AKEYCODE_SEMICOLON
149 SDL_SCANCODE_APOSTROPHE, // AKEYCODE_APOSTROPHE
150 SDL_SCANCODE_SLASH, // AKEYCODE_SLASH
151 SDL_SCANCODE_UNKNOWN, // AKEYCODE_AT
152 SDL_SCANCODE_UNKNOWN, // AKEYCODE_NUM
153 SDL_SCANCODE_UNKNOWN, // AKEYCODE_HEADSETHOOK
154 SDL_SCANCODE_UNKNOWN, // AKEYCODE_FOCUS
155 SDL_SCANCODE_UNKNOWN, // AKEYCODE_PLUS
156 SDL_SCANCODE_MENU, // AKEYCODE_MENU
157 SDL_SCANCODE_UNKNOWN, // AKEYCODE_NOTIFICATION
158 SDL_SCANCODE_AC_SEARCH, // AKEYCODE_SEARCH
159 SDL_SCANCODE_MEDIA_PLAY_PAUSE, // AKEYCODE_MEDIA_PLAY_PAUSE
160 SDL_SCANCODE_MEDIA_STOP, // AKEYCODE_MEDIA_STOP
161 SDL_SCANCODE_MEDIA_NEXT_TRACK, // AKEYCODE_MEDIA_NEXT
162 SDL_SCANCODE_MEDIA_PREVIOUS_TRACK, // AKEYCODE_MEDIA_PREVIOUS
163 SDL_SCANCODE_MEDIA_REWIND, // AKEYCODE_MEDIA_REWIND
164 SDL_SCANCODE_MEDIA_FAST_FORWARD, // AKEYCODE_MEDIA_FAST_FORWARD
165 SDL_SCANCODE_MUTE, // AKEYCODE_MUTE
166 SDL_SCANCODE_PAGEUP, // AKEYCODE_PAGE_UP
167 SDL_SCANCODE_PAGEDOWN, // AKEYCODE_PAGE_DOWN
168 SDL_SCANCODE_UNKNOWN, // AKEYCODE_PICTSYMBOLS
169 SDL_SCANCODE_UNKNOWN, // AKEYCODE_SWITCH_CHARSET
170 SDL_SCANCODE_UNKNOWN, // AKEYCODE_BUTTON_A
171 SDL_SCANCODE_UNKNOWN, // AKEYCODE_BUTTON_B
172 SDL_SCANCODE_UNKNOWN, // AKEYCODE_BUTTON_C
173 SDL_SCANCODE_UNKNOWN, // AKEYCODE_BUTTON_X
174 SDL_SCANCODE_UNKNOWN, // AKEYCODE_BUTTON_Y
175 SDL_SCANCODE_UNKNOWN, // AKEYCODE_BUTTON_Z
176 SDL_SCANCODE_UNKNOWN, // AKEYCODE_BUTTON_L1
177 SDL_SCANCODE_UNKNOWN, // AKEYCODE_BUTTON_R1
178 SDL_SCANCODE_UNKNOWN, // AKEYCODE_BUTTON_L2
179 SDL_SCANCODE_UNKNOWN, // AKEYCODE_BUTTON_R2
180 SDL_SCANCODE_UNKNOWN, // AKEYCODE_BUTTON_THUMBL
181 SDL_SCANCODE_UNKNOWN, // AKEYCODE_BUTTON_THUMBR
182 SDL_SCANCODE_UNKNOWN, // AKEYCODE_BUTTON_START
183 SDL_SCANCODE_UNKNOWN, // AKEYCODE_BUTTON_SELECT
184 SDL_SCANCODE_UNKNOWN, // AKEYCODE_BUTTON_MODE
185 SDL_SCANCODE_ESCAPE, // AKEYCODE_ESCAPE
186 SDL_SCANCODE_DELETE, // AKEYCODE_FORWARD_DEL
187 SDL_SCANCODE_LCTRL, // AKEYCODE_CTRL_LEFT
188 SDL_SCANCODE_RCTRL, // AKEYCODE_CTRL_RIGHT
189 SDL_SCANCODE_CAPSLOCK, // AKEYCODE_CAPS_LOCK
190 SDL_SCANCODE_SCROLLLOCK, // AKEYCODE_SCROLL_LOCK
191 SDL_SCANCODE_LGUI, // AKEYCODE_META_LEFT
192 SDL_SCANCODE_RGUI, // AKEYCODE_META_RIGHT
193 SDL_SCANCODE_UNKNOWN, // AKEYCODE_FUNCTION
194 SDL_SCANCODE_PRINTSCREEN, // AKEYCODE_SYSRQ
195 SDL_SCANCODE_PAUSE, // AKEYCODE_BREAK
196 SDL_SCANCODE_HOME, // AKEYCODE_MOVE_HOME
197 SDL_SCANCODE_END, // AKEYCODE_MOVE_END
198 SDL_SCANCODE_INSERT, // AKEYCODE_INSERT
199 SDL_SCANCODE_AC_FORWARD, // AKEYCODE_FORWARD
200 SDL_SCANCODE_MEDIA_PLAY, // AKEYCODE_MEDIA_PLAY
201 SDL_SCANCODE_MEDIA_PAUSE, // AKEYCODE_MEDIA_PAUSE
202 SDL_SCANCODE_UNKNOWN, // AKEYCODE_MEDIA_CLOSE
203 SDL_SCANCODE_MEDIA_EJECT, // AKEYCODE_MEDIA_EJECT
204 SDL_SCANCODE_MEDIA_RECORD, // AKEYCODE_MEDIA_RECORD
205 SDL_SCANCODE_F1, // AKEYCODE_F1
206 SDL_SCANCODE_F2, // AKEYCODE_F2
207 SDL_SCANCODE_F3, // AKEYCODE_F3
208 SDL_SCANCODE_F4, // AKEYCODE_F4
209 SDL_SCANCODE_F5, // AKEYCODE_F5
210 SDL_SCANCODE_F6, // AKEYCODE_F6
211 SDL_SCANCODE_F7, // AKEYCODE_F7
212 SDL_SCANCODE_F8, // AKEYCODE_F8
213 SDL_SCANCODE_F9, // AKEYCODE_F9
214 SDL_SCANCODE_F10, // AKEYCODE_F10
215 SDL_SCANCODE_F11, // AKEYCODE_F11
216 SDL_SCANCODE_F12, // AKEYCODE_F12
217 SDL_SCANCODE_NUMLOCKCLEAR, // AKEYCODE_NUM_LOCK
218 SDL_SCANCODE_KP_0, // AKEYCODE_NUMPAD_0
219 SDL_SCANCODE_KP_1, // AKEYCODE_NUMPAD_1
220 SDL_SCANCODE_KP_2, // AKEYCODE_NUMPAD_2
221 SDL_SCANCODE_KP_3, // AKEYCODE_NUMPAD_3
222 SDL_SCANCODE_KP_4, // AKEYCODE_NUMPAD_4
223 SDL_SCANCODE_KP_5, // AKEYCODE_NUMPAD_5
224 SDL_SCANCODE_KP_6, // AKEYCODE_NUMPAD_6
225 SDL_SCANCODE_KP_7, // AKEYCODE_NUMPAD_7
226 SDL_SCANCODE_KP_8, // AKEYCODE_NUMPAD_8
227 SDL_SCANCODE_KP_9, // AKEYCODE_NUMPAD_9
228 SDL_SCANCODE_KP_DIVIDE, // AKEYCODE_NUMPAD_DIVIDE
229 SDL_SCANCODE_KP_MULTIPLY, // AKEYCODE_NUMPAD_MULTIPLY
230 SDL_SCANCODE_KP_MINUS, // AKEYCODE_NUMPAD_SUBTRACT
231 SDL_SCANCODE_KP_PLUS, // AKEYCODE_NUMPAD_ADD
232 SDL_SCANCODE_KP_PERIOD, // AKEYCODE_NUMPAD_DOT
233 SDL_SCANCODE_KP_COMMA, // AKEYCODE_NUMPAD_COMMA
234 SDL_SCANCODE_KP_ENTER, // AKEYCODE_NUMPAD_ENTER
235 SDL_SCANCODE_KP_EQUALS, // AKEYCODE_NUMPAD_EQUALS
236 SDL_SCANCODE_KP_LEFTPAREN, // AKEYCODE_NUMPAD_LEFT_PAREN
237 SDL_SCANCODE_KP_RIGHTPAREN, // AKEYCODE_NUMPAD_RIGHT_PAREN
238 SDL_SCANCODE_UNKNOWN, // AKEYCODE_VOLUME_MUTE
239 SDL_SCANCODE_UNKNOWN, // AKEYCODE_INFO
240 SDL_SCANCODE_CHANNEL_INCREMENT, // AKEYCODE_CHANNEL_UP
241 SDL_SCANCODE_CHANNEL_INCREMENT, // AKEYCODE_CHANNEL_DOWN
242 SDL_SCANCODE_UNKNOWN, // AKEYCODE_ZOOM_IN
243 SDL_SCANCODE_UNKNOWN, // AKEYCODE_ZOOM_OUT
244 SDL_SCANCODE_UNKNOWN, // AKEYCODE_TV
245 SDL_SCANCODE_UNKNOWN, // AKEYCODE_WINDOW
246 SDL_SCANCODE_UNKNOWN, // AKEYCODE_GUIDE
247 SDL_SCANCODE_UNKNOWN, // AKEYCODE_DVR
248 SDL_SCANCODE_AC_BOOKMARKS, // AKEYCODE_BOOKMARK
249 SDL_SCANCODE_UNKNOWN, // AKEYCODE_CAPTIONS
250 SDL_SCANCODE_UNKNOWN, // AKEYCODE_SETTINGS
251 SDL_SCANCODE_UNKNOWN, // AKEYCODE_TV_POWER
252 SDL_SCANCODE_UNKNOWN, // AKEYCODE_TV_INPUT
253 SDL_SCANCODE_UNKNOWN, // AKEYCODE_STB_POWER
254 SDL_SCANCODE_UNKNOWN, // AKEYCODE_STB_INPUT
255 SDL_SCANCODE_UNKNOWN, // AKEYCODE_AVR_POWER
256 SDL_SCANCODE_UNKNOWN, // AKEYCODE_AVR_INPUT
257 SDL_SCANCODE_UNKNOWN, // AKEYCODE_PROG_RED
258 SDL_SCANCODE_UNKNOWN, // AKEYCODE_PROG_GREEN
259 SDL_SCANCODE_UNKNOWN, // AKEYCODE_PROG_YELLOW
260 SDL_SCANCODE_UNKNOWN, // AKEYCODE_PROG_BLUE
261 SDL_SCANCODE_UNKNOWN, // AKEYCODE_APP_SWITCH
262 SDL_SCANCODE_UNKNOWN, // AKEYCODE_BUTTON_1
263 SDL_SCANCODE_UNKNOWN, // AKEYCODE_BUTTON_2
264 SDL_SCANCODE_UNKNOWN, // AKEYCODE_BUTTON_3
265 SDL_SCANCODE_UNKNOWN, // AKEYCODE_BUTTON_4
266 SDL_SCANCODE_UNKNOWN, // AKEYCODE_BUTTON_5
267 SDL_SCANCODE_UNKNOWN, // AKEYCODE_BUTTON_6
268 SDL_SCANCODE_UNKNOWN, // AKEYCODE_BUTTON_7
269 SDL_SCANCODE_UNKNOWN, // AKEYCODE_BUTTON_8
270 SDL_SCANCODE_UNKNOWN, // AKEYCODE_BUTTON_9
271 SDL_SCANCODE_UNKNOWN, // AKEYCODE_BUTTON_10
272 SDL_SCANCODE_UNKNOWN, // AKEYCODE_BUTTON_11
273 SDL_SCANCODE_UNKNOWN, // AKEYCODE_BUTTON_12
274 SDL_SCANCODE_UNKNOWN, // AKEYCODE_BUTTON_13
275 SDL_SCANCODE_UNKNOWN, // AKEYCODE_BUTTON_14
276 SDL_SCANCODE_UNKNOWN, // AKEYCODE_BUTTON_15
277 SDL_SCANCODE_UNKNOWN, // AKEYCODE_BUTTON_16
278 SDL_SCANCODE_UNKNOWN, // AKEYCODE_LANGUAGE_SWITCH
279 SDL_SCANCODE_UNKNOWN, // AKEYCODE_MANNER_MODE
280 SDL_SCANCODE_UNKNOWN, // AKEYCODE_3D_MODE
281 SDL_SCANCODE_UNKNOWN, // AKEYCODE_CONTACTS
282 SDL_SCANCODE_UNKNOWN, // AKEYCODE_CALENDAR
283 SDL_SCANCODE_UNKNOWN, // AKEYCODE_MUSIC
284 SDL_SCANCODE_UNKNOWN, // AKEYCODE_CALCULATOR
285 SDL_SCANCODE_LANG5, // AKEYCODE_ZENKAKU_HANKAKU
286 SDL_SCANCODE_UNKNOWN, // AKEYCODE_EISU
287 SDL_SCANCODE_INTERNATIONAL5, // AKEYCODE_MUHENKAN
288 SDL_SCANCODE_INTERNATIONAL4, // AKEYCODE_HENKAN
289 SDL_SCANCODE_LANG3, // AKEYCODE_KATAKANA_HIRAGANA
290 SDL_SCANCODE_INTERNATIONAL3, // AKEYCODE_YEN
291 SDL_SCANCODE_UNKNOWN, // AKEYCODE_RO
292 SDL_SCANCODE_UNKNOWN, // AKEYCODE_KANA
293 SDL_SCANCODE_UNKNOWN, // AKEYCODE_ASSIST
294 SDL_SCANCODE_UNKNOWN, // AKEYCODE_BRIGHTNESS_DOWN
295 SDL_SCANCODE_UNKNOWN, // AKEYCODE_BRIGHTNESS_UP
296 SDL_SCANCODE_UNKNOWN, // AKEYCODE_MEDIA_AUDIO_TRACK
297 SDL_SCANCODE_SLEEP, // AKEYCODE_SLEEP
298 SDL_SCANCODE_UNKNOWN, // AKEYCODE_WAKEUP
299 SDL_SCANCODE_UNKNOWN, // AKEYCODE_PAIRING
300 SDL_SCANCODE_UNKNOWN, // AKEYCODE_MEDIA_TOP_MENU
301 SDL_SCANCODE_UNKNOWN, // AKEYCODE_11
302 SDL_SCANCODE_UNKNOWN, // AKEYCODE_12
303 SDL_SCANCODE_UNKNOWN, // AKEYCODE_LAST_CHANNEL
304 SDL_SCANCODE_UNKNOWN, // AKEYCODE_TV_DATA_SERVICE
305 SDL_SCANCODE_UNKNOWN, // AKEYCODE_VOICE_ASSIST
306 SDL_SCANCODE_UNKNOWN, // AKEYCODE_TV_RADIO_SERVICE
307 SDL_SCANCODE_UNKNOWN, // AKEYCODE_TV_TELETEXT
308 SDL_SCANCODE_UNKNOWN, // AKEYCODE_TV_NUMBER_ENTRY
309 SDL_SCANCODE_UNKNOWN, // AKEYCODE_TV_TERRESTRIAL_ANALOG
310 SDL_SCANCODE_UNKNOWN, // AKEYCODE_TV_TERRESTRIAL_DIGITAL
311 SDL_SCANCODE_UNKNOWN, // AKEYCODE_TV_SATELLITE
312 SDL_SCANCODE_UNKNOWN, // AKEYCODE_TV_SATELLITE_BS
313 SDL_SCANCODE_UNKNOWN, // AKEYCODE_TV_SATELLITE_CS
314 SDL_SCANCODE_UNKNOWN, // AKEYCODE_TV_SATELLITE_SERVICE
315 SDL_SCANCODE_UNKNOWN, // AKEYCODE_TV_NETWORK
316 SDL_SCANCODE_UNKNOWN, // AKEYCODE_TV_ANTENNA_CABLE
317 SDL_SCANCODE_UNKNOWN, // AKEYCODE_TV_INPUT_HDMI_1
318 SDL_SCANCODE_UNKNOWN, // AKEYCODE_TV_INPUT_HDMI_2
319 SDL_SCANCODE_UNKNOWN, // AKEYCODE_TV_INPUT_HDMI_3
320 SDL_SCANCODE_UNKNOWN, // AKEYCODE_TV_INPUT_HDMI_4
321 SDL_SCANCODE_UNKNOWN, // AKEYCODE_TV_INPUT_COMPOSITE_1
322 SDL_SCANCODE_UNKNOWN, // AKEYCODE_TV_INPUT_COMPOSITE_2
323 SDL_SCANCODE_UNKNOWN, // AKEYCODE_TV_INPUT_COMPONENT_1
324 SDL_SCANCODE_UNKNOWN, // AKEYCODE_TV_INPUT_COMPONENT_2
325 SDL_SCANCODE_UNKNOWN, // AKEYCODE_TV_INPUT_VGA_1
326 SDL_SCANCODE_UNKNOWN, // AKEYCODE_TV_AUDIO_DESCRIPTION
327 SDL_SCANCODE_UNKNOWN, // AKEYCODE_TV_AUDIO_DESCRIPTION_MIX_UP
328 SDL_SCANCODE_UNKNOWN, // AKEYCODE_TV_AUDIO_DESCRIPTION_MIX_DOWN
329 SDL_SCANCODE_UNKNOWN, // AKEYCODE_TV_ZOOM_MODE
330 SDL_SCANCODE_UNKNOWN, // AKEYCODE_TV_CONTENTS_MENU
331 SDL_SCANCODE_UNKNOWN, // AKEYCODE_TV_MEDIA_CONTEXT_MENU
332 SDL_SCANCODE_UNKNOWN, // AKEYCODE_TV_TIMER_PROGRAMMING
333 SDL_SCANCODE_HELP, // AKEYCODE_HELP
334 SDL_SCANCODE_UNKNOWN, // AKEYCODE_NAVIGATE_PREVIOUS
335 SDL_SCANCODE_UNKNOWN, // AKEYCODE_NAVIGATE_NEXT
336 SDL_SCANCODE_UNKNOWN, // AKEYCODE_NAVIGATE_IN
337 SDL_SCANCODE_UNKNOWN, // AKEYCODE_NAVIGATE_OUT
338 SDL_SCANCODE_UNKNOWN, // AKEYCODE_STEM_PRIMARY
339 SDL_SCANCODE_UNKNOWN, // AKEYCODE_STEM_1
340 SDL_SCANCODE_UNKNOWN, // AKEYCODE_STEM_2
341 SDL_SCANCODE_UNKNOWN, // AKEYCODE_STEM_3
342 SDL_SCANCODE_UNKNOWN, // AKEYCODE_DPAD_UP_LEFT
343 SDL_SCANCODE_UNKNOWN, // AKEYCODE_DPAD_DOWN_LEFT
344 SDL_SCANCODE_UNKNOWN, // AKEYCODE_DPAD_UP_RIGHT
345 SDL_SCANCODE_UNKNOWN, // AKEYCODE_DPAD_DOWN_RIGHT
346 SDL_SCANCODE_UNKNOWN, // AKEYCODE_MEDIA_SKIP_FORWARD
347 SDL_SCANCODE_UNKNOWN, // AKEYCODE_MEDIA_SKIP_BACKWARD
348 SDL_SCANCODE_UNKNOWN, // AKEYCODE_MEDIA_STEP_FORWARD
349 SDL_SCANCODE_UNKNOWN, // AKEYCODE_MEDIA_STEP_BACKWARD
350 SDL_SCANCODE_UNKNOWN, // AKEYCODE_SOFT_SLEEP
351 SDL_SCANCODE_CUT, // AKEYCODE_CUT
352 SDL_SCANCODE_COPY, // AKEYCODE_COPY
353 SDL_SCANCODE_PASTE, // AKEYCODE_PASTE
354};
355
356static bool SDL_screen_keyboard_shown;
357
358static SDL_Scancode TranslateKeycode(int keycode)
359{
360 SDL_Scancode scancode = SDL_SCANCODE_UNKNOWN;
361
362 if (keycode < SDL_arraysize(Android_Keycodes)) {
363 scancode = Android_Keycodes[keycode];
364 }
365 if (scancode == SDL_SCANCODE_UNKNOWN) {
366 __android_log_print(ANDROID_LOG_INFO, "SDL", "Unknown keycode %d", keycode);
367 }
368 return scancode;
369}
370
371void Android_OnKeyDown(int keycode)
372{
373 SDL_SendKeyboardKey(0, SDL_DEFAULT_KEYBOARD_ID, keycode, TranslateKeycode(keycode), true);
374}
375
376void Android_OnKeyUp(int keycode)
377{
378 SDL_SendKeyboardKey(0, SDL_DEFAULT_KEYBOARD_ID, keycode, TranslateKeycode(keycode), false);
379}
380
381bool Android_HasScreenKeyboardSupport(SDL_VideoDevice *_this)
382{
383 return true;
384}
385
386void Android_ShowScreenKeyboard(SDL_VideoDevice *_this, SDL_Window *window, SDL_PropertiesID props)
387{
388 int input_type = 0;
389 if (SDL_HasProperty(props, SDL_PROP_TEXTINPUT_ANDROID_INPUTTYPE_NUMBER)) {
390 input_type = (int)SDL_GetNumberProperty(props, SDL_PROP_TEXTINPUT_ANDROID_INPUTTYPE_NUMBER, 0);
391 } else {
392 switch (SDL_GetTextInputType(props)) {
393 default:
394 case SDL_TEXTINPUT_TYPE_TEXT:
395 input_type = (TYPE_CLASS_TEXT | TYPE_TEXT_VARIATION_NORMAL);
396 break;
397 case SDL_TEXTINPUT_TYPE_TEXT_NAME:
398 input_type = (TYPE_CLASS_TEXT | TYPE_TEXT_VARIATION_PERSON_NAME);
399 break;
400 case SDL_TEXTINPUT_TYPE_TEXT_EMAIL:
401 input_type = (TYPE_CLASS_TEXT | TYPE_TEXT_VARIATION_EMAIL_ADDRESS);
402 break;
403 case SDL_TEXTINPUT_TYPE_TEXT_USERNAME:
404 input_type = (TYPE_CLASS_TEXT | TYPE_TEXT_VARIATION_NORMAL);
405 break;
406 case SDL_TEXTINPUT_TYPE_TEXT_PASSWORD_HIDDEN:
407 input_type = (TYPE_CLASS_TEXT | TYPE_TEXT_VARIATION_PASSWORD);
408 break;
409 case SDL_TEXTINPUT_TYPE_TEXT_PASSWORD_VISIBLE:
410 input_type = (TYPE_CLASS_TEXT | TYPE_TEXT_VARIATION_VISIBLE_PASSWORD);
411 break;
412 case SDL_TEXTINPUT_TYPE_NUMBER:
413 input_type = (TYPE_CLASS_NUMBER | TYPE_NUMBER_VARIATION_NORMAL);
414 break;
415 case SDL_TEXTINPUT_TYPE_NUMBER_PASSWORD_HIDDEN:
416 input_type = (TYPE_CLASS_NUMBER | TYPE_NUMBER_VARIATION_PASSWORD);
417 break;
418 case SDL_TEXTINPUT_TYPE_NUMBER_PASSWORD_VISIBLE:
419 input_type = (TYPE_CLASS_NUMBER | TYPE_NUMBER_VARIATION_NORMAL);
420 break;
421 }
422
423 switch (SDL_GetTextInputCapitalization(props)) {
424 default:
425 case SDL_CAPITALIZE_NONE:
426 break;
427 case SDL_CAPITALIZE_LETTERS:
428 input_type |= TYPE_TEXT_FLAG_CAP_CHARACTERS;
429 break;
430 case SDL_CAPITALIZE_WORDS:
431 input_type |= TYPE_TEXT_FLAG_CAP_WORDS;
432 break;
433 case SDL_CAPITALIZE_SENTENCES:
434 input_type |= TYPE_TEXT_FLAG_CAP_SENTENCES;
435 break;
436 }
437
438 if (SDL_GetTextInputAutocorrect(props)) {
439 input_type |= (TYPE_TEXT_FLAG_AUTO_CORRECT | TYPE_TEXT_FLAG_AUTO_COMPLETE);
440 }
441
442 if (SDL_GetTextInputMultiline(props)) {
443 input_type |= TYPE_TEXT_FLAG_MULTI_LINE;
444 }
445 }
446 Android_JNI_ShowScreenKeyboard(input_type, &window->text_input_rect);
447 SDL_screen_keyboard_shown = true;
448}
449
450void Android_HideScreenKeyboard(SDL_VideoDevice *_this, SDL_Window *window)
451{
452 Android_JNI_HideScreenKeyboard();
453 SDL_screen_keyboard_shown = false;
454}
455
456void Android_RestoreScreenKeyboardOnResume(SDL_VideoDevice *_this, SDL_Window *window)
457{
458 if (SDL_screen_keyboard_shown) {
459 Android_ShowScreenKeyboard(_this, window, window->text_input_props);
460 }
461}
462
463bool Android_IsScreenKeyboardShown(SDL_VideoDevice *_this, SDL_Window *window)
464{
465 return Android_JNI_IsScreenKeyboardShown();
466}
467
468#endif // SDL_VIDEO_DRIVER_ANDROID