diff options
Diffstat (limited to 'src/gui/sdlinput.h')
-rw-r--r-- | src/gui/sdlinput.h | 224 |
1 files changed, 223 insertions, 1 deletions
diff --git a/src/gui/sdlinput.h b/src/gui/sdlinput.h index 3d865389e..b5454b7f7 100644 --- a/src/gui/sdlinput.h +++ b/src/gui/sdlinput.h @@ -78,6 +78,8 @@ #ifndef GUI_SDLINPUT_H #define GUI_SDLINPUT_H +#include "enums/input/keyvalue.h" + #include "input/keyinput.h" #include <SDL_events.h> @@ -139,7 +141,227 @@ class SDLInput final * @return a key value. * @see Key */ - static int convertKeyCharacter(const SDL_Event &event) A_WARN_UNUSED; + constexpr2 static int convertKeyCharacter(const SDL_Event &event) + A_WARN_UNUSED + { + const SDL_keysym keysym = event.key.keysym; +#ifdef USE_SDL2 + int value = keysym.scancode; +#else // USE_SDL2 + + int value = keysym.unicode; +#endif // USE_SDL2 + + PRAGMA45(GCC diagnostic push) + PRAGMA45(GCC diagnostic ignored "-Wswitch-enum") + switch (keysym.sym) + { + case SDLK_TAB: + value = KeyValue::TAB; + break; + case SDLK_LALT: + value = KeyValue::LEFT_ALT; + break; + case SDLK_RALT: + value = KeyValue::RIGHT_ALT; + break; + case SDLK_LSHIFT: + value = KeyValue::LEFT_SHIFT; + break; + case SDLK_RSHIFT: + value = KeyValue::RIGHT_SHIFT; + break; + case SDLK_LCTRL: + value = KeyValue::LEFT_CONTROL; + break; + case SDLK_RCTRL: + value = KeyValue::RIGHT_CONTROL; + break; + case SDLK_BACKSPACE: + value = KeyValue::BACKSPACE; + break; + case SDLK_PAUSE: + value = KeyValue::PAUSE; + break; + case SDLK_SPACE: + // Special characters like ~ (tilde) ends up + // with the keysym.sym SDLK_SPACE which + // without this check would be lost. The check + // is only valid on key down events in SDL. +#ifndef USE_SDL2 + if (event.type == SDL_KEYUP || + keysym.unicode == ' ') +#endif // USE_SDL2 + { + value = KeyValue::SPACE; + } + break; + case SDLK_ESCAPE: +#ifdef USE_SDL2 + case SDLK_AC_BACK: +#endif // USE_SDL2 + value = KeyValue::ESCAPE; + break; + case SDLK_DELETE: + value = KeyValue::DELETE_; + break; + case SDLK_INSERT: + value = KeyValue::INSERT; + break; + case SDLK_HOME: + value = KeyValue::HOME; + break; + case SDLK_END: + value = KeyValue::END; + break; + case SDLK_PAGEUP: + value = KeyValue::PAGE_UP; + break; + case SDLK_PRINT: + value = KeyValue::PRINT_SCREEN; + break; + case SDLK_PAGEDOWN: + value = KeyValue::PAGE_DOWN; + break; + case SDLK_F1: + value = KeyValue::F1; + break; + case SDLK_F2: + value = KeyValue::F2; + break; + case SDLK_F3: + value = KeyValue::F3; + break; + case SDLK_F4: + value = KeyValue::F4; + break; + case SDLK_F5: + value = KeyValue::F5; + break; + case SDLK_F6: + value = KeyValue::F6; + break; + case SDLK_F7: + value = KeyValue::F7; + break; + case SDLK_F8: + value = KeyValue::F8; + break; + case SDLK_F9: + value = KeyValue::F9; + break; + case SDLK_F10: + value = KeyValue::F10; + break; + case SDLK_F11: + value = KeyValue::F11; + break; + case SDLK_F12: + value = KeyValue::F12; + break; + case SDLK_F13: + value = KeyValue::F13; + break; + case SDLK_F14: + value = KeyValue::F14; + break; + case SDLK_F15: + value = KeyValue::F15; + break; + case SDLK_NUMLOCK: + value = KeyValue::NUM_LOCK; + break; + case SDLK_CAPSLOCK: + value = KeyValue::CAPS_LOCK; + break; + case SDLK_SCROLLOCK: + value = KeyValue::SCROLL_LOCK; + break; + case SDLK_RMETA: + value = KeyValue::RIGHT_META; + break; + case SDLK_LMETA: + value = KeyValue::LEFT_META; + break; +#ifndef USE_SDL2 + case SDLK_LSUPER: + value = KeyValue::LEFT_SUPER; + break; + case SDLK_RSUPER: + value = KeyValue::RIGHT_SUPER; + break; +#endif // USE_SDL2 + + case SDLK_MODE: + value = KeyValue::ALT_GR; + break; + case SDLK_UP: + value = KeyValue::UP; + break; + case SDLK_DOWN: + value = KeyValue::DOWN; + break; + case SDLK_LEFT: + value = KeyValue::LEFT; + break; + case SDLK_RIGHT: + value = KeyValue::RIGHT; + break; + case SDLK_RETURN: + value = KeyValue::ENTER; + break; + case SDLK_KP_ENTER: + value = KeyValue::ENTER; + break; + + default: + break; + } + PRAGMA45(GCC diagnostic pop) + + if (!(CAST_U32(keysym.mod) & KMOD_NUM)) + { + PRAGMA45(GCC diagnostic push) + PRAGMA45(GCC diagnostic ignored "-Wswitch-enum") + switch (keysym.sym) + { + case SDLK_KP0: + value = KeyValue::INSERT; + break; + case SDLK_KP1: + value = KeyValue::END; + break; + case SDLK_KP2: + value = KeyValue::DOWN; + break; + case SDLK_KP3: + value = KeyValue::PAGE_DOWN; + break; + case SDLK_KP4: + value = KeyValue::LEFT; + break; + case SDLK_KP5: + value = 0; + break; + case SDLK_KP6: + value = KeyValue::RIGHT; + break; + case SDLK_KP7: + value = KeyValue::HOME; + break; + case SDLK_KP8: + value = KeyValue::UP; + break; + case SDLK_KP9: + value = KeyValue::PAGE_UP; + break; + default: + break; + } + PRAGMA45(GCC diagnostic pop) + } + return value; + } static void convertKeyEventToKey(const SDL_Event &event, KeyInput &keyInput); |