summaryrefslogtreecommitdiff
path: root/Source
diff options
context:
space:
mode:
authorAnthony <Helios747@users.noreply.github.com>2016-10-29 00:35:18 -0500
committerGitHub <noreply@github.com>2016-10-29 00:35:18 -0500
commit41563c55cd56cbdaf245cf4ee26ca49a27861395 (patch)
tree1f786af4aac6fb453ec53491af17e10e0896df65 /Source
parent26902d89e89de46d43adf11a194ea1ef84b9f4da (diff)
parentee201455a8810803a9966b951815143786a0767d (diff)
Merge pull request #4394 from aldelaro5/fix-focus-detection-linux
Fix window focus detection on Linux (rebase from #3843)
Diffstat (limited to 'Source')
-rw-r--r--Source/Core/DolphinWX/Frame.cpp71
-rw-r--r--Source/Core/DolphinWX/Frame.h4
-rw-r--r--Source/Core/DolphinWX/FrameTools.cpp4
-rw-r--r--Source/Core/DolphinWX/Main.cpp8
-rw-r--r--Source/Core/DolphinWX/Main.h3
5 files changed, 22 insertions, 68 deletions
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;