From 7e635a031c96e2e76d06b8c5fbd14c8957751d33 Mon Sep 17 00:00:00 2001 From: Benjamin Kyd Date: Wed, 18 May 2022 00:48:00 +0100 Subject: [PATCH] solve keymod problem --- Aeon/Core/Events.hpp | 6 ++- Aeon/Input/Input.cpp | 9 ++++- Aeon/Input/InputMap.hpp | 85 ++++++++++++----------------------------- Game/ExampleGame.cpp | 3 +- 4 files changed, 38 insertions(+), 65 deletions(-) diff --git a/Aeon/Core/Events.hpp b/Aeon/Core/Events.hpp index d533749..a222172 100644 --- a/Aeon/Core/Events.hpp +++ b/Aeon/Core/Events.hpp @@ -52,7 +52,7 @@ namespace Aeon::Core { * MOUSE_SCROLL - y+- * MOUSE_MOVE - move to x, y relative dx, dy * ENGINE_INPUT_KEYBOARD -* KEYBOARD_KEYDOWN - keycode +* KEYBOARD_KEYDOWN - keycode * KEYBOARD_KEYUP - keycode * KEYBOARD_KEYPRESS - keycode for continual pressing */ @@ -60,18 +60,22 @@ namespace Aeon::Core { struct GenericEvent { + // always populated std::string System; std::string Type; // the rest can be empty // user defined std::string Data; + // DISPLAY_RESIZE DISPLAY_MOVE MOUSE_MOVE int x, y; // MOUSE_MOVE int dx, dy; + // KEYBOARD_KEYDOWN KEYBOARD_KEYUP KEYBOARD_PRESSED Aeon::Input::EKeyCode keyCode; + uint16_t keyMods; bool Handled = false; }; diff --git a/Aeon/Input/Input.cpp b/Aeon/Input/Input.cpp index 4dda125..d0725a9 100644 --- a/Aeon/Input/Input.cpp +++ b/Aeon/Input/Input.cpp @@ -3,6 +3,8 @@ #include #include #include +#include +#include #include "Aeon/Core/Events.hpp" #include "Aeon/Input/InputMap.hpp" @@ -217,7 +219,7 @@ void Input::mPollKeyboard() { EKeyCode keycode = KeyCodeFromSDL( mEvent.key.keysym.sym ); Aeon::Core::GenericEvent e; - e.keyCode = keycode; + e.keyCode = KeyCodeFromSDL(keycode); if ( mEvent.key.state == SDL_PRESSED ) { e.Type = "KEYBOARD_KEYDOWN"; @@ -226,7 +228,10 @@ void Input::mPollKeyboard() { e.Type = "KEYBOARD_KEYUP"; } - std::cout << e.keyCode << " " << mEvent.key.keysym.sym << std::endl; + + uint16_t mods = mEvent.key.keysym.mod; + e.keyMods = mods; + mKeyboardEventDispatcher.Dispatch( e ); } diff --git a/Aeon/Input/InputMap.hpp b/Aeon/Input/InputMap.hpp index 77f7813..8f695bd 100644 --- a/Aeon/Input/InputMap.hpp +++ b/Aeon/Input/InputMap.hpp @@ -6,6 +6,22 @@ namespace Aeon::Input { +enum EModCode { + LCTRL = 0x40, + RCTRL = 0x80, + LSHIFT = 0x1, + RSHIFT = 0x2, + LALT = 0x100, + RALT = 0x200, + LGUI = 0x400, + RGUI = 0x800, + + CTRL = LCTRL | RCTRL, + SHIFT = LSHIFT | RSHIFT, + ALT = LALT | RALT, + GUI = LGUI | RGUI +}; + enum EKeyCode { Unknown = 0, @@ -153,19 +169,14 @@ enum EKeyCode KeyPad_Space = SDL_SCANCODE_TO_KEYCODE( SDL_SCANCODE_KP_SPACE ), KeyPad_At = SDL_SCANCODE_TO_KEYCODE( SDL_SCANCODE_KP_AT ), - LCTRL = SDL_SCANCODE_TO_KEYCODE( SDL_SCANCODE_LCTRL ), - RCTRL = SDL_SCANCODE_TO_KEYCODE( SDL_SCANCODE_RCTRL ), - LSHIFT = SDL_SCANCODE_TO_KEYCODE( SDL_SCANCODE_LSHIFT ), - RSHIFT = SDL_SCANCODE_TO_KEYCODE( SDL_SCANCODE_RSHIFT ), - LALT = SDL_SCANCODE_TO_KEYCODE( SDL_SCANCODE_LALT ), - RALT = SDL_SCANCODE_TO_KEYCODE( SDL_SCANCODE_RALT ), - LGUI = SDL_SCANCODE_TO_KEYCODE( SDL_SCANCODE_LGUI ), - RGUI = SDL_SCANCODE_TO_KEYCODE( SDL_SCANCODE_RGUI ), - - CTRL = LCTRL | RCTRL, - SHIFT = LSHIFT | RSHIFT, - ALT = LALT | RALT, - GUI = LGUI | RGUI + LeftCTRL = SDL_SCANCODE_TO_KEYCODE( SDL_SCANCODE_LCTRL ), + RightCTRL = SDL_SCANCODE_TO_KEYCODE( SDL_SCANCODE_RCTRL ), + LeftSHIFT = SDL_SCANCODE_TO_KEYCODE( SDL_SCANCODE_LSHIFT ), + RightSHIFT = SDL_SCANCODE_TO_KEYCODE( SDL_SCANCODE_RSHIFT ), + LeftALT = SDL_SCANCODE_TO_KEYCODE( SDL_SCANCODE_LALT ), + RightALT = SDL_SCANCODE_TO_KEYCODE( SDL_SCANCODE_RALT ), + LeftGUI = SDL_SCANCODE_TO_KEYCODE( SDL_SCANCODE_LGUI ), + RightGUI = SDL_SCANCODE_TO_KEYCODE( SDL_SCANCODE_RGUI ), }; inline EKeyCode KeyCodeFromSDL( SDL_Keycode key ) @@ -178,54 +189,6 @@ inline EKeyCode KeyCodeFromScanCode( SDL_Scancode key ) return KeyCodeFromSDL( SDL_GetKeyFromScancode( key ) ); } -inline EKeyCode KeyCodeFromKeymod( SDL_Keymod key ) -{ - switch ( key ) - { - case KMOD_NONE: - return EKeyCode::Unknown; - break; - case KMOD_LSHIFT: - return EKeyCode::LSHIFT; - break; - case KMOD_RSHIFT: - return EKeyCode::RSHIFT; - break; - case KMOD_LCTRL: - return EKeyCode::LCTRL; - break; - case KMOD_RCTRL: - return EKeyCode::RCTRL; - break; - case KMOD_LALT: - return EKeyCode::LALT; - break; - case KMOD_RALT: - return EKeyCode::RALT; - break; - case KMOD_LGUI: - return EKeyCode::LGUI; - break; - case KMOD_RGUI: - return EKeyCode::RGUI; - break; - case KMOD_CTRL: - return EKeyCode::CTRL; - break; - case KMOD_SHIFT: - return EKeyCode::SHIFT; - break; - case KMOD_ALT: - return EKeyCode::ALT; - break; - case KMOD_GUI: - return EKeyCode::GUI; - break; - default: - return EKeyCode::Unknown; - } -} - } #endif diff --git a/Game/ExampleGame.cpp b/Game/ExampleGame.cpp index b872e06..c64ebaf 100644 --- a/Game/ExampleGame.cpp +++ b/Game/ExampleGame.cpp @@ -35,7 +35,8 @@ public: bool EventRecieved( Aeon::Core::GenericEvent& e ) override { - std::cout << "FROM LEVEL " << e.System << " " << (char)e.keyCode << std::endl; + std::cout << "FROM LEVEL " << e.Type << " " << (char)e.keyCode << std::endl; + return false; }