Browse Source

Sdl2Application: fix modifiers everywhere, not only for key press.

pull/7/head
Vladimír Vondruš 14 years ago
parent
commit
985b28cf07
  1. 37
      src/Platform/Sdl2Application.cpp

37
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<Sdl2Application::InputEvent::Modifier>(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<GLsizei>& 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<InputEvent::Modifier>(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<KeyEvent::Key>(event.key.keysym.sym), modifiers);
KeyEvent e(static_cast<KeyEvent::Key>(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<Modifier>(SDL_GetModState());
return _modifiers = fixedModifiers(SDL_GetModState());
}
Sdl2Application::InputEvent::Modifiers Sdl2Application::MouseMoveEvent::modifiers() {
if(modifiersLoaded) return _modifiers;
modifiersLoaded = true;
return _modifiers = static_cast<Modifier>(SDL_GetModState());
return _modifiers = fixedModifiers(SDL_GetModState());
}
}}

Loading…
Cancel
Save