diff options
author | Martin Kiewitz | 2016-07-03 19:08:24 +0200 |
---|---|---|
committer | Martin Kiewitz | 2016-07-03 19:08:24 +0200 |
commit | 9aa7174218983bb1cf6fd98325082ca7d37f50fb (patch) | |
tree | e4ee4663eae6973804d304146dacff58fcd28125 | |
parent | 02acf2e6ee8b3dca41090433ab811655e41fd8b6 (diff) | |
download | scummvm-rg350-9aa7174218983bb1cf6fd98325082ca7d37f50fb.tar.gz scummvm-rg350-9aa7174218983bb1cf6fd98325082ca7d37f50fb.tar.bz2 scummvm-rg350-9aa7174218983bb1cf6fd98325082ca7d37f50fb.zip |
SDL: Fix keyboard on macOS, when using SDL2, fix directional keypad
This will hopefully fully fix keyboard issues for macOS / SDL2,
for example when pressing "alt-x".
Also reset .ascii to 0, when Num-Lock is NOT enabled and keypad
directional keys are pressed. This was fixed inside AGI+SCI
previously.
The latter shouldn't cause issues, but in case it does, the
affected engine should get fixed and use keycodes instead.
-rw-r--r-- | backends/events/sdl/sdl-events.cpp | 22 |
1 files changed, 21 insertions, 1 deletions
diff --git a/backends/events/sdl/sdl-events.cpp b/backends/events/sdl/sdl-events.cpp index 00e2f25cbc..d65fc7cccd 100644 --- a/backends/events/sdl/sdl-events.cpp +++ b/backends/events/sdl/sdl-events.cpp @@ -109,14 +109,34 @@ SdlEventSource::~SdlEventSource() { int SdlEventSource::mapKey(SDLKey sdlKey, SDLMod mod, Uint16 unicode) { Common::KeyCode key = SDLToOSystemKeycode(sdlKey); + + // Attention: + // When using SDL1.x, we will get scancodes via sdlKey, that are raw scancodes, so NOT adjusted to keyboard layout/ + // mapping. So for example for certain locales, we will get KEYCODE_y, when 'z' is pressed and so on. + // When using SDL2.x however, we will get scancodes based on the keyboard layout. if (key >= Common::KEYCODE_F1 && key <= Common::KEYCODE_F9) { return key - Common::KEYCODE_F1 + Common::ASCII_F1; } else if (key >= Common::KEYCODE_KP0 && key <= Common::KEYCODE_KP9) { + if ((mod & KMOD_NUM) == 0) + return 0; // In case Num-Lock is NOT enabled, return 0 for ascii, so that directional keys on numpad work return key - Common::KEYCODE_KP0 + '0'; } else if (key >= Common::KEYCODE_UP && key <= Common::KEYCODE_PAGEDOWN) { return key; - } else if (unicode) { + } else if ((unicode >= 0x20) && ((unicode <= 0x7E) || (key == Common::KEYCODE_INVALID))) { + // Return unicode in case it's regular ASCII text or in case we didn't get a valid keycode + // + // We need to use unicode in those cases, simply because SDL1.x passes us non-layout-adjusted keycodes. + // So unicode is the only way to get layout-adjusted keys. + // + // We need to restrict unicode to only up to 0x7E, because on macOS the option/alt key will switch to + // an alternate keyboard, which will cause us to receive Unicode characters for some keys, which are outside + // of the ASCII range (e.g. alt-x will get us U+2248). We need to return 'x' for alt-x, so using unicode + // in that case would break alt-shortcuts. + // The latter check for KEYCODE_INVALID is needed for special characters like umlauts, otherwise + // we wouldn't pass such characters anymore. + // + // TODO: Maybe never return unicode in case it's > 255? Does any engine need such? return unicode; } else if (key >= 'a' && key <= 'z' && (mod & KMOD_SHIFT)) { return key & ~0x20; |