From 985b28cf07f7bbb3addad17ac4408f8e0f8d986f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Wed, 21 Nov 2012 19:15:20 +0100 Subject: [PATCH] Sdl2Application: fix modifiers everywhere, not only for key press. --- src/Platform/Sdl2Application.cpp | 37 ++++++++++++++++++-------------- 1 file changed, 21 insertions(+), 16 deletions(-) diff --git a/src/Platform/Sdl2Application.cpp b/src/Platform/Sdl2Application.cpp index 59c2080f6..6e81c4ab1 100644 --- a/src/Platform/Sdl2Application.cpp +++ b/src/Platform/Sdl2Application.cpp @@ -20,6 +20,24 @@ namespace Magnum { namespace Platform { +namespace { + +/* + * Fix up the modifiers -- we want >= operator to work properly on Shift, + * Ctrl, Alt, but SDL generates different event for left / right keys, thus + * (modifiers >= Shift) would pass only if both left and right were pressed, + * which is usually not what the developers wants. + */ +Sdl2Application::InputEvent::Modifiers fixedModifiers(Uint16 mod) { + Sdl2Application::InputEvent::Modifiers modifiers(static_cast(mod)); + if(modifiers & Sdl2Application::InputEvent::Modifier::Shift) modifiers |= Sdl2Application::InputEvent::Modifier::Shift; + if(modifiers & Sdl2Application::InputEvent::Modifier::Ctrl) modifiers |= Sdl2Application::InputEvent::Modifier::Ctrl; + if(modifiers & Sdl2Application::InputEvent::Modifier::Alt) modifiers |= Sdl2Application::InputEvent::Modifier::Alt; + return modifiers; +} + +} + Sdl2Application::Sdl2Application(int, char**, const std::string& name, const Math::Vector2& size): _redraw(true) { if(SDL_Init(SDL_INIT_VIDEO) < 0) { Error() << "Cannot initialize SDL."; @@ -85,20 +103,7 @@ int Sdl2Application::exec() { case SDL_KEYDOWN: case SDL_KEYUP: { - /* - * Fix up the modifiers -- we want >= operator to work - * properly on Shift, Ctrl, Alt, but SDL generates - * different event for left / right keys, thus - * (modifiers >= Shift) would pass only if both left and - * right were pressed, which is usually not what the - * developers wants. - */ - InputEvent::Modifiers modifiers(static_cast(event.key.keysym.mod)); - if(modifiers & InputEvent::Modifier::Shift) modifiers |= InputEvent::Modifier::Shift; - if(modifiers & InputEvent::Modifier::Ctrl) modifiers |= InputEvent::Modifier::Ctrl; - if(modifiers & InputEvent::Modifier::Alt) modifiers |= InputEvent::Modifier::Alt; - - KeyEvent e(static_cast(event.key.keysym.sym), modifiers); + KeyEvent e(static_cast(event.key.keysym.sym), fixedModifiers(event.key.keysym.mod)); event.type == SDL_KEYDOWN ? keyPressEvent(e) : keyReleaseEvent(e); break; } @@ -143,13 +148,13 @@ void Sdl2Application::setMouseLocked(bool enabled) { Sdl2Application::InputEvent::Modifiers Sdl2Application::MouseEvent::modifiers() { if(modifiersLoaded) return _modifiers; modifiersLoaded = true; - return _modifiers = static_cast(SDL_GetModState()); + return _modifiers = fixedModifiers(SDL_GetModState()); } Sdl2Application::InputEvent::Modifiers Sdl2Application::MouseMoveEvent::modifiers() { if(modifiersLoaded) return _modifiers; modifiersLoaded = true; - return _modifiers = static_cast(SDL_GetModState()); + return _modifiers = fixedModifiers(SDL_GetModState()); } }}