1
0
Fork 0

Change: [SDL2] Add an "unprintable" flag to struct VkMapping

SDL_Keysym::sym is not suitable for checking whether the character
is printable or not
pull/7827/head
Jonathan G Rennison 2019-11-04 19:39:49 +00:00 committed by Charles Pigott
parent d41378c00a
commit 46f7c6a641
1 changed files with 23 additions and 17 deletions

View File

@ -358,40 +358,43 @@ struct VkMapping {
SDL_Keycode vk_from; SDL_Keycode vk_from;
byte vk_count; byte vk_count;
byte map_to; byte map_to;
bool unprintable;
}; };
#define AS(x, z) {x, 0, z} #define AS(x, z) {x, 0, z, false}
#define AM(x, y, z, w) {x, (byte)(y - x), z} #define AM(x, y, z, w) {x, (byte)(y - x), z, false}
#define AS_UP(x, z) {x, 0, z, true}
#define AM_UP(x, y, z, w) {x, (byte)(y - x), z, true}
static const VkMapping _vk_mapping[] = { static const VkMapping _vk_mapping[] = {
/* Pageup stuff + up/down */ /* Pageup stuff + up/down */
AS(SDLK_PAGEUP, WKC_PAGEUP), AS_UP(SDLK_PAGEUP, WKC_PAGEUP),
AS(SDLK_PAGEDOWN, WKC_PAGEDOWN), AS_UP(SDLK_PAGEDOWN, WKC_PAGEDOWN),
AS(SDLK_UP, WKC_UP), AS_UP(SDLK_UP, WKC_UP),
AS(SDLK_DOWN, WKC_DOWN), AS_UP(SDLK_DOWN, WKC_DOWN),
AS(SDLK_LEFT, WKC_LEFT), AS_UP(SDLK_LEFT, WKC_LEFT),
AS(SDLK_RIGHT, WKC_RIGHT), AS_UP(SDLK_RIGHT, WKC_RIGHT),
AS(SDLK_HOME, WKC_HOME), AS_UP(SDLK_HOME, WKC_HOME),
AS(SDLK_END, WKC_END), AS_UP(SDLK_END, WKC_END),
AS(SDLK_INSERT, WKC_INSERT), AS_UP(SDLK_INSERT, WKC_INSERT),
AS(SDLK_DELETE, WKC_DELETE), AS_UP(SDLK_DELETE, WKC_DELETE),
/* Map letters & digits */ /* Map letters & digits */
AM(SDLK_a, SDLK_z, 'A', 'Z'), AM(SDLK_a, SDLK_z, 'A', 'Z'),
AM(SDLK_0, SDLK_9, '0', '9'), AM(SDLK_0, SDLK_9, '0', '9'),
AS(SDLK_ESCAPE, WKC_ESC), AS_UP(SDLK_ESCAPE, WKC_ESC),
AS(SDLK_PAUSE, WKC_PAUSE), AS_UP(SDLK_PAUSE, WKC_PAUSE),
AS(SDLK_BACKSPACE, WKC_BACKSPACE), AS_UP(SDLK_BACKSPACE, WKC_BACKSPACE),
AS(SDLK_SPACE, WKC_SPACE), AS(SDLK_SPACE, WKC_SPACE),
AS(SDLK_RETURN, WKC_RETURN), AS(SDLK_RETURN, WKC_RETURN),
AS(SDLK_TAB, WKC_TAB), AS(SDLK_TAB, WKC_TAB),
/* Function keys */ /* Function keys */
AM(SDLK_F1, SDLK_F12, WKC_F1, WKC_F12), AM_UP(SDLK_F1, SDLK_F12, WKC_F1, WKC_F12),
/* Numeric part. */ /* Numeric part. */
AM(SDLK_KP_0, SDLK_KP_9, '0', '9'), AM(SDLK_KP_0, SDLK_KP_9, '0', '9'),
@ -420,10 +423,12 @@ static uint ConvertSdlKeyIntoMy(SDL_Keysym *sym, WChar *character)
{ {
const VkMapping *map; const VkMapping *map;
uint key = 0; uint key = 0;
bool unprintable = false;
for (map = _vk_mapping; map != endof(_vk_mapping); ++map) { for (map = _vk_mapping; map != endof(_vk_mapping); ++map) {
if ((uint)(sym->sym - map->vk_from) <= map->vk_count) { if ((uint)(sym->sym - map->vk_from) <= map->vk_count) {
key = sym->sym - map->vk_from + map->map_to; key = sym->sym - map->vk_from + map->map_to;
unprintable = map->unprintable;
break; break;
} }
} }
@ -441,7 +446,8 @@ static uint ConvertSdlKeyIntoMy(SDL_Keysym *sym, WChar *character)
if (sym->mod & KMOD_GUI || if (sym->mod & KMOD_GUI ||
sym->mod & KMOD_SHIFT || sym->mod & KMOD_SHIFT ||
sym->mod & KMOD_CTRL || sym->mod & KMOD_CTRL ||
sym->mod & KMOD_ALT) { sym->mod & KMOD_ALT ||
unprintable) {
*character = WKC_NONE; *character = WKC_NONE;
} else { } else {
*character = sym->sym; *character = sym->sym;