From 0ad65277ce7ca025438694caf39f83b80d4eea4c Mon Sep 17 00:00:00 2001
From: Sam Lantinga <[EMAIL REDACTED]>
Date: Wed, 29 Jun 2022 17:26:09 -0700
Subject: [PATCH] Refactored code to send scancodes for an ASCII on-screen
keyboard key
---
src/core/android/SDL_android.c | 26 +---
src/core/android/keyinfotable.h | 175 ----------------------
src/events/SDL_keyboard.c | 28 ++++
src/events/SDL_keyboard_c.h | 5 +
src/events/scancodes_ascii.h | 170 +++++++++++++++++++++
src/video/uikit/SDL_uikitviewcontroller.m | 32 +---
src/video/uikit/keyinfotable.h | 174 ---------------------
7 files changed, 205 insertions(+), 405 deletions(-)
delete mode 100644 src/core/android/keyinfotable.h
create mode 100644 src/events/scancodes_ascii.h
delete mode 100644 src/video/uikit/keyinfotable.h
diff --git a/src/core/android/SDL_android.c b/src/core/android/SDL_android.c
index 3c4112a0e00..b0884eda868 100644
--- a/src/core/android/SDL_android.c
+++ b/src/core/android/SDL_android.c
@@ -31,8 +31,6 @@
#include "SDL_system.h"
#include "SDL_android.h"
-#include "keyinfotable.h"
-
#include "../../events/SDL_events_c.h"
#include "../../video/android/SDL_androidkeyboard.h"
#include "../../video/android/SDL_androidmouse.h"
@@ -1270,29 +1268,7 @@ JNIEXPORT void JNICALL SDL_JAVA_INTERFACE_INPUT_CONNECTION(nativeGenerateScancod
JNIEnv *env, jclass cls,
jchar chUnicode)
{
- SDL_Scancode code = SDL_SCANCODE_UNKNOWN;
- uint16_t mod = 0;
-
- /* We do not care about bigger than 127. */
- if (chUnicode < 127) {
- AndroidKeyInfo info = unicharToAndroidKeyInfoTable[chUnicode];
- code = info.code;
- mod = info.mod;
- }
-
- if (mod & KMOD_SHIFT) {
- /* If character uses shift, press shift down */
- SDL_SendKeyboardKey(SDL_PRESSED, SDL_SCANCODE_LSHIFT);
- }
-
- /* send a keydown and keyup even for the character */
- SDL_SendKeyboardKey(SDL_PRESSED, code);
- SDL_SendKeyboardKey(SDL_RELEASED, code);
-
- if (mod & KMOD_SHIFT) {
- /* If character uses shift, press shift back up */
- SDL_SendKeyboardKey(SDL_RELEASED, SDL_SCANCODE_LSHIFT);
- }
+ SDL_SendKeyboardUnicodeKey(chUnicode);
}
JNIEXPORT void JNICALL SDL_JAVA_INTERFACE_INPUT_CONNECTION(nativeSetComposingText)(
diff --git a/src/core/android/keyinfotable.h b/src/core/android/keyinfotable.h
deleted file mode 100644
index 6c5d065b0c3..00000000000
--- a/src/core/android/keyinfotable.h
+++ /dev/null
@@ -1,175 +0,0 @@
-/*
- Simple DirectMedia Layer
- Copyright (C) 1997-2022 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.
-*/
-
-#ifndef _ANDROID_KeyInfo
-#define _ANDROID_KeyInfo
-
-#include "SDL_scancode.h"
-#include "SDL_keycode.h"
-
-/*
- This file is used by the keyboard code in SDL_uikitview.m to convert between characters
- passed in from the iPhone's virtual keyboard, and tuples of SDL_Scancode and SDL_keymods.
- For example unicharToUIKeyInfoTable['a'] would give you the scan code and keymod for lower
- case a.
-*/
-
-typedef struct
-{
- SDL_Scancode code;
- uint16_t mod;
-} AndroidKeyInfo;
-
-/* So far only ASCII characters here */
-static AndroidKeyInfo unicharToAndroidKeyInfoTable[] = {
-/* 0 */ { SDL_SCANCODE_UNKNOWN, 0 },
-/* 1 */ { SDL_SCANCODE_UNKNOWN, 0 },
-/* 2 */ { SDL_SCANCODE_UNKNOWN, 0 },
-/* 3 */ { SDL_SCANCODE_UNKNOWN, 0 },
-/* 4 */ { SDL_SCANCODE_UNKNOWN, 0 },
-/* 5 */ { SDL_SCANCODE_UNKNOWN, 0 },
-/* 6 */ { SDL_SCANCODE_UNKNOWN, 0 },
-/* 7 */ { SDL_SCANCODE_UNKNOWN, 0 },
-/* 8 */ { SDL_SCANCODE_UNKNOWN, 0 },
-/* 9 */ { SDL_SCANCODE_UNKNOWN, 0 },
-/* 10 */ { SDL_SCANCODE_UNKNOWN, 0 },
-/* 11 */ { SDL_SCANCODE_UNKNOWN, 0 },
-/* 12 */ { SDL_SCANCODE_UNKNOWN, 0 },
-/* 13 */ { SDL_SCANCODE_RETURN, 0 },
-/* 14 */ { SDL_SCANCODE_UNKNOWN, 0 },
-/* 15 */ { SDL_SCANCODE_UNKNOWN, 0 },
-/* 16 */ { SDL_SCANCODE_UNKNOWN, 0 },
-/* 17 */ { SDL_SCANCODE_UNKNOWN, 0 },
-/* 18 */ { SDL_SCANCODE_UNKNOWN, 0 },
-/* 19 */ { SDL_SCANCODE_UNKNOWN, 0 },
-/* 20 */ { SDL_SCANCODE_UNKNOWN, 0 },
-/* 21 */ { SDL_SCANCODE_UNKNOWN, 0 },
-/* 22 */ { SDL_SCANCODE_UNKNOWN, 0 },
-/* 23 */ { SDL_SCANCODE_UNKNOWN, 0 },
-/* 24 */ { SDL_SCANCODE_UNKNOWN, 0 },
-/* 25 */ { SDL_SCANCODE_UNKNOWN, 0 },
-/* 26 */ { SDL_SCANCODE_UNKNOWN, 0 },
-/* 27 */ { SDL_SCANCODE_UNKNOWN, 0 },
-/* 28 */ { SDL_SCANCODE_UNKNOWN, 0 },
-/* 29 */ { SDL_SCANCODE_UNKNOWN, 0 },
-/* 30 */ { SDL_SCANCODE_UNKNOWN, 0 },
-/* 31 */ { SDL_SCANCODE_UNKNOWN, 0 },
-/* 32 */ { SDL_SCANCODE_SPACE, 0 },
-/* 33 */ { SDL_SCANCODE_1, KMOD_SHIFT }, /* plus shift modifier '!' */
-/* 34 */ { SDL_SCANCODE_APOSTROPHE, KMOD_SHIFT }, /* plus shift modifier '"' */
-/* 35 */ { SDL_SCANCODE_3, KMOD_SHIFT }, /* plus shift modifier '#' */
-/* 36 */ { SDL_SCANCODE_4, KMOD_SHIFT }, /* plus shift modifier '$' */
-/* 37 */ { SDL_SCANCODE_5, KMOD_SHIFT }, /* plus shift modifier '%' */
-/* 38 */ { SDL_SCANCODE_7, KMOD_SHIFT }, /* plus shift modifier '&' */
-/* 39 */ { SDL_SCANCODE_APOSTROPHE, 0 }, /* ''' */
-/* 40 */ { SDL_SCANCODE_9, KMOD_SHIFT }, /* plus shift modifier '(' */
-/* 41 */ { SDL_SCANCODE_0, KMOD_SHIFT }, /* plus shift modifier ')' */
-/* 42 */ { SDL_SCANCODE_8, KMOD_SHIFT }, /* '*' */
-/* 43 */ { SDL_SCANCODE_EQUALS, KMOD_SHIFT }, /* plus shift modifier '+' */
-/* 44 */ { SDL_SCANCODE_COMMA, 0 }, /* ',' */
-/* 45 */ { SDL_SCANCODE_MINUS, 0 }, /* '-' */
-/* 46 */ { SDL_SCANCODE_PERIOD, 0 }, /* '.' */
-/* 47 */ { SDL_SCANCODE_SLASH, 0 }, /* '/' */
-/* 48 */ { SDL_SCANCODE_0, 0 },
-/* 49 */ { SDL_SCANCODE_1, 0 },
-/* 50 */ { SDL_SCANCODE_2, 0 },
-/* 51 */ { SDL_SCANCODE_3, 0 },
-/* 52 */ { SDL_SCANCODE_4, 0 },
-/* 53 */ { SDL_SCANCODE_5, 0 },
-/* 54 */ { SDL_SCANCODE_6, 0 },
-/* 55 */ { SDL_SCANCODE_7, 0 },
-/* 56 */ { SDL_SCANCODE_8, 0 },
-/* 57 */ { SDL_SCANCODE_9, 0 },
-/* 58 */ { SDL_SCANCODE_SEMICOLON, KMOD_SHIFT }, /* plus shift modifier ';' */
-/* 59 */ { SDL_SCANCODE_SEMICOLON, 0 },
-/* 60 */ { SDL_SCANCODE_COMMA, KMOD_SHIFT }, /* plus shift modifier '<' */
-/* 61 */ { SDL_SCANCODE_EQUALS, 0 },
-/* 62 */ { SDL_SCANCODE_PERIOD, KMOD_SHIFT }, /* plus shift modifier '>' */
-/* 63 */ { SDL_SCANCODE_SLASH, KMOD_SHIFT }, /* plus shift modifier '?' */
-/* 64 */ { SDL_SCANCODE_2, KMOD_SHIFT }, /* plus shift modifier '@' */
-/* 65 */ { SDL_SCANCODE_A, KMOD_SHIFT }, /* all the following need shift modifiers */
-/* 66 */ { SDL_SCANCODE_B, KMOD_SHIFT },
-/* 67 */ { SDL_SCANCODE_C, KMOD_SHIFT },
-/* 68 */ { SDL_SCANCODE_D, KMOD_SHIFT },
-/* 69 */ { SDL_SCANCODE_E, KMOD_SHIFT },
-/* 70 */ { SDL_SCANCODE_F, KMOD_SHIFT },
-/* 71 */ { SDL_SCANCODE_G, KMOD_SHIFT },
-/* 72 */ { SDL_SCANCODE_H, KMOD_SHIFT },
-/* 73 */ { SDL_SCANCODE_I, KMOD_SHIFT },
-/* 74 */ { SDL_SCANCODE_J, KMOD_SHIFT },
-/* 75 */ { SDL_SCANCODE_K, KMOD_SHIFT },
-/* 76 */ { SDL_SCANCODE_L, KMOD_SHIFT },
-/* 77 */ { SDL_SCANCODE_M, KMOD_SHIFT },
-/* 78 */ { SDL_SCANCODE_N, KMOD_SHIFT },
-/* 79 */ { SDL_SCANCODE_O, KMOD_SHIFT },
-/* 80 */ { SDL_SCANCODE_P, KMOD_SHIFT },
-/* 81 */ { SDL_SCANCODE_Q, KMOD_SHIFT },
-/* 82 */ { SDL_SCANCODE_R, KMOD_SHIFT },
-/* 83 */ { SDL_SCANCODE_S, KMOD_SHIFT },
-/* 84 */ { SDL_SCANCODE_T, KMOD_SHIFT },
-/* 85 */ { SDL_SCANCODE_U, KMOD_SHIFT },
-/* 86 */ { SDL_SCANCODE_V, KMOD_SHIFT },
-/* 87 */ { SDL_SCANCODE_W, KMOD_SHIFT },
-/* 88 */ { SDL_SCANCODE_X, KMOD_SHIFT },
-/* 89 */ { SDL_SCANCODE_Y, KMOD_SHIFT },
-/* 90 */ { SDL_SCANCODE_Z, KMOD_SHIFT },
-/* 91 */ { SDL_SCANCODE_LEFTBRACKET, 0 },
-/* 92 */ { SDL_SCANCODE_BACKSLASH, 0 },
-/* 93 */ { SDL_SCANCODE_RIGHTBRACKET, 0 },
-/* 94 */ { SDL_SCANCODE_6, KMOD_SHIFT }, /* plus shift modifier '^' */
-/* 95 */ { SDL_SCANCODE_MINUS, KMOD_SHIFT }, /* plus shift modifier '_' */
-/* 96 */ { SDL_SCANCODE_GRAVE, KMOD_SHIFT }, /* '`' */
-/* 97 */ { SDL_SCANCODE_A, 0 },
-/* 98 */ { SDL_SCANCODE_B, 0 },
-/* 99 */ { SDL_SCANCODE_C, 0 },
-/* 100 */{ SDL_SCANCODE_D, 0 },
-/* 101 */{ SDL_SCANCODE_E, 0 },
-/* 102 */{ SDL_SCANCODE_F, 0 },
-/* 103 */{ SDL_SCANCODE_G, 0 },
-/* 104 */{ SDL_SCANCODE_H, 0 },
-/* 105 */{ SDL_SCANCODE_I, 0 },
-/* 106 */{ SDL_SCANCODE_J, 0 },
-/* 107 */{ SDL_SCANCODE_K, 0 },
-/* 108 */{ SDL_SCANCODE_L, 0 },
-/* 109 */{ SDL_SCANCODE_M, 0 },
-/* 110 */{ SDL_SCANCODE_N, 0 },
-/* 111 */{ SDL_SCANCODE_O, 0 },
-/* 112 */{ SDL_SCANCODE_P, 0 },
-/* 113 */{ SDL_SCANCODE_Q, 0 },
-/* 114 */{ SDL_SCANCODE_R, 0 },
-/* 115 */{ SDL_SCANCODE_S, 0 },
-/* 116 */{ SDL_SCANCODE_T, 0 },
-/* 117 */{ SDL_SCANCODE_U, 0 },
-/* 118 */{ SDL_SCANCODE_V, 0 },
-/* 119 */{ SDL_SCANCODE_W, 0 },
-/* 120 */{ SDL_SCANCODE_X, 0 },
-/* 121 */{ SDL_SCANCODE_Y, 0 },
-/* 122 */{ SDL_SCANCODE_Z, 0 },
-/* 123 */{ SDL_SCANCODE_LEFTBRACKET, KMOD_SHIFT }, /* plus shift modifier '{' */
-/* 124 */{ SDL_SCANCODE_BACKSLASH, KMOD_SHIFT }, /* plus shift modifier '|' */
-/* 125 */{ SDL_SCANCODE_RIGHTBRACKET, KMOD_SHIFT }, /* plus shift modifier '}' */
-/* 126 */{ SDL_SCANCODE_GRAVE, KMOD_SHIFT }, /* plus shift modifier '~' */
-/* 127 */{ SDL_SCANCODE_BACKSPACE, KMOD_SHIFT }
-};
-
-#endif /* _ANDROID_KeyInfo */
-
-/* vi: set ts=4 sw=4 expandtab: */
diff --git a/src/events/SDL_keyboard.c b/src/events/SDL_keyboard.c
index be1b7953e30..aa75f5d82a1 100644
--- a/src/events/SDL_keyboard.c
+++ b/src/events/SDL_keyboard.c
@@ -27,6 +27,7 @@
#include "SDL_events.h"
#include "SDL_events_c.h"
#include "../video/SDL_sysvideo.h"
+#include "scancodes_ascii.h"
/* #define DEBUG_KEYBOARD */
@@ -819,6 +820,33 @@ SDL_SendKeyboardKeyInternal(Uint8 source, Uint8 state, SDL_Scancode scancode)
return (posted);
}
+int
+SDL_SendKeyboardUnicodeKey(Uint32 ch)
+{
+ SDL_Scancode code = SDL_SCANCODE_UNKNOWN;
+ uint16_t mod = 0;
+
+ if (ch < SDL_arraysize(SDL_ASCIIKeyInfoTable)) {
+ code = SDL_ASCIIKeyInfoTable[ch].code;
+ mod = SDL_ASCIIKeyInfoTable[ch].mod;
+ }
+
+ if (mod & KMOD_SHIFT) {
+ /* If the character uses shift, press shift down */
+ SDL_SendKeyboardKey(SDL_PRESSED, SDL_SCANCODE_LSHIFT);
+ }
+
+ /* Send a keydown and keyup for the character */
+ SDL_SendKeyboardKey(SDL_PRESSED, code);
+ SDL_SendKeyboardKey(SDL_RELEASED, code);
+
+ if (mod & KMOD_SHIFT) {
+ /* If the character uses shift, release shift */
+ SDL_SendKeyboardKey(SDL_RELEASED, SDL_SCANCODE_LSHIFT);
+ }
+ return 0;
+}
+
int
SDL_SendKeyboardKey(Uint8 state, SDL_Scancode scancode)
{
diff --git a/src/events/SDL_keyboard_c.h b/src/events/SDL_keyboard_c.h
index fffd012c2d0..d10158d0426 100644
--- a/src/events/SDL_keyboard_c.h
+++ b/src/events/SDL_keyboard_c.h
@@ -47,6 +47,11 @@ extern void SDL_SetScancodeName(SDL_Scancode scancode, const char *name);
/* Set the keyboard focus window */
extern void SDL_SetKeyboardFocus(SDL_Window * window);
+/* Send a character from an on-screen keyboard as scancode and modifier key events,
+ currently assuming ASCII characters on a US keyboard layout
+ */
+extern int SDL_SendKeyboardUnicodeKey(Uint32 ch);
+
/* Send a keyboard key event */
extern int SDL_SendKeyboardKey(Uint8 state, SDL_Scancode scancode);
extern int SDL_SendKeyboardKeyAutoRelease(SDL_Scancode scancode);
diff --git a/src/events/scancodes_ascii.h b/src/events/scancodes_ascii.h
new file mode 100644
index 00000000000..47067fb934a
--- /dev/null
+++ b/src/events/scancodes_ascii.h
@@ -0,0 +1,170 @@
+/*
+ Simple DirectMedia Layer
+ Copyright (C) 1997-2022 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_scancode.h"
+#include "SDL_keycode.h"
+
+/*
+ This file is used to convert between characters passed in from an ASCII
+ virtual keyboard in US layout and tuples of SDL_Scancode and SDL_keymods.
+
+ For example ASCIIKeyInfoTable['a'] would give you the scan code and keymod
+ for lower case a.
+*/
+
+typedef struct
+{
+ SDL_Scancode code;
+ uint16_t mod;
+} ASCIIKeyInfo;
+
+static ASCIIKeyInfo SDL_ASCIIKeyInfoTable[] = {
+/* 0 */ { SDL_SCANCODE_UNKNOWN, 0 },
+/* 1 */ { SDL_SCANCODE_UNKNOWN, 0 },
+/* 2 */ { SDL_SCANCODE_UNKNOWN, 0 },
+/* 3 */ { SDL_SCANCODE_UNKNOWN, 0 },
+/* 4 */ { SDL_SCANCODE_UNKNOWN, 0 },
+/* 5 */ { SDL_SCANCODE_UNKNOWN, 0 },
+/* 6 */ { SDL_SCANCODE_UNKNOWN, 0 },
+/* 7 */ { SDL_SCANCODE_UNKNOWN, 0 },
+/* 8 */ { SDL_SCANCODE_UNKNOWN, 0 },
+/* 9 */ { SDL_SCANCODE_UNKNOWN, 0 },
+/* 10 */ { SDL_SCANCODE_UNKNOWN, 0 },
+/* 11 */ { SDL_SCANCODE_UNKNOWN, 0 },
+/* 12 */ { SDL_SCANCODE_UNKNOWN, 0 },
+/* 13 */ { SDL_SCANCODE_RETURN, 0 },
+/* 14 */ { SDL_SCANCODE_UNKNOWN, 0 },
+/* 15 */ { SDL_SCANCODE_UNKNOWN, 0 },
+/* 16 */ { SDL_SCANCODE_UNKNOWN, 0 },
+/* 17 */ { SDL_SCANCODE_UNKNOWN, 0 },
+/* 18 */ { SDL_SCANCODE_UNKNOWN, 0 },
+/* 19 */ { SDL_SCANCODE_UNKNOWN, 0 },
+/* 20 */ { SDL_SCANCODE_UNKNOWN, 0 },
+/* 21 */ { SDL_SCANCODE_UNKNOWN, 0 },
+/* 22 */ { SDL_SCANCODE_UNKNOWN, 0 },
+/* 23 */ { SDL_SCANCODE_UNKNOWN, 0 },
+/* 24 */ { SDL_SCANCODE_UNKNOWN, 0 },
+/* 25 */ { SDL_SCANCODE_UNKNOWN, 0 },
+/* 26 */ { SDL_SCANCODE_UNKNOWN, 0 },
+/* 27 */ { SDL_SCANCODE_UNKNOWN, 0 },
+/* 28 */ { SDL_SCANCODE_UNKNOWN, 0 },
+/* 29 */ { SDL_SCANCODE_UNKNOWN, 0 },
+/* 30 */ { SDL_SCANCODE_UNKNOWN, 0 },
+/* 31 */ { SDL_SCANCODE_UNKNOWN, 0 },
+/* 32 */ { SDL_SCANCODE_SPACE, 0 },
+/* 33 */ { SDL_SCANCODE_1, KMOD_SHIFT }, /* plus shift modifier '!' */
+/* 34 */ { SDL_SCANCODE_APOSTROPHE, KMOD_SHIFT }, /* plus shift modifier '"' */
+/* 35 */ { SDL_SCANCODE_3, KMOD_SHIFT }, /* plus shift modifier '#' */
+/* 36 */ { SDL_SCANCODE_4, KMOD_SHIFT }, /* plus shift modifier '$' */
+/* 37 */ { SDL_SCANCODE_5, KMOD_SHIFT }, /* plus shift modifier '%' */
+/* 38 */ { SDL_SCANCODE_7, KMOD_SHIFT }, /* plus shift modifier '&' */
+/* 39 */ { SDL_SCANCODE_APOSTROPHE, 0 }, /* ''' */
+/* 40 */ { SDL_SCANCODE_9, KMOD_SHIFT }, /* plus shift modifier '(' */
+/* 41 */ { SDL_SCANCODE_0, KMOD_SHIFT }, /* plus shift modifier ')' */
+/* 42 */ { SDL_SCANCODE_8, KMOD_SHIFT }, /* '*' */
+/* 43 */ { SDL_SCANCODE_EQUALS, KMOD_SHIFT }, /* plus shift modifier '+' */
+/* 44 */ { SDL_SCANCODE_COMMA, 0 }, /* ',' */
+/* 45 */ { SDL_SCANCODE_MINUS, 0 }, /* '-' */
+/* 46 */ { SDL_SCANCODE_PERIOD, 0 }, /* '.' */
+/* 47 */ { SDL_SCANCODE_SLASH, 0 }, /* '/' */
+/* 48 */ { SDL_SCANCODE_0, 0 },
+/* 49 */ { SDL_SCANCODE_1, 0 },
+/* 50 */ { SDL_SCANCODE_2, 0 },
+/* 51 */ { SDL_SCANCODE_3, 0 },
+/* 52 */ { SDL_SCANCODE_4, 0 },
+/* 53 */ { SDL_SCANCODE_5, 0 },
+/* 54 */ { SDL_SCANCODE_6, 0 },
+/* 55 */ { SDL_SCANCODE_7, 0 },
+/* 56 */ { SDL_SCANCODE_8, 0 },
+/* 57 */ { SDL_SCANCODE_9, 0 },
+/* 58 */ { SDL_SCANCODE_SEMICOLON, KMOD_SHIFT }, /* plus shift modifier ';' */
+/* 59 */ { SDL_SCANCODE_SEMICOLON, 0 },
+/* 60 */ { SDL_SCANCODE_COMMA, KMOD_SHIFT }, /* plus shift modifier '<' */
+/* 61 */ { SDL_SCANCODE_EQUALS, 0 },
+/* 62 */ { SDL_SCANCODE_PERIOD, KMOD_SHIFT }, /* plus shift modifier '>' */
+/* 63 */ { SDL_SCANCODE_SLASH, KMOD_SHIFT }, /* plus shift modifier '?' */
+/* 64 */ { SDL_SCANCODE_2, KMOD_SHIFT }, /* plus shift modifier '@' */
+/* 65 */ { SDL_SCANCODE_A, KMOD_SHIFT }, /* all the following need shift modifiers */
+/* 66 */ { SDL_SCANCODE_B, KMOD_SHIFT },
+/* 67 */ { SDL_SCANCODE_C, KMOD_SHIFT },
+/* 68 */ { SDL_SCANCODE_D, KMOD_SHIFT },
+/* 69 */ { SDL_SCANCODE_E, KMOD_SHIFT },
+/* 70 */ { SDL_SCANCODE_F, KMOD_SHIFT },
+/* 71 */ { SDL_SCANCODE_G, KMOD_SHIFT },
+/* 72 */ { SDL_SCANCODE_H, KMOD_SHIFT },
+/* 73 */ { SDL_SCANCODE_I, KMOD_SHIFT },
+/* 74 */ { SDL_SCANCODE_J, KMOD_SHIFT },
+/* 75 */ { SDL_SCANCODE_K, KMOD_SHIFT },
+/* 76 */ { SDL_SCANCODE_L, KMOD_SHIFT },
+/* 77 */ { SDL_SCANCODE_M, KMOD_SHIFT },
+/* 78 */ { SDL_SCANCODE_N, KMOD_SHIFT },
+/* 79 */ { SDL_SCANCODE_O, KMOD_SHIFT },
+/* 80 */ { SDL_SCANCODE_P, KMOD_SHIFT },
+/* 81 */ { SDL_SCANCODE_Q, KMOD_SHIFT },
+/* 82 */ { SDL_SCANCODE_R, KMOD_SHIFT },
+/* 83 */ { SDL_SCANCODE_S, KMOD_SHIFT },
+/* 84 */ { SDL_SCANCODE_T, KMOD_SHIFT },
+/* 85 */ { SDL_SCANCODE_U, KMOD_SHIFT },
+/* 86 */ { SDL_SCANCODE_V, KMOD_SHIFT },
+/* 87 */ { SDL_SCANCODE_W, KMOD_SHIFT },
+/* 88 */ { SDL_SCANCODE_X, KMOD_SHIFT },
+/* 89 */ { SDL_SCANCODE_Y, KMOD_SHIFT },
+/* 90 */ { SDL_SCANCODE_Z, KMOD_SHIFT },
+/* 91 */ { SDL_SCANCODE_LEFTBRACKET, 0 },
+/* 92 */ { SDL_SCANCODE_BACKSLASH, 0 },
+/* 93 */ { SDL_SCANCODE_RIGHTBRACKET, 0 },
+/* 94 */ { SDL_SCANCODE_6, KMOD_SHIFT }, /* plus shift modifier '^' */
+/* 95 */ { SDL_SCANCODE_MINUS, KMOD_SHIFT }, /* plus shift modifier '_' */
+/* 96 */ { SDL_SCANCODE_GRAVE, KMOD_SHIFT }, /* '`' */
+/* 97 */ { SDL_SCANCODE_A, 0 },
+/* 98 */ { SDL_SCANCODE_B, 0 },
+/* 99 */ { SDL_SCANCODE_C, 0 },
+/* 100 */ { SDL_SCANCODE_D, 0 },
+/* 101 */ { SDL_SCANCODE_E, 0 },
+/* 102 */ { SDL_SCANCODE_F, 0 },
+/* 103 */ { SDL_SCANCODE_G, 0 },
+/* 104 */ { SDL_SCANCODE_H, 0 },
+/* 105 */ { SDL_SCANCODE_I, 0 },
+/* 106 */ { SDL_SCANCODE_J, 0 },
+/* 107 */ { SDL_SCANCODE_K, 0 },
+/* 108 */ { SDL_SCANCODE_L, 0 },
+/* 109 */ { SDL_SCANCODE_M, 0 },
+/* 110 */ { SDL_SCANCODE_N, 0 },
+/* 111 */ { SDL_SCANCODE_O, 0 },
+/* 112 */ { SDL_SCANCODE_P, 0 },
+/* 113 */ { SDL_SCANCODE_Q, 0 },
+/* 114 */ { SDL_SCANCODE_R, 0 },
+/* 115 */ { SDL_SCANCODE_S, 0 },
+/* 116 */ { SDL_SCANCODE_T, 0 },
+/* 117 */ { SDL_SCANCODE_U, 0 },
+/* 118 */ { SDL_SCANCODE_V, 0 },
+/* 119 */ { SDL_SCANCODE_W, 0 },
+/* 120 */ { SDL_SCANCODE_X, 0 },
+/* 121 */ { SDL_SCANCODE_Y, 0 },
+/* 122 */ { SDL_SCANCODE_Z, 0 },
+/* 123 */ { SDL_SCANCODE_LEFTBRACKET, KMOD_SHIFT }, /* plus shift modifier '{' */
+/* 124 */ { SDL_SCANCODE_BACKSLASH, KMOD_SHIFT }, /* plus shift modifier '|' */
+/* 125 */ { SDL_SCANCODE_RIGHTBRACKET, KMOD_SHIFT }, /* plus shift modifier '}' */
+/* 126 */ { SDL_SCANCODE_GRAVE, KMOD_SHIFT }, /* plus shift modifier '~' */
+/* 127 */ { SDL_SCANCODE_BACKSPACE, KMOD_SHIFT }
+};
+
+/* vi: set ts=4 sw=4 expandtab: */
diff --git a/src/video/uikit/SDL_uikitviewcontroller.m b/src/video/uikit/SDL_uikitviewcontroller.m
index 2ab23abd937..23a504c412b 100644
--- a/src/video/uikit/SDL_uikitviewcontroller.m
+++ b/src/video/uikit/SDL_uikitviewcontroller.m
@@ -35,10 +35,6 @@
#include "SDL_uikitwindow.h"
#include "SDL_uikitopengles.h"
-#if SDL_IPHONE_KEYBOARD
-#include "keyinfotable.h"
-#endif
-
#if TARGET_OS_TV
static void SDLCALL
SDL_AppleTVControllerUIHintChanged(void *userdata, const char *name, const char *oldValue, const char *hint)
@@ -421,33 +417,7 @@ - (void)textFieldTextDidChange:(NSNotification *)notification
* convert them to key presses */
int i;
for (i = 0; i < len; i++) {
- unichar c = [changeText characterAtIndex:i];
- SDL_Scancode code;
- Uint16 mod;
-
- if (c < 127) {
- /* Figure out the SDL_Scancode and SDL_keymod for this unichar */
- code = unicharToUIKeyInfoTable[c].code;
- mod = unicharToUIKeyInfoTable[c].mod;
- } else {
- /* We only deal with ASCII right now */
- code = SDL_SCANCODE_UNKNOWN;
- mod = 0;
- }
-
- if (mod & KMOD_SHIFT) {
- /* If character uses shift, press shift */
- SDL_SendKeyboardKey(SDL_PRESSED, SDL_SCANCODE_LSHIFT);
- }
-
- /* send a keydown and keyup even for the character */
- SDL_SendKeyboardKey(SDL_PRESSED, code);
- SDL_SendKeyboardKey(SDL_RELEASED, code);
-
- if (mod & KMOD_SHIFT) {
- /* If character uses shift, release shift */
- SDL_SendKeyboardKey(SDL_RELEASED, SDL_SCANCODE_LSHIFT);
- }
+ SDL_SendKeyboardUnicodeKey([changeText characterAtIndex:i]);
}
}
SDL_SendKeyboardText([changeText UTF8String]);
diff --git a/src/video/uikit/keyinfotable.h b/src/video/uikit/keyinfotable.h
deleted file mode 100644
index 25df105344d..00000000000
--- a/src/video/uikit/keyinfotable.h
+++ /dev/null
@@ -1,174 +0,0 @@
-/*
- Simple DirectMedia Layer
- Copyright (C) 1997-2022 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.
-*/
-
-#ifndef _UIKIT_KeyInfo
-#define _UIKIT_KeyInfo
-
-#include "SDL_scancode.h"
-
-/*
- This file is used by the keyboard code in SDL_uikitview.m to convert between characters
- passed in from the iPhone's virtual keyboard, and tuples of SDL_Scancode and SDL_keymods.
- For example unicharToUIKeyInfoTable['a'] would give you the scan code and keymod for lower
- case a.
-*/
-
-typedef struct
-{
- SDL_Scancode code;
- Uint16 mod;
-} UIKitKeyInfo;
-
-/* So far only ASCII characters here */
-static UIKitKeyInfo unicharToUIKeyInfoTable[] = {
-/* 0 */ { SDL_SCANCODE_UNKNOWN, 0 },
-/* 1 */ { SDL_SCANCODE_UNKNOWN, 0 },
-/* 2 */ { SDL_SCANCODE_UNKNOWN, 0 },
-/* 3 */ { SDL_SCANCODE_UNKNOWN, 0 },
-/* 4 */ { SDL_SCANCODE_UNKNOWN, 0 },
-/* 5 */ { SDL_SCANCODE_UNKNOWN, 0 },
-/* 6 */ { SDL_SCANCODE_UNKNOWN, 0 },
-/* 7 */ { SDL_SCANCODE_UNKNOWN, 0 },
-/* 8 */ { SDL_SCANCODE_UNKNOWN, 0 },
-/* 9 */ { SDL_SCANCODE_UNKNOWN, 0 },
-/* 10 */ { SDL_SCANCODE_UNKNOWN, 0 },
-/* 11 */ { SDL_SCANCODE_UNKNOWN, 0 },
-/* 12 */ { SDL_SCANCODE_UNKNOWN, 0 },
-/* 13 */ { SDL_SCANCODE_RETURN, 0 },
-/* 14 */ { SDL_SCANCODE_UNKNOWN, 0 },
-/* 15 */ { SDL_SCANCODE_UNKNOWN, 0 },
-/* 16 */ { SDL_SCANCODE_UNKNOWN, 0 },
-/* 17 */ { SDL_SCANCODE_UNKNOWN, 0 },
-/* 18 */ { SDL_SCANCODE_UNKNOWN, 0 },
-/* 19 */ { SDL_SCANCODE_UNKNOWN, 0 },
-/* 20 */ { SDL_SCANCODE_UNKNOWN, 0 },
-/* 21 */ { SDL_SCANCODE_UNKNOWN, 0 },
-/* 22 */ { SDL_SCANCODE_UNKNOWN, 0 },
-/* 23 */ { SDL_SCANCODE_UNKNOWN, 0 },
-/* 24 */ { SDL_SCANCODE_UNKNOWN, 0 },
-/* 25 */ { SDL_SCANCODE_UNKNOWN, 0 },
-/* 26 */ { SDL_SCANCODE_UNKNOWN, 0 },
-/* 27 */ { SDL_SCANCODE_UNKNOWN, 0 },
-/* 28 */ { SDL_SCANCODE_UNKNOWN, 0 },
-/* 29 */ { SDL_SCANCODE_UNKNOWN, 0 },
-/* 30 */ { SDL_SCANCODE_UNKNOWN, 0 },
-/* 31 */ { SDL_SCANCODE_UNKNOWN, 0 },
-/* 32 */ { SDL_SCANCODE_SPACE, 0 },
-/* 33 */ { SDL_SCANCODE_1, KMOD_SHIFT }, /* plus shift modifier '!' */
-/* 34 */ { SDL_SCANCODE_APOSTROPHE, KMOD_SHIFT }, /* plus shift modifier '"' */
-/* 35 */ { SDL_SCANCODE_3, KMOD_SHIFT }, /* plus shift modifier '#' */
-/* 36 */ { SDL_SCANCODE_4, KMOD_SHIFT }, /* plus shift modifier '$' */
-/* 37 */ { SDL_SCANCODE_5, KMOD_SHIFT }, /* plus shift modifier '%' */
-/* 38 */ { SDL_SCANCODE_7, KMOD_SHIFT }, /* plus shift modifier '&' */
-/* 39 */ { SDL_SCANCODE_APOSTROPHE, 0 }, /* ''' */
-/* 40 */ { SDL_SCANCODE_9, KMOD_SHIFT }, /* plus shift modifier '(' */
-/* 41 */ { SDL_SCANCODE_0, KMOD_SHIFT }, /* plus shift modifier ')' */
-/* 42 */ { SDL_SCANCODE_8, KMOD_SHIFT }, /* '*' */
-/* 43 */ { SDL_SCANCODE_EQUALS, KMOD_SHIFT }, /* plus shift modifier '+' */
-/* 44 */ { SDL_SCANCODE_COMMA, 0 }, /* ',' */
-/* 45 */ { SDL_SCANCODE_MINUS, 0 }, /* '-' */
-/* 46 */ { SDL_SCANCODE_PERIOD, 0 }, /* '.' */
-/* 47 */ { SDL_SCANCODE_SLASH, 0 }, /* '/' */
-/* 48 */ { SDL_SCANCODE_0, 0 },
-/* 49 */ { SDL_SCANCODE_1, 0 },
-/* 50 */ { SDL_SCANCODE_2, 0 },
-/* 51 */ { SDL_SCANCODE_3, 0 },
-/* 52 */ { SDL_SCANCODE_4, 0 },
-/* 53 */ { SDL_SCANCODE_5, 0 },
-/* 54 */ { SDL_SCANCODE_6, 0 },
-/* 55 */ { SDL_SCANCODE_7, 0 },
-/* 56 */ { SDL_SCANCODE_8, 0 },
-/* 57 */ { SDL_SCANCODE_9, 0 },
-/* 58 */ { SDL_SCANCODE_SEMICOLON, KMOD_SHIFT }, /* plus shift modifier ';' */
-/* 59 */ { SDL_SCANCODE_SEMICOLON, 0 },
-/* 60 */ { SDL_SCANCODE_COMMA, KMOD_SHIFT }, /* plus shift modifier '<' */
-/* 61 */ { SDL_SCANCODE_EQUALS, 0 },
-/* 62 */ { SDL_SCANCODE_PERIOD, KMOD_SHIFT }, /* plus shift modifier '>' */
-/* 63 */ { SDL_SCANCODE_SLASH, KMOD_SHIFT }, /* plus shift modifier '?' */
-/* 64 */ { SDL_SCANCODE_2, KMOD_SHIFT }, /* plus shift modifier '@' */
-/* 65 */ { SDL_SCANCODE_A, KMOD_SHIFT }, /* all the following need shift modifiers */
-/* 66 */ { SDL_SCANCODE_B, KMOD_SHIFT },
-/* 67 */ { SDL_SCANCODE_C, KMOD_SHIFT },
-/* 68 */ { SDL_SCANCODE_D, KMOD_SHIFT },
-/* 69 */ { SDL_SCANCODE_E, KMOD_SHIFT },
-/* 70 */ { SDL_SCANCODE_F, KMOD_SHIFT },
-/* 71 */ { SDL_SCANCODE_G, KMOD_SHIFT },
-/* 72 */ { SDL_SCANCODE_H, KMOD_SHIFT },
-/* 73 */ { SDL_SCANCODE_I, KMOD_SHIFT },
-/* 74 */ { SDL_SCANCODE_J, KMOD_SHIFT },
-/* 75 */ { SDL_SCANCODE_K, KMOD_SHIFT },
-/* 76 */ { SDL_SCANCODE_L, KMOD_SHIFT },
-/* 77 */ { SDL_SCANCODE_M, KMOD_SHIFT },
-/* 78 */ { SDL_SCANCODE_N, KMOD_SHIFT },
-/* 79 */ { SDL_SCANCODE_O, KMOD_SHIFT },
-/* 80 */ { SDL_SCANCODE_P, KMOD_SHIFT },
-/* 81 */ { SDL_SCANCODE_Q, KMOD_SHIFT },
-/* 82 */ { SDL_SCANCODE_R, KMOD_SHIFT },
-/* 83 */ { SDL_SCANCODE_S, KMOD_SHIFT },
-/* 84 */ { SDL_SCANCODE_T, KMOD_SHIFT },
-/* 85 */ { SDL_SCANCODE_U, KMOD_SHIFT },
-/* 86 */ { SDL_SCANCODE_V, KMOD_SHIFT },
-/* 87 */ { SDL_SCANCODE_W, KMOD_SHIFT },
-/* 88 */ { SDL_SCANCODE_X, KMOD_SHIFT },
-/* 89 */ { SDL_SCANCODE_Y, KMOD_SHIFT },
-/* 90 */ { SDL_SCANCODE_Z, KMOD_SHIFT },
-/* 91 */ { SDL_SCANCODE_LEFTBRACKET, 0 },
-/* 92 */ { SDL_SCANCODE_BACKSLASH, 0 },
-/* 93 */ { SDL_SCANCODE_RIGHTBRACKET, 0 },
-/* 94 */ { SDL_SCANCODE_6, KMOD_SHIFT }, /* plus shift modifier '^' */
-/* 95 */ { SDL_SCANCODE_MINUS, KMOD_SHIFT }, /* plus shift modifier '_' */
-/* 96 */ { SDL_SCANCODE_GRAVE, KMOD_SHIFT }, /* '`' */
-/* 97 */ { SDL_SCANCODE_A, 0 },
-/* 98 */ { SDL_SCANCODE_B, 0 },
-/* 99 */ { SDL_SCANCODE_C, 0 },
-/* 100 */{ SDL_SCANCODE_D, 0 },
-/* 101 */{ SDL_SCANCODE_E, 0 },
-/* 102 */{ SDL_SCANCODE_F, 0 },
-/* 103 */{ SDL_SCANCODE_G, 0 },
-/* 104 */{ SDL_SCANCODE_H, 0 },
-/* 105 */{ SDL_SCANCODE_I, 0 },
-/* 106 */{ SDL_SCANCODE_J, 0 },
-/* 107 */{ SDL_SCANCODE_K, 0 },
-/* 108 */{ SDL_SCANCODE_L, 0 },
-/* 109 */{ SDL_SCANCODE_M, 0 },
-/* 110 */{ SDL_SCANCODE_N, 0 },
-/* 111 */{ SDL_SCANCODE_O, 0 },
-/* 112 */{ SDL_SCANCODE_P, 0 },
-/* 113 */{ SDL_SCANCODE_Q, 0 },
-/* 114 */{ SDL_SCANCODE_R, 0 },
-/* 115 */{ SDL_SCANCODE_S, 0 },
-/* 116 */{ SDL_SCANCODE_T, 0 },
-/* 117 */{ SDL_SCANCODE_U, 0 },
-/* 118 */{ SDL_SCANCODE_V, 0 },
-/* 119 */{ SDL_SCANCODE_W, 0 },
-/* 120 */{ SDL_SCANCODE_X, 0 },
-/* 121 */{ SDL_SCANCODE_Y, 0 },
-/* 122 */{ SDL_SCANCODE_Z, 0 },
-/* 123 */{ SDL_SCANCODE_LEFTBRACKET, KMOD_SHIFT }, /* plus shift modifier '{' */
-/* 124 */{ SDL_SCANCODE_BACKSLASH, KMOD_SHIFT }, /* plus shift modifier '|' */
-/* 125 */{ SDL_SCANCODE_RIGHTBRACKET, KMOD_SHIFT }, /* plus shift modifier '}' */
-/* 126 */{ SDL_SCANCODE_GRAVE, KMOD_SHIFT }, /* plus shift modifier '~' */
-/* 127 */{ SDL_SCANCODE_BACKSPACE, KMOD_SHIFT }
-};
-
-#endif /* _UIKIT_KeyInfo */
-
-/* vi: set ts=4 sw=4 expandtab: */
(Patch may be truncated, please check the link at the top of this post.)