From ec7e160bdcf5b93aced2849473cbd9f22bdfe6a0 Mon Sep 17 00:00:00 2001 From: Glenn Rice Date: Sun, 6 Mar 2011 04:31:43 +0000 Subject: [PATCH] Fix Host_GetKeyState in a more effective way. git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@7308 8ced0084-cf51-0410-be5f-012b33b47a6e --- Source/Core/DolphinWX/Src/Frame.cpp | 8 -------- Source/Core/DolphinWX/Src/Frame.h | 3 +-- Source/Core/DolphinWX/Src/FrameTools.cpp | 10 +++++----- Source/Core/DolphinWX/Src/Main.cpp | 14 +++++++++----- 4 files changed, 15 insertions(+), 20 deletions(-) diff --git a/Source/Core/DolphinWX/Src/Frame.cpp b/Source/Core/DolphinWX/Src/Frame.cpp index ebfcc5e196..3278f7df0d 100644 --- a/Source/Core/DolphinWX/Src/Frame.cpp +++ b/Source/Core/DolphinWX/Src/Frame.cpp @@ -353,10 +353,6 @@ CFrame::CFrame(wxFrame* parent, for (int i = 0; i <= IDM_CODEWINDOW - IDM_LOGWINDOW; i++) bFloatWindow[i] = false; -#ifdef __WXGTK__ - bKeyStateResult = false; -#endif - if (ShowLogWindow) SConfig::GetInstance().m_InterfaceLogWindow = true; // Give it a console early to show potential messages from this onward @@ -663,10 +659,6 @@ void CFrame::OnHostMessage(wxCommandEvent& event) _("Warning"), event.GetInt() ? wxYES_NO : wxOK, wxGetActiveWindow())); panic_event.Set(); break; - case IDM_KEYSTATE: - bKeyStateResult = wxGetKeyState(wxKeyCode(event.GetInt())); - keystate_event.Set(); - break; #endif case WM_USER_STOP: diff --git a/Source/Core/DolphinWX/Src/Frame.h b/Source/Core/DolphinWX/Src/Frame.h index 4a04aadd87..4feeaf4b76 100644 --- a/Source/Core/DolphinWX/Src/Frame.h +++ b/Source/Core/DolphinWX/Src/Frame.h @@ -145,8 +145,7 @@ class CFrame : public CRenderFrame #ifdef __WXGTK__ Common::Event panic_event; bool bPanicResult; - Common::Event keystate_event; - bool bKeyStateResult; + std::mutex keystate_lock; #endif #if defined(HAVE_XRANDR) && HAVE_XRANDR diff --git a/Source/Core/DolphinWX/Src/FrameTools.cpp b/Source/Core/DolphinWX/Src/FrameTools.cpp index 408325ed23..7441fc4c62 100644 --- a/Source/Core/DolphinWX/Src/FrameTools.cpp +++ b/Source/Core/DolphinWX/Src/FrameTools.cpp @@ -1021,6 +1021,11 @@ void CFrame::DoStop() { if (Core::GetState() != Core::CORE_UNINITIALIZED) { +#if defined __WXGTK__ + wxMutexGuiLeave(); + std::lock_guard lk(keystate_lock); + wxMutexGuiEnter(); +#endif // Ask for confirmation in case the user accidentally clicked Stop / Escape if (SConfig::GetInstance().m_LocalCoreStartupParameter.bConfirmStop) { @@ -1043,11 +1048,6 @@ void CFrame::DoStop() if(Frame::IsPlayingInput() || Frame::IsRecordingInput()) Frame::EndPlayInput(false); -#ifdef __WXGTK__ - // Make sure the app doesn't hang waiting on a keystate check - keystate_event.Set(); -#endif - BootManager::Stop(); #if defined(HAVE_XDG_SCREENSAVER) && HAVE_XDG_SCREENSAVER diff --git a/Source/Core/DolphinWX/Src/Main.cpp b/Source/Core/DolphinWX/Src/Main.cpp index 617a41f1f9..c5d20b34f5 100644 --- a/Source/Core/DolphinWX/Src/Main.cpp +++ b/Source/Core/DolphinWX/Src/Main.cpp @@ -595,11 +595,15 @@ bool Host_GetKeyState(int keycode) #ifdef _WIN32 return GetAsyncKeyState(keycode); #elif defined __WXGTK__ - wxCommandEvent event(wxEVT_HOST_COMMAND, IDM_KEYSTATE); - event.SetInt(keycode); - main_frame->GetEventHandler()->AddPendingEvent(event); - main_frame->keystate_event.Wait(); - return main_frame->bKeyStateResult; + std::unique_lock lk(main_frame->keystate_lock, std::defer_lock); + if (!lk.try_lock()) + return false; + + bool key_pressed; + if (!wxIsMainThread()) wxMutexGuiEnter(); + key_pressed = wxGetKeyState(wxKeyCode(keycode)); + if (!wxIsMainThread()) wxMutexGuiLeave(); + return key_pressed; #else return wxGetKeyState(wxKeyCode(keycode)); #endif