summaryrefslogtreecommitdiff
path: root/Source/Core/DolphinWX/FrameTools.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Source/Core/DolphinWX/FrameTools.cpp')
-rw-r--r--Source/Core/DolphinWX/FrameTools.cpp128
1 files changed, 71 insertions, 57 deletions
diff --git a/Source/Core/DolphinWX/FrameTools.cpp b/Source/Core/DolphinWX/FrameTools.cpp
index 6548deb5f0..7cd29d7ef5 100644
--- a/Source/Core/DolphinWX/FrameTools.cpp
+++ b/Source/Core/DolphinWX/FrameTools.cpp
@@ -802,7 +802,7 @@ void CFrame::OnRecordExport(wxCommandEvent& WXUNUSED (event))
void CFrame::OnPlay(wxCommandEvent& WXUNUSED (event))
{
- if (Core::GetState() != Core::CORE_UNINITIALIZED)
+ if (Core::IsRunning())
{
// Core is initialized and emulator is running
if (UseDebugger)
@@ -832,9 +832,16 @@ void CFrame::OnPlay(wxCommandEvent& WXUNUSED (event))
void CFrame::OnRenderParentClose(wxCloseEvent& event)
{
- DoStop();
- if (Core::GetState() == Core::CORE_UNINITIALIZED)
- event.Skip();
+ // Before closing the window we need to shut down the emulation core.
+ // We'll try to close this window again once that is done.
+ if (Core::GetState() != Core::CORE_UNINITIALIZED)
+ {
+ DoStop();
+ event.Veto();
+ return;
+ }
+
+ event.Skip();
}
void CFrame::OnRenderParentMove(wxMoveEvent& event)
@@ -1120,72 +1127,78 @@ void CFrame::DoStop()
wxBeginBusyCursor();
BootManager::Stop();
- wxEndBusyCursor();
- confirmStop = false;
+ UpdateGUI();
+ }
+}
+
+void CFrame::OnStopped()
+{
+ wxEndBusyCursor();
+
+ confirmStop = false;
#if defined(HAVE_X11) && HAVE_X11
if (SConfig::GetInstance().m_LocalCoreStartupParameter.bDisableScreenSaver)
X11Utils::InhibitScreensaver(X11Utils::XDisplayFromHandle(GetHandle()),
X11Utils::XWindowFromHandle(GetHandle()), false);
#endif
- m_RenderFrame->SetTitle(StrToWxStr(scm_rev_str));
+ m_RenderFrame->SetTitle(StrToWxStr(scm_rev_str));
- // Destroy the renderer frame when not rendering to main
- m_RenderParent->Unbind(wxEVT_SIZE, &CFrame::OnRenderParentResize, this);
-
- // Keyboard
- wxTheApp->Unbind(wxEVT_KEY_DOWN, &CFrame::OnKeyDown, this);
- wxTheApp->Unbind(wxEVT_KEY_UP, &CFrame::OnKeyUp, this);
-
- // Mouse
- wxTheApp->Unbind(wxEVT_RIGHT_DOWN, &CFrame::OnMouse, this);
- wxTheApp->Unbind(wxEVT_RIGHT_UP, &CFrame::OnMouse, this);
- wxTheApp->Unbind(wxEVT_MIDDLE_DOWN, &CFrame::OnMouse, this);
- wxTheApp->Unbind(wxEVT_MIDDLE_UP, &CFrame::OnMouse, this);
- wxTheApp->Unbind(wxEVT_MOTION, &CFrame::OnMouse, this);
- if (SConfig::GetInstance().m_LocalCoreStartupParameter.bHideCursor)
- m_RenderParent->SetCursor(wxNullCursor);
- DoFullscreen(false);
- if (!SConfig::GetInstance().m_LocalCoreStartupParameter.bRenderToMain)
- {
- m_RenderFrame->Destroy();
- }
- else
- {
+ // Destroy the renderer frame when not rendering to main
+ m_RenderParent->Unbind(wxEVT_SIZE, &CFrame::OnRenderParentResize, this);
+
+ // Keyboard
+ wxTheApp->Unbind(wxEVT_KEY_DOWN, &CFrame::OnKeyDown, this);
+ wxTheApp->Unbind(wxEVT_KEY_UP, &CFrame::OnKeyUp, this);
+
+ // Mouse
+ wxTheApp->Unbind(wxEVT_RIGHT_DOWN, &CFrame::OnMouse, this);
+ wxTheApp->Unbind(wxEVT_RIGHT_UP, &CFrame::OnMouse, this);
+ wxTheApp->Unbind(wxEVT_MIDDLE_DOWN, &CFrame::OnMouse, this);
+ wxTheApp->Unbind(wxEVT_MIDDLE_UP, &CFrame::OnMouse, this);
+ wxTheApp->Unbind(wxEVT_MOTION, &CFrame::OnMouse, this);
+ if (SConfig::GetInstance().m_LocalCoreStartupParameter.bHideCursor)
+ m_RenderParent->SetCursor(wxNullCursor);
+ DoFullscreen(false);
+ if (!SConfig::GetInstance().m_LocalCoreStartupParameter.bRenderToMain)
+ {
+ m_RenderFrame->Destroy();
+ }
+ else
+ {
#if defined(__APPLE__)
- // Disable the full screen button when not in a game.
- NSView *view = (NSView *) m_RenderFrame->GetHandle();
- NSWindow *window = [view window];
+ // Disable the full screen button when not in a game.
+ NSView *view = (NSView *)m_RenderFrame->GetHandle();
+ NSWindow *window = [view window];
- [window setCollectionBehavior:NSWindowCollectionBehaviorDefault];
+ [window setCollectionBehavior : NSWindowCollectionBehaviorDefault];
#endif
- // Make sure the window is not longer set to stay on top
- m_RenderFrame->SetWindowStyle(m_RenderFrame->GetWindowStyle() & ~wxSTAY_ON_TOP);
- }
- m_RenderParent = nullptr;
+ // Make sure the window is not longer set to stay on top
+ m_RenderFrame->SetWindowStyle(m_RenderFrame->GetWindowStyle() & ~wxSTAY_ON_TOP);
+ }
+ m_RenderParent = nullptr;
- // Clean framerate indications from the status bar.
- GetStatusBar()->SetStatusText(" ", 0);
+ // Clean framerate indications from the status bar.
+ GetStatusBar()->SetStatusText(" ", 0);
- // Clear wiimote connection status from the status bar.
- GetStatusBar()->SetStatusText(" ", 1);
+ // Clear wiimote connection status from the status bar.
+ GetStatusBar()->SetStatusText(" ", 1);
- // If batch mode was specified on the command-line, exit now.
- if (m_bBatchMode)
- Close(true);
+ // If batch mode was specified on the command-line or we were already closing, exit now.
+ if (m_bBatchMode || m_bClosing)
+ Close(true);
- // If using auto size with render to main, reset the application size.
- if (SConfig::GetInstance().m_LocalCoreStartupParameter.bRenderToMain &&
- SConfig::GetInstance().m_LocalCoreStartupParameter.bRenderWindowAutoSize)
- SetSize(SConfig::GetInstance().m_LocalCoreStartupParameter.iWidth,
- SConfig::GetInstance().m_LocalCoreStartupParameter.iHeight);
+ // If using auto size with render to main, reset the application size.
+ if (SConfig::GetInstance().m_LocalCoreStartupParameter.bRenderToMain &&
+ SConfig::GetInstance().m_LocalCoreStartupParameter.bRenderWindowAutoSize)
+ SetSize(SConfig::GetInstance().m_LocalCoreStartupParameter.iWidth,
+ SConfig::GetInstance().m_LocalCoreStartupParameter.iHeight);
- m_GameListCtrl->Enable();
- m_GameListCtrl->Show();
- m_GameListCtrl->SetFocus();
- UpdateGUI();
- }
+ m_GameListCtrl->Enable();
+ m_GameListCtrl->Show();
+ m_GameListCtrl->SetFocus();
+ UpdateGUI();
}
void CFrame::DoRecordingSave()
@@ -1568,7 +1581,7 @@ void CFrame::OnLoadLastState(wxCommandEvent& event)
void CFrame::OnSaveFirstState(wxCommandEvent& WXUNUSED(event))
{
- if (Core::GetState() != Core::CORE_UNINITIALIZED)
+ if (Core::IsRunningAndStarted())
State::SaveFirstSaved();
}
@@ -1626,6 +1639,7 @@ void CFrame::UpdateGUI()
bool Initialized = Core::IsRunning();
bool Running = Core::GetState() == Core::CORE_RUN;
bool Paused = Core::GetState() == Core::CORE_PAUSE;
+ bool Stopping = Core::GetState() == Core::CORE_STOPPING;
bool RunningWii = Initialized && SConfig::GetInstance().m_LocalCoreStartupParameter.bWii;
bool RunningGamecube = Initialized && !SConfig::GetInstance().m_LocalCoreStartupParameter.bWii;
@@ -1772,8 +1786,8 @@ void CFrame::UpdateGUI()
{
// Game has been loaded, enable the pause button
if (m_ToolBar)
- m_ToolBar->EnableTool(IDM_PLAY, true);
- GetMenuBar()->FindItem(IDM_PLAY)->Enable(true);
+ m_ToolBar->EnableTool(IDM_PLAY, !Stopping);
+ GetMenuBar()->FindItem(IDM_PLAY)->Enable(!Stopping);
// Reset game loading flag
m_bGameLoading = false;