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