Refactored code to send scancodes for an ASCII on-screen keyboard key

This commit is contained in:
Sam Lantinga 2022-06-29 17:26:09 -07:00
parent a054a5f7f2
commit 0ad65277ce
7 changed files with 205 additions and 405 deletions

View file

@ -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)(

View file

@ -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: */

View file

@ -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)
{

View file

@ -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);

View file

@ -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: */

View file

@ -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 @@ SDL_HideHomeIndicatorHintChanged(void *userdata, const char *name, const char *o
* 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]);

View file

@ -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: */