Changeset - r23911:1f0b84f2a430
[Not reviewed]
master
0 1 0
Jonathan G Rennison - 5 years ago 2019-11-04 17:59:04
j.g.rennison@gmail.com
Fix: [SDL2] Detection of backtick scancode

SDL_Keysym::scancode is a SDL_SCANCODE_* constant, not a raw scan code
1 file changed with 1 insertions and 12 deletions:
0 comments (0 inline, 0 general)
src/video/sdl2_v.cpp
Show inline comments
 
@@ -383,108 +383,97 @@ static const VkMapping _vk_mapping[] = {
 

	
 
	AS(SDLK_ESCAPE,    WKC_ESC),
 
	AS(SDLK_PAUSE,     WKC_PAUSE),
 
	AS(SDLK_BACKSPACE, WKC_BACKSPACE),
 

	
 
	AS(SDLK_SPACE,     WKC_SPACE),
 
	AS(SDLK_RETURN,    WKC_RETURN),
 
	AS(SDLK_TAB,       WKC_TAB),
 

	
 
	/* Function keys */
 
	AM(SDLK_F1, SDLK_F12, WKC_F1, WKC_F12),
 

	
 
	/* Numeric part. */
 
	AM(SDLK_KP_0, SDLK_KP_9, '0', '9'),
 
	AS(SDLK_KP_DIVIDE,   WKC_NUM_DIV),
 
	AS(SDLK_KP_MULTIPLY, WKC_NUM_MUL),
 
	AS(SDLK_KP_MINUS,    WKC_NUM_MINUS),
 
	AS(SDLK_KP_PLUS,     WKC_NUM_PLUS),
 
	AS(SDLK_KP_ENTER,    WKC_NUM_ENTER),
 
	AS(SDLK_KP_PERIOD,   WKC_NUM_DECIMAL),
 

	
 
	/* Other non-letter keys */
 
	AS(SDLK_SLASH,        WKC_SLASH),
 
	AS(SDLK_SEMICOLON,    WKC_SEMICOLON),
 
	AS(SDLK_EQUALS,       WKC_EQUALS),
 
	AS(SDLK_LEFTBRACKET,  WKC_L_BRACKET),
 
	AS(SDLK_BACKSLASH,    WKC_BACKSLASH),
 
	AS(SDLK_RIGHTBRACKET, WKC_R_BRACKET),
 

	
 
	AS(SDLK_QUOTE,   WKC_SINGLEQUOTE),
 
	AS(SDLK_COMMA,   WKC_COMMA),
 
	AS(SDLK_MINUS,   WKC_MINUS),
 
	AS(SDLK_PERIOD,  WKC_PERIOD)
 
};
 

	
 
static uint ConvertSdlKeyIntoMy(SDL_Keysym *sym, WChar *character)
 
{
 
	const VkMapping *map;
 
	uint key = 0;
 

	
 
	for (map = _vk_mapping; map != endof(_vk_mapping); ++map) {
 
		if ((uint)(sym->sym - map->vk_from) <= map->vk_count) {
 
			key = sym->sym - map->vk_from + map->map_to;
 
			break;
 
		}
 
	}
 

	
 
	/* check scancode for BACKQUOTE key, because we want the key left of "1", not anything else (on non-US keyboards) */
 
#if defined(_WIN32) || defined(__OS2__)
 
	if (sym->scancode == 41) key = WKC_BACKQUOTE;
 
#elif defined(__APPLE__)
 
	if (sym->scancode == 10) key = WKC_BACKQUOTE;
 
#elif defined(__SVR4) && defined(__sun)
 
	if (sym->scancode == 60) key = WKC_BACKQUOTE;
 
	if (sym->scancode == 49) key = WKC_BACKSPACE;
 
#elif defined(__sgi__)
 
	if (sym->scancode == 22) key = WKC_BACKQUOTE;
 
#else
 
	if (sym->scancode == 49) key = WKC_BACKQUOTE;
 
#endif
 
	if (sym->scancode == SDL_SCANCODE_GRAVE) key = WKC_BACKQUOTE;
 

	
 
	/* META are the command keys on mac */
 
	if (sym->mod & KMOD_GUI)   key |= WKC_META;
 
	if (sym->mod & KMOD_SHIFT) key |= WKC_SHIFT;
 
	if (sym->mod & KMOD_CTRL)  key |= WKC_CTRL;
 
	if (sym->mod & KMOD_ALT)   key |= WKC_ALT;
 

	
 
	/* The mod keys have no character. Prevent '?' */
 
	if (sym->mod & KMOD_GUI ||
 
		sym->mod & KMOD_SHIFT ||
 
		sym->mod & KMOD_CTRL ||
 
		sym->mod & KMOD_ALT) {
 
		*character = WKC_NONE;
 
	} else {
 
		*character = sym->sym;
 
	}
 

	
 
	return key;
 
}
 

	
 
/**
 
 * Like ConvertSdlKeyIntoMy(), but takes an SDL_Keycode as input
 
 * instead of an SDL_Keysym.
 
 */
 
static uint ConvertSdlKeycodeIntoMy(SDL_Keycode kc)
 
{
 
	const VkMapping *map;
 
	uint key = 0;
 

	
 
	for (map = _vk_mapping; map != endof(_vk_mapping); ++map) {
 
		if ((uint)(kc - map->vk_from) <= map->vk_count) {
 
			key = kc - map->vk_from + map->map_to;
 
			break;
 
		}
 
	}
 

	
 
	/* check scancode for BACKQUOTE key, because we want the key left
 
	   of "1", not anything else (on non-US keyboards) */
 
	SDL_Scancode sc = SDL_GetScancodeFromKey(kc);
 
	if (sc == SDL_SCANCODE_GRAVE) key = WKC_BACKQUOTE;
 

	
 
	return key;
 
}
 

	
 
int VideoDriver_SDL::PollEvent()
 
{
 
	SDL_Event ev;
 

	
0 comments (0 inline, 0 general)