Fix Host_GetKeyState in a more effective way.

git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@7308 8ced0084-cf51-0410-be5f-012b33b47a6e
This commit is contained in:
Glenn Rice 2011-03-06 04:31:43 +00:00
parent 9095dad009
commit ec7e160bdc
4 changed files with 15 additions and 20 deletions

View File

@ -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:

View File

@ -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

View File

@ -1021,6 +1021,11 @@ void CFrame::DoStop()
{
if (Core::GetState() != Core::CORE_UNINITIALIZED)
{
#if defined __WXGTK__
wxMutexGuiLeave();
std::lock_guard<std::mutex> 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

View File

@ -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<std::mutex> 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