SDL: Merge commit '0ad65277ce7ca025438694caf39f83b80d4eea4c' into main

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.)