diff --git a/Source/Core/DolphinWX/Frame.cpp b/Source/Core/DolphinWX/Frame.cpp index 5978dfc49d..a07586ad9c 100644 --- a/Source/Core/DolphinWX/Frame.cpp +++ b/Source/Core/DolphinWX/Frame.cpp @@ -504,18 +504,25 @@ void CFrame::OnQuit(wxCommandEvent& WXUNUSED(event)) // Events void CFrame::OnActive(wxActivateEvent& event) { + m_bRendererHasFocus = (event.GetActive() && event.GetEventObject() == m_RenderFrame); if (Core::GetState() == Core::CORE_RUN || Core::GetState() == Core::CORE_PAUSE) { - if (event.GetActive() && event.GetEventObject() == m_RenderFrame) + if (m_bRendererHasFocus) { if (SConfig::GetInstance().bRenderToMain) m_RenderParent->SetFocus(); + if (SConfig::GetInstance().m_PauseOnFocusLost && Core::GetState() == Core::CORE_PAUSE) + DoPause(); + if (SConfig::GetInstance().bHideCursor && Core::GetState() == Core::CORE_RUN) m_RenderParent->SetCursor(wxCURSOR_BLANK); } else { + if (SConfig::GetInstance().m_PauseOnFocusLost && Core::GetState() == Core::CORE_RUN) + DoPause(); + if (SConfig::GetInstance().bHideCursor) m_RenderParent->SetCursor(wxNullCursor); } @@ -769,38 +776,7 @@ bool CFrame::RendererHasFocus() { if (m_RenderParent == nullptr) return false; -#ifdef _WIN32 - HWND window = GetForegroundWindow(); - if (window == nullptr) - return false; - - if (m_RenderFrame->GetHWND() == window) - return true; -#else - wxWindow* window = wxWindow::FindFocus(); - if (window == nullptr) - return false; - // Why these different cases? - if (m_RenderParent == window || m_RenderParent == window->GetParent() || - m_RenderParent->GetParent() == window->GetParent()) - { - return true; - } -#endif - return false; -} - -bool CFrame::UIHasFocus() -{ - // UIHasFocus should return true any time any one of our UI - // windows has the focus, including any dialogs or other windows. - // - // wxWindow::FindFocus() returns the current wxWindow which has - // focus. If it's not one of our windows, then it will return - // null. - - wxWindow* focusWindow = wxWindow::FindFocus(); - return (focusWindow != nullptr); + return m_bRendererHasFocus; } void CFrame::OnGameListCtrlItemActivated(wxListEvent& WXUNUSED(event)) @@ -1139,35 +1115,6 @@ void CFrame::OnMouse(wxMouseEvent& event) event.Skip(); } -void CFrame::OnFocusChange(wxFocusEvent& event) -{ - if (SConfig::GetInstance().m_PauseOnFocusLost && Core::IsRunningAndStarted()) - { - if (RendererHasFocus()) - { - if (Core::GetState() == Core::CORE_PAUSE) - { - Core::SetState(Core::CORE_RUN); - if (SConfig::GetInstance().bHideCursor) - m_RenderParent->SetCursor(wxCURSOR_BLANK); - } - } - else - { - if (Core::GetState() == Core::CORE_RUN) - { - Core::SetState(Core::CORE_PAUSE); - if (SConfig::GetInstance().bHideCursor) - m_RenderParent->SetCursor(wxNullCursor); - Core::UpdateTitle(); - } - } - UpdateGUI(); - } - - event.Skip(); -} - void CFrame::DoFullscreen(bool enable_fullscreen) { if (g_Config.bExclusiveMode && Core::GetState() == Core::CORE_PAUSE) diff --git a/Source/Core/DolphinWX/Frame.h b/Source/Core/DolphinWX/Frame.h index 883b2db9f4..99358f4de3 100644 --- a/Source/Core/DolphinWX/Frame.h +++ b/Source/Core/DolphinWX/Frame.h @@ -101,7 +101,6 @@ public: void OnRenderParentClose(wxCloseEvent& event); void OnRenderParentMove(wxMoveEvent& event); bool RendererHasFocus(); - bool UIHasFocus(); bool RendererIsFullscreen(); void DoFullscreen(bool bF); void ToggleDisplayMode(bool bFullscreen); @@ -158,6 +157,7 @@ private: bool m_bNoDocking = false; bool m_bGameLoading = false; bool m_bClosing = false; + bool m_bRendererHasFocus = false; bool m_confirmStop = false; bool m_tried_graceful_shutdown = false; int m_saveSlot = 1; @@ -306,8 +306,6 @@ private: void OnKeyDown(wxKeyEvent& event); // Keyboard void OnMouse(wxMouseEvent& event); // Mouse - void OnFocusChange(wxFocusEvent& event); - void OnHostMessage(wxCommandEvent& event); void OnMemcard(wxCommandEvent& event); // Misc diff --git a/Source/Core/DolphinWX/FrameTools.cpp b/Source/Core/DolphinWX/FrameTools.cpp index 7380583fe9..69ab9fcb63 100644 --- a/Source/Core/DolphinWX/FrameTools.cpp +++ b/Source/Core/DolphinWX/FrameTools.cpp @@ -735,8 +735,6 @@ void CFrame::StartGame(const std::string& filename) wxTheApp->Bind(wxEVT_MIDDLE_DOWN, &CFrame::OnMouse, this); wxTheApp->Bind(wxEVT_MIDDLE_UP, &CFrame::OnMouse, this); wxTheApp->Bind(wxEVT_MOTION, &CFrame::OnMouse, this); - wxTheApp->Bind(wxEVT_SET_FOCUS, &CFrame::OnFocusChange, this); - wxTheApp->Bind(wxEVT_KILL_FOCUS, &CFrame::OnFocusChange, this); m_RenderParent->Bind(wxEVT_SIZE, &CFrame::OnRenderParentResize, this); } } @@ -928,6 +926,8 @@ void CFrame::OnStopped() m_RenderFrame->SetWindowStyle(m_RenderFrame->GetWindowStyle() & ~wxSTAY_ON_TOP); } m_RenderParent = nullptr; + m_bRendererHasFocus = false; + m_RenderFrame = nullptr; // Clean framerate indications from the status bar. GetStatusBar()->SetStatusText(" ", 0); diff --git a/Source/Core/DolphinWX/Main.cpp b/Source/Core/DolphinWX/Main.cpp index bdf6ada482..6620275cfa 100644 --- a/Source/Core/DolphinWX/Main.cpp +++ b/Source/Core/DolphinWX/Main.cpp @@ -84,6 +84,7 @@ bool DolphinApp::OnInit() Bind(wxEVT_QUERY_END_SESSION, &DolphinApp::OnEndSession, this); Bind(wxEVT_END_SESSION, &DolphinApp::OnEndSession, this); Bind(wxEVT_IDLE, &DolphinApp::OnIdle, this); + Bind(wxEVT_ACTIVATE_APP, &DolphinApp::OnActivate, this); // Register message box and translation handlers RegisterMsgAlertHandler(&wxMsgAlert); @@ -256,6 +257,11 @@ void DolphinApp::AfterInit() } } +void DolphinApp::OnActivate(wxActivateEvent& ev) +{ + m_is_active = ev.GetActive(); +} + void DolphinApp::InitLanguageSupport() { std::string language_code; @@ -500,7 +506,7 @@ void Host_SetWiiMoteConnectionState(int _State) bool Host_UIHasFocus() { - return main_frame->UIHasFocus(); + return wxGetApp().IsActiveThreadsafe(); } bool Host_RendererHasFocus() diff --git a/Source/Core/DolphinWX/Main.h b/Source/Core/DolphinWX/Main.h index 803ee3baa9..e1bfd8df25 100644 --- a/Source/Core/DolphinWX/Main.h +++ b/Source/Core/DolphinWX/Main.h @@ -16,6 +16,7 @@ extern CFrame* main_frame; class DolphinApp : public wxApp { public: + bool IsActiveThreadsafe() const { return m_is_active; } CFrame* GetCFrame(); private: @@ -33,10 +34,12 @@ private: void OnEndSession(wxCloseEvent& event); void InitLanguageSupport(); void AfterInit(); + void OnActivate(wxActivateEvent& ev); void OnIdle(wxIdleEvent&); bool m_batch_mode = false; bool m_confirm_stop = false; + bool m_is_active = true; bool m_load_file = false; bool m_play_movie = false; bool m_use_debugger = false;