From 89a868ba29f276ab3e10767a7527bb7ef9ac64d8 Mon Sep 17 00:00:00 2001 From: Dario Manesku Date: Fri, 15 Apr 2016 01:02:59 +0200 Subject: [PATCH] Capture SDL modifier keys even if no other keys are pressed. --- examples/common/entry/entry_sdl.cpp | 28 +++++++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/examples/common/entry/entry_sdl.cpp b/examples/common/entry/entry_sdl.cpp index 07193b83c..1b8aeb7cf 100644 --- a/examples/common/entry/entry_sdl.cpp +++ b/examples/common/entry/entry_sdl.cpp @@ -49,6 +49,25 @@ namespace entry return modifiers; } + static uint8_t translateKeyModifierPress(uint16_t _key) + { + uint8_t modifier; + switch (_key) + { + case SDL_SCANCODE_LALT: { modifier = Modifier::LeftAlt; } break; + case SDL_SCANCODE_RALT: { modifier = Modifier::RightAlt; } break; + case SDL_SCANCODE_LCTRL: { modifier = Modifier::LeftCtrl; } break; + case SDL_SCANCODE_RCTRL: { modifier = Modifier::RightCtrl; } break; + case SDL_SCANCODE_LSHIFT: { modifier = Modifier::LeftShift; } break; + case SDL_SCANCODE_RSHIFT: { modifier = Modifier::RightShift; } break; + case SDL_SCANCODE_LGUI: { modifier = Modifier::LeftMeta; } break; + case SDL_SCANCODE_RGUI: { modifier = Modifier::RightMeta; } break; + default: { modifier = 0; } break; + } + + return modifier; + } + static uint8_t s_translateKey[256]; static void initTranslateKey(uint16_t _sdl, Key::Enum _key) @@ -532,6 +551,13 @@ namespace entry uint8_t modifiers = translateKeyModifiers(kev.keysym.mod); Key::Enum key = translateKey(kev.keysym.scancode); + /// If you only press (e.g.) 'shift' and nothing else, then key == 'shift', modifier == 0. + /// Further along, pressing 'shift' + 'ctrl' would be: key == 'shift', modifier == 'ctrl. + if (0 == key && 0 == modifiers) + { + modifiers = translateKeyModifierPress(kev.keysym.scancode); + } + // TODO: These keys are not captured by SDL_TEXTINPUT. Should be probably handled by SDL_TEXTEDITING. This is a workaround for now. if (key == 1) // Escape { @@ -553,7 +579,7 @@ namespace entry } else { - m_eventQueue.postKeyEvent(handle, key, modifiers, kev.state == SDL_PRESSED); + m_eventQueue.postKeyEvent(handle, key, modifiers, kev.state == SDL_PRESSED); } } }