SDL_androidkeyboard.c 22 KB

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