Fix incorrect key mappings with non-QWERTY keyboards on both host and client

This commit is contained in:
Cameron Gutman
2018-07-27 02:08:54 -07:00
parent e652dbcc79
commit d9ed3f9694
+78 -74
View File
@@ -9,7 +9,7 @@
#ifndef VK_F1 #ifndef VK_F1
#define VK_F1 0x70 #define VK_F1 0x70
#define VK_F13 0x7C #define VK_F13 0x7C
#define VK_NUMPAD1 0x61 #define VK_NUMPAD0 0x60
#endif #endif
const int SdlInputHandler::k_ButtonMap[] = { const int SdlInputHandler::k_ButtonMap[] = {
@@ -122,195 +122,199 @@ void SdlInputHandler::handleKeyEvent(SDL_KeyboardEvent* event)
modifiers |= MODIFIER_SHIFT; modifiers |= MODIFIER_SHIFT;
} }
// Set keycode // Set keycode. We explicitly use scancode here because GFE will try to correct
if (event->keysym.sym >= SDLK_0 && event->keysym.sym <= SDLK_9) { // for AZERTY layouts on the host but it depends on receiving VK_ values matching
keyCode = (event->keysym.sym - SDLK_0) + VK_0; // a QWERTY layout to work.
if (event->keysym.scancode >= SDL_SCANCODE_1 && event->keysym.scancode <= SDL_SCANCODE_9) {
// SDL defines SDL_SCANCODE_0 > SDL_SCANCODE_9, so we need to handle that manually
keyCode = (event->keysym.scancode - SDL_SCANCODE_1) + VK_0 + 1;
} }
else if (event->keysym.sym >= SDLK_a && event->keysym.sym <= SDLK_z) { else if (event->keysym.scancode >= SDL_SCANCODE_A && event->keysym.scancode <= SDL_SCANCODE_Z) {
keyCode = (event->keysym.sym - SDLK_a) + VK_A; keyCode = (event->keysym.scancode - SDL_SCANCODE_A) + VK_A;
} }
else if (event->keysym.sym >= SDLK_F1 && event->keysym.sym <= SDLK_F12) { else if (event->keysym.scancode >= SDL_SCANCODE_F1 && event->keysym.scancode <= SDL_SCANCODE_F12) {
keyCode = (event->keysym.sym - SDLK_F1) + VK_F1; keyCode = (event->keysym.scancode - SDL_SCANCODE_F1) + VK_F1;
} }
else if (event->keysym.sym >= SDLK_F13 && event->keysym.sym <= SDLK_F24) { else if (event->keysym.scancode >= SDL_SCANCODE_F13 && event->keysym.scancode <= SDL_SCANCODE_F24) {
keyCode = (event->keysym.sym - SDLK_F13) + VK_F13; keyCode = (event->keysym.scancode - SDL_SCANCODE_F13) + VK_F13;
} }
else if (event->keysym.sym >= SDLK_KP_1 && event->keysym.sym <= SDLK_KP_9) { else if (event->keysym.scancode >= SDL_SCANCODE_KP_1 && event->keysym.scancode <= SDL_SCANCODE_KP_9) {
// SDL defines SDLK_KP_0 > SDLK_KP_9, so we need to handle that manually // SDL defines SDL_SCANCODE_KP_0 > SDL_SCANCODE_KP_9, so we need to handle that manually
keyCode = (event->keysym.sym - SDLK_KP_1) + VK_NUMPAD1; keyCode = (event->keysym.scancode - SDL_SCANCODE_KP_1) + VK_NUMPAD0 + 1;
} }
else { else {
switch (event->keysym.sym) { switch (event->keysym.scancode) {
case SDLK_BACKSPACE: case SDL_SCANCODE_BACKSPACE:
keyCode = 0x08; keyCode = 0x08;
break; break;
case SDLK_TAB: case SDL_SCANCODE_TAB:
keyCode = 0x09; keyCode = 0x09;
break; break;
case SDLK_CLEAR: case SDL_SCANCODE_CLEAR:
keyCode = 0x0C; keyCode = 0x0C;
break; break;
case SDLK_RETURN: case SDL_SCANCODE_RETURN:
keyCode = 0x0D; keyCode = 0x0D;
break; break;
case SDLK_PAUSE: case SDL_SCANCODE_PAUSE:
keyCode = 0x13; keyCode = 0x13;
break; break;
case SDLK_CAPSLOCK: case SDL_SCANCODE_CAPSLOCK:
keyCode = 0x14; keyCode = 0x14;
break; break;
case SDLK_ESCAPE: case SDL_SCANCODE_ESCAPE:
keyCode = 0x1B; keyCode = 0x1B;
break; break;
case SDLK_SPACE: case SDL_SCANCODE_SPACE:
keyCode = 0x20; keyCode = 0x20;
break; break;
case SDLK_PAGEUP: case SDL_SCANCODE_PAGEUP:
keyCode = 0x21; keyCode = 0x21;
break; break;
case SDLK_PAGEDOWN: case SDL_SCANCODE_PAGEDOWN:
keyCode = 0x22; keyCode = 0x22;
break; break;
case SDLK_END: case SDL_SCANCODE_END:
keyCode = 0x23; keyCode = 0x23;
break; break;
case SDLK_HOME: case SDL_SCANCODE_HOME:
keyCode = 0x24; keyCode = 0x24;
break; break;
case SDLK_LEFT: case SDL_SCANCODE_LEFT:
keyCode = 0x25; keyCode = 0x25;
break; break;
case SDLK_UP: case SDL_SCANCODE_UP:
keyCode = 0x26; keyCode = 0x26;
break; break;
case SDLK_RIGHT: case SDL_SCANCODE_RIGHT:
keyCode = 0x27; keyCode = 0x27;
break; break;
case SDLK_DOWN: case SDL_SCANCODE_DOWN:
keyCode = 0x28; keyCode = 0x28;
break; break;
case SDLK_SELECT: case SDL_SCANCODE_SELECT:
keyCode = 0x29; keyCode = 0x29;
break; break;
case SDLK_EXECUTE: case SDL_SCANCODE_EXECUTE:
keyCode = 0x2B; keyCode = 0x2B;
break; break;
case SDLK_PRINTSCREEN: case SDL_SCANCODE_PRINTSCREEN:
keyCode = 0x2C; keyCode = 0x2C;
break; break;
case SDLK_INSERT: case SDL_SCANCODE_INSERT:
keyCode = 0x2D; keyCode = 0x2D;
break; break;
case SDLK_DELETE: case SDL_SCANCODE_DELETE:
keyCode = 0x2E; keyCode = 0x2E;
break; break;
case SDLK_HELP: case SDL_SCANCODE_HELP:
keyCode = 0x2F; keyCode = 0x2F;
break; break;
case SDLK_KP_0: case SDL_SCANCODE_KP_0:
// See comment above about why we only handle KP_0 here // See comment above about why we only handle SDL_SCANCODE_KP_0 here
keyCode = 0x60; keyCode = VK_NUMPAD0;
break; break;
case SDLK_KP_MULTIPLY: case SDL_SCANCODE_0:
// See comment above about why we only handle SDL_SCANCODE_0 here
keyCode = VK_0;
break;
case SDL_SCANCODE_KP_MULTIPLY:
keyCode = 0x6A; keyCode = 0x6A;
break; break;
case SDLK_KP_PLUS: case SDL_SCANCODE_KP_PLUS:
keyCode = 0x6B; keyCode = 0x6B;
break; break;
case SDLK_KP_COMMA: case SDL_SCANCODE_KP_COMMA:
keyCode = 0x6C; keyCode = 0x6C;
break; break;
case SDLK_KP_MINUS: case SDL_SCANCODE_KP_MINUS:
keyCode = 0x6D; keyCode = 0x6D;
break; break;
case SDLK_KP_DECIMAL: case SDL_SCANCODE_KP_DECIMAL:
keyCode = 0x6E; keyCode = 0x6E;
break; break;
case SDLK_KP_DIVIDE: case SDL_SCANCODE_KP_DIVIDE:
keyCode = 0x6F; keyCode = 0x6F;
break; break;
case SDLK_NUMLOCKCLEAR: case SDL_SCANCODE_NUMLOCKCLEAR:
keyCode = 0x90; keyCode = 0x90;
break; break;
case SDLK_SCROLLLOCK: case SDL_SCANCODE_SCROLLLOCK:
keyCode = 0x91; keyCode = 0x91;
break; break;
case SDLK_LSHIFT: case SDL_SCANCODE_LSHIFT:
keyCode = 0xA0; keyCode = 0xA0;
break; break;
case SDLK_RSHIFT: case SDL_SCANCODE_RSHIFT:
keyCode = 0xA1; keyCode = 0xA1;
break; break;
case SDLK_LCTRL: case SDL_SCANCODE_LCTRL:
keyCode = 0xA2; keyCode = 0xA2;
break; break;
case SDLK_RCTRL: case SDL_SCANCODE_RCTRL:
keyCode = 0xA3; keyCode = 0xA3;
break; break;
case SDLK_LALT: case SDL_SCANCODE_LALT:
keyCode = 0xA4; keyCode = 0xA4;
break; break;
case SDLK_RALT: case SDL_SCANCODE_RALT:
keyCode = 0xA5; keyCode = 0xA5;
break; break;
case SDLK_AC_BACK: case SDL_SCANCODE_AC_BACK:
keyCode = 0xA6; keyCode = 0xA6;
break; break;
case SDLK_AC_FORWARD: case SDL_SCANCODE_AC_FORWARD:
keyCode = 0xA7; keyCode = 0xA7;
break; break;
case SDLK_AC_REFRESH: case SDL_SCANCODE_AC_REFRESH:
keyCode = 0xA8; keyCode = 0xA8;
break; break;
case SDLK_AC_STOP: case SDL_SCANCODE_AC_STOP:
keyCode = 0xA9; keyCode = 0xA9;
break; break;
case SDLK_AC_SEARCH: case SDL_SCANCODE_AC_SEARCH:
keyCode = 0xAA; keyCode = 0xAA;
break; break;
case SDLK_AC_BOOKMARKS: case SDL_SCANCODE_AC_BOOKMARKS:
keyCode = 0xAB; keyCode = 0xAB;
break; break;
case SDLK_AC_HOME: case SDL_SCANCODE_AC_HOME:
keyCode = 0xAC; keyCode = 0xAC;
break; break;
case SDLK_SEMICOLON: case SDL_SCANCODE_SEMICOLON:
keyCode = 0xBA; keyCode = 0xBA;
break; break;
case SDLK_PLUS: case SDL_SCANCODE_COMMA:
keyCode = 0xBB;
break;
case SDLK_COMMA:
keyCode = 0xBC; keyCode = 0xBC;
break; break;
case SDLK_MINUS: case SDL_SCANCODE_MINUS:
keyCode = 0xBD; keyCode = 0xBD;
break; break;
case SDLK_PERIOD: case SDL_SCANCODE_PERIOD:
keyCode = 0xBE; keyCode = 0xBE;
break; break;
case SDLK_SLASH: case SDL_SCANCODE_SLASH:
keyCode = 0xBF; keyCode = 0xBF;
break; break;
case SDLK_BACKQUOTE: case SDL_SCANCODE_GRAVE:
keyCode = 0xC0; keyCode = 0xC0;
break; break;
case SDLK_LEFTBRACKET: case SDL_SCANCODE_LEFTBRACKET:
keyCode = 0xDB; keyCode = 0xDB;
break; break;
case SDLK_BACKSLASH: case SDL_SCANCODE_BACKSLASH:
keyCode = 0xDC; keyCode = 0xDC;
break; break;
case SDLK_RIGHTBRACKET: case SDL_SCANCODE_RIGHTBRACKET:
keyCode = 0xDD; keyCode = 0xDD;
break; break;
case SDLK_QUOTE: case SDL_SCANCODE_APOSTROPHE:
keyCode = 0xDE; keyCode = 0xDE;
break; break;
default: default:
SDL_LogInfo(SDL_LOG_CATEGORY_APPLICATION, SDL_LogInfo(SDL_LOG_CATEGORY_APPLICATION,
"Unhandled button event: %d", "Unhandled button event: %d",
event->keysym.sym); event->keysym.scancode);
return; return;
} }
} }