From aa797abc619c827e67355fb5060f1841ebacadaa Mon Sep 17 00:00:00 2001 From: Don Honerbrink Date: Fri, 20 Mar 2015 23:38:34 -0500 Subject: [PATCH] Fixed keyboard (win/linux) and input focus (linux) bugs when returning from launching. --- RetroFE/Source/Control/UserInput.cpp | 45 ++++++++++++++++++++++++++++ RetroFE/Source/Control/UserInput.h | 11 ++++++- RetroFE/Source/RetroFE.cpp | 42 +++++++++++++------------- RetroFE/Source/SDL.cpp | 4 +++ 4 files changed, 81 insertions(+), 21 deletions(-) diff --git a/RetroFE/Source/Control/UserInput.cpp b/RetroFE/Source/Control/UserInput.cpp index 79c11af..a260282 100644 --- a/RetroFE/Source/Control/UserInput.cpp +++ b/RetroFE/Source/Control/UserInput.cpp @@ -74,6 +74,29 @@ SDL_Scancode UserInput::GetScancode(KeyCode_E key) } +UserInput::KeyCode_E UserInput::GetKeycode(SDL_Scancode scancode) +{ + KeyCode_E keycode = KeyCodeNull; + + std::map::iterator it = ReverseKeyMap.find(scancode); + + if(it != ReverseKeyMap.end()) + { + keycode = it->second; + } + + return keycode; +} + +void UserInput::ResetKeyStates() +{ + for(std::map::iterator it = KeyState.begin(); it != KeyState.end(); it++) + { + it->second = false; + } +} + + bool UserInput::MapKey(std::string keyDescription, KeyCode_E key) { SDL_Scancode scanCode; @@ -96,6 +119,28 @@ bool UserInput::MapKey(std::string keyDescription, KeyCode_E key) } KeyMap[key] = scanCode; + ReverseKeyMap[scanCode] = key; + KeyState[key] = false; return true; } +bool UserInput::SetKeyState(SDL_Scancode code, bool state) +{ + KeyCode_E key = GetKeycode(code); + + if(key == KeyCodeNull) + { + return false; + } + + KeyState[key] = state; + return true; + +} +bool UserInput::GetKeyState(KeyCode_E key) +{ + return KeyState[key]; +} + + + diff --git a/RetroFE/Source/Control/UserInput.h b/RetroFE/Source/Control/UserInput.h index 07c4cf5..db013db 100644 --- a/RetroFE/Source/Control/UserInput.h +++ b/RetroFE/Source/Control/UserInput.h @@ -25,6 +25,7 @@ class UserInput public: enum KeyCode_E { + KeyCodeNull, KeyCodeUp, KeyCodeDown, KeyCodeLeft, @@ -42,11 +43,19 @@ public: virtual ~UserInput(); bool Initialize(); SDL_Scancode GetScancode(KeyCode_E key); + KeyCode_E GetKeycode(SDL_Scancode scancode); + bool SetKeyState(SDL_Scancode code, bool state); + bool GetKeyState(KeyCode_E key); + bool KeyStateChanged(); + void ResetKeyStates(); + private: bool MapKey(std::string keyDescription, KeyCode_E key); std::map KeyMap; - + std::map ReverseKeyMap; + std::map KeyState; Configuration &Config; + const Uint8 *SDLKeys; }; diff --git a/RetroFE/Source/RetroFE.cpp b/RetroFE/Source/RetroFE.cpp index cf12bbb..bdd898e 100644 --- a/RetroFE/Source/RetroFE.cpp +++ b/RetroFE/Source/RetroFE.cpp @@ -120,8 +120,10 @@ void RetroFE::LaunchEnter() void RetroFE::LaunchExit() { SDL_RestoreWindow(SDL::GetWindow()); + SDL_RaiseWindow(SDL::GetWindow()); SDL_SetWindowGrab(SDL::GetWindow(), SDL_TRUE); - + Input.ResetKeyStates(); + Attract.Reset(); if(CurrentPage) { CurrentPage->LaunchExit(); @@ -386,50 +388,50 @@ RetroFE::RETROFE_STATE RetroFE::ProcessUserInput(Page *page) SDL_Event e; bool exit = false; RETROFE_STATE state = RETROFE_IDLE; - if (SDL_PollEvent(&e) == 0) return state; if(e.type == SDL_KEYDOWN || e.type == SDL_KEYUP) { - const Uint8 *keys = SDL_GetKeyboardState(NULL); + SDL_Scancode scancode = SDL_GetScancodeFromKey(e.key.keysym.sym); + Input.SetKeyState(scancode, (e.type == SDL_KEYDOWN) ? true : false); Attract.Reset(); - if(page->IsHorizontalScroll()) + if(page->IsHorizontalScroll()) { - if (keys[Input.GetScancode(UserInput::KeyCodeLeft)]) + if (Input.GetKeyState(UserInput::KeyCodeLeft)) { page->SetScrolling(Page::ScrollDirectionBack); } - if (keys[Input.GetScancode(UserInput::KeyCodeRight)]) + if (Input.GetKeyState(UserInput::KeyCodeRight)) { page->SetScrolling(Page::ScrollDirectionForward); } } else { - if (keys[Input.GetScancode(UserInput::KeyCodeUp)]) + if (Input.GetKeyState(UserInput::KeyCodeUp)) { page->SetScrolling(Page::ScrollDirectionBack); } - if (keys[Input.GetScancode(UserInput::KeyCodeDown)]) + if (Input.GetKeyState(UserInput::KeyCodeDown)) { page->SetScrolling(Page::ScrollDirectionForward); } } - if (keys[Input.GetScancode(UserInput::KeyCodePageUp)]) + if (Input.GetKeyState(UserInput::KeyCodePageUp)) { page->PageScroll(Page::ScrollDirectionBack); } - if (keys[Input.GetScancode(UserInput::KeyCodePageDown)]) + if (Input.GetKeyState(UserInput::KeyCodePageDown)) { page->PageScroll(Page::ScrollDirectionForward); } - if (keys[Input.GetScancode(UserInput::KeyCodeAdminMode)]) + if (Input.GetKeyState(UserInput::KeyCodeAdminMode)) { //todo: add admin mode support } - if (keys[Input.GetScancode(UserInput::KeyCodeSelect)] && page->IsMenuIdle()) + if (Input.GetKeyState(UserInput::KeyCodeSelect) && page->IsMenuIdle()) { NextPageItem = page->GetSelectedItem(); @@ -453,7 +455,7 @@ RetroFE::RETROFE_STATE RetroFE::ProcessUserInput(Page *page) } } - if (keys[Input.GetScancode(UserInput::KeyCodeBack)] && page->IsMenuIdle()) + if (Input.GetKeyState(UserInput::KeyCodeBack) && page->IsMenuIdle()) { if(Back(exit) || exit) { @@ -461,17 +463,17 @@ RetroFE::RETROFE_STATE RetroFE::ProcessUserInput(Page *page) } } - if (keys[Input.GetScancode(UserInput::KeyCodeQuit)]) + if (Input.GetKeyState(UserInput::KeyCodeQuit)) { state = RETROFE_QUIT_REQUEST; } - if(!keys[Input.GetScancode(UserInput::KeyCodeUp)] && - !keys[Input.GetScancode(UserInput::KeyCodeLeft)] && - !keys[Input.GetScancode(UserInput::KeyCodeDown)] && - !keys[Input.GetScancode(UserInput::KeyCodeRight)] && - !keys[Input.GetScancode(UserInput::KeyCodePageUp)] && - !keys[Input.GetScancode(UserInput::KeyCodePageDown)]) + if(!Input.GetKeyState(UserInput::KeyCodeUp) && + !Input.GetKeyState(UserInput::KeyCodeLeft) && + !Input.GetKeyState(UserInput::KeyCodeDown) && + !Input.GetKeyState(UserInput::KeyCodeRight) && + !Input.GetKeyState(UserInput::KeyCodePageUp) && + !Input.GetKeyState(UserInput::KeyCodePageDown)) { page->SetScrolling(Page::ScrollDirectionIdle); } diff --git a/RetroFE/Source/SDL.cpp b/RetroFE/Source/SDL.cpp index 24ecebf..305bfa9 100644 --- a/RetroFE/Source/SDL.cpp +++ b/RetroFE/Source/SDL.cpp @@ -135,7 +135,11 @@ bool SDL::Initialize(Configuration &config) if (retVal && Fullscreen) { +#ifdef WIN32 windowFlags |= SDL_WINDOW_FULLSCREEN_DESKTOP; +#else + windowFlags |= SDL_WINDOW_FULLSCREEN; +#endif } if(retVal)