diff --git a/Source/Core/Core/Core.cpp b/Source/Core/Core/Core.cpp index 3fffedb7fb..b5be916b1e 100644 --- a/Source/Core/Core/Core.cpp +++ b/Source/Core/Core/Core.cpp @@ -83,6 +83,7 @@ bool g_bStarted = false; void *g_pWindowHandle = nullptr; std::string g_stateFileName; std::thread g_EmuThread; +static StoppedCallbackFunc s_onStoppedCb = nullptr; static std::thread g_cpu_thread; static bool g_requestRefreshInfo = false; @@ -155,7 +156,7 @@ bool IsRunning() bool IsRunningAndStarted() { - return g_bStarted; + return g_bStarted && !g_bStopping; } bool IsRunningInCurrentThread() @@ -191,8 +192,14 @@ bool Init() if (g_EmuThread.joinable()) { - PanicAlertT("Emu Thread already running"); - return false; + if (IsRunning()) + { + PanicAlertT("Emu Thread already running"); + return false; + } + + // The Emu Thread was stopped, synchronize with it. + g_EmuThread.join(); } g_CoreStartupParameter = _CoreParameter; @@ -226,12 +233,8 @@ bool Init() // Called from GUI thread void Stop() // - Hammertime! { - if (PowerPC::GetState() == PowerPC::CPU_POWERDOWN) - { - if (g_EmuThread.joinable()) - g_EmuThread.join(); + if (GetState() == CORE_STOPPING) return; - } const SCoreStartupParameter& _CoreParameter = SConfig::GetInstance().m_LocalCoreStartupParameter; @@ -258,28 +261,6 @@ void Stop() // - Hammertime! g_video_backend->Video_ExitLoop(); } - - INFO_LOG(CONSOLE, "%s", StopMessage(true, "Stopping Emu thread ...").c_str()); - - g_EmuThread.join(); // Wait for emuthread to close. - - INFO_LOG(CONSOLE, "%s", StopMessage(true, "Main Emu thread stopped").c_str()); - - // Clear on screen messages that haven't expired - g_video_backend->Video_ClearMessages(); - - // Close the trace file - Core::StopTrace(); - - // Reload sysconf file in order to see changes committed during emulation - if (_CoreParameter.bWii) - SConfig::GetInstance().m_SYSCONF->Reload(); - - INFO_LOG(CONSOLE, "Stop [Main Thread]\t\t---- Shutdown complete ----"); - Movie::Shutdown(); - PatchEngine::Shutdown(); - - g_bStopping = false; } // Create the CPU thread, which is a CPU + Video thread in Single Core mode. @@ -478,6 +459,8 @@ void EmuThread() } } + INFO_LOG(CONSOLE, "%s", StopMessage(true, "Stopping Emu thread ...").c_str()); + // Wait for g_cpu_thread to exit INFO_LOG(CONSOLE, "%s", StopMessage(true, "Stopping CPU-GPU thread ...").c_str()); @@ -510,6 +493,27 @@ void EmuThread() Wiimote::Shutdown(); g_video_backend->Shutdown(); AudioCommon::ShutdownSoundStream(); + + INFO_LOG(CONSOLE, "%s", StopMessage(true, "Main Emu thread stopped").c_str()); + + // Clear on screen messages that haven't expired + g_video_backend->Video_ClearMessages(); + + // Close the trace file + Core::StopTrace(); + + // Reload sysconf file in order to see changes committed during emulation + if (_CoreParameter.bWii) + SConfig::GetInstance().m_SYSCONF->Reload(); + + INFO_LOG(CONSOLE, "Stop [Video Thread]\t\t---- Shutdown complete ----"); + Movie::Shutdown(); + PatchEngine::Shutdown(); + + g_bStopping = false; + + if (s_onStoppedCb) + s_onStoppedCb(); } // Set or get the running state @@ -534,15 +538,17 @@ void SetState(EState _State) EState GetState() { + if (g_bStopping) + return CORE_STOPPING; + if (g_bHwInit) { if (CCPU::IsStepping()) return CORE_PAUSE; - else if (g_bStopping) - return CORE_STOPPING; else return CORE_RUN; } + return CORE_UNINITIALIZED; } @@ -740,4 +746,15 @@ void UpdateTitle() } } +void Shutdown() +{ + if (g_EmuThread.joinable()) + g_EmuThread.join(); +} + +void SetOnStoppedCallback(StoppedCallbackFunc callback) +{ + s_onStoppedCb = callback; +} + } // Core diff --git a/Source/Core/Core/Core.h b/Source/Core/Core/Core.h index 862160daf0..655c5f9301 100644 --- a/Source/Core/Core/Core.h +++ b/Source/Core/Core/Core.h @@ -39,6 +39,7 @@ enum EState bool Init(); void Stop(); +void Shutdown(); std::string StopMessage(bool, std::string); @@ -81,4 +82,8 @@ void UpdateTitle(); // the return value of the first call should be passed in as the second argument of the second call. bool PauseAndLock(bool doLock, bool unpauseOnUnlock=true); +// for calling back into UI code without introducing a dependency on it in core +typedef void(*StoppedCallbackFunc)(void); +void SetOnStoppedCallback(StoppedCallbackFunc callback); + } // namespace diff --git a/Source/Core/Core/Debugger/Debugger_SymbolMap.cpp b/Source/Core/Core/Debugger/Debugger_SymbolMap.cpp index 112c4c310b..b0dab163a5 100644 --- a/Source/Core/Core/Debugger/Debugger_SymbolMap.cpp +++ b/Source/Core/Core/Debugger/Debugger_SymbolMap.cpp @@ -69,8 +69,7 @@ void WalkTheStack(const std::function& stack_step) // instead of "pointing ahead" bool GetCallstack(std::vector &output) { - if (Core::GetState() == Core::CORE_UNINITIALIZED || - !Memory::IsRAMAddress(PowerPC::ppcState.gpr[1])) + if (!Core::IsRunning() || !Memory::IsRAMAddress(PowerPC::ppcState.gpr[1])) return false; if (LR == 0) diff --git a/Source/Core/Core/Movie.cpp b/Source/Core/Core/Movie.cpp index c90b0e2512..e14f6068da 100644 --- a/Source/Core/Core/Movie.cpp +++ b/Source/Core/Core/Movie.cpp @@ -382,7 +382,7 @@ bool IsNetPlayRecording() void ChangePads(bool instantly) { - if (Core::GetState() == Core::CORE_UNINITIALIZED) + if (!Core::IsRunning()) return; int controllers = 0; @@ -444,7 +444,7 @@ bool BeginRecordingInput(int controllers) if (SConfig::GetInstance().m_SIDevice[i] == SIDEVICE_GC_TARUKONGA) bongos |= (1 << i); - if (Core::IsRunning()) + if (Core::IsRunningAndStarted()) { if (File::Exists(tmpStateFilename)) File::Delete(tmpStateFilename); diff --git a/Source/Core/Core/State.cpp b/Source/Core/Core/State.cpp index 55cd1a2fa7..a4619ad752 100644 --- a/Source/Core/Core/State.cpp +++ b/Source/Core/Core/State.cpp @@ -424,7 +424,7 @@ void LoadFileStateData(const std::string& filename, std::vector& ret_data) void LoadAs(const std::string& filename) { - if (Core::GetState() == Core::CORE_UNINITIALIZED) + if (!Core::IsRunning()) return; // Stop the core while we load the state diff --git a/Source/Core/DolphinWX/ConfigMain.cpp b/Source/Core/DolphinWX/ConfigMain.cpp index c74400a73f..9208b70b08 100644 --- a/Source/Core/DolphinWX/ConfigMain.cpp +++ b/Source/Core/DolphinWX/ConfigMain.cpp @@ -230,7 +230,7 @@ void CConfigMain::SetSelectedTab(int tab) // Used to restrict changing of some options while emulator is running void CConfigMain::UpdateGUI() { - if (Core::GetState() != Core::CORE_UNINITIALIZED) + if (Core::IsRunning()) { // Disable the Core stuff on GeneralPage CPUThread->Disable(); @@ -669,7 +669,7 @@ void CConfigMain::CreateGUIControls() Latency->Bind(wxEVT_SPINCTRL, &CConfigMain::AudioSettingsChanged, this); - if (Core::GetState() != Core::CORE_UNINITIALIZED) + if (Core::IsRunning()) { Latency->Disable(); BackendSelection->Disable(); @@ -888,7 +888,7 @@ void CConfigMain::CoreSettingsChanged(wxCommandEvent& event) { // Core - Basic case ID_CPUTHREAD: - if (Core::GetState() != Core::CORE_UNINITIALIZED) + if (Core::IsRunning()) return; SConfig::GetInstance().m_LocalCoreStartupParameter.bCPUThread = CPUThread->IsChecked(); break; @@ -1099,7 +1099,7 @@ void CConfigMain::ChooseMemcardPath(std::string& strMemcard, bool isSlotA) { strMemcard = filename; - if (Core::GetState() != Core::CORE_UNINITIALIZED) + if (Core::IsRunning()) { // Change memcard to the new file ExpansionInterface::ChangeDevice( @@ -1136,7 +1136,7 @@ void CConfigMain::ChooseSIDevice(wxString deviceName, int deviceNum) SConfig::GetInstance().m_SIDevice[deviceNum] = tempType; - if (Core::GetState() != Core::CORE_UNINITIALIZED) + if (Core::IsRunning()) { // Change plugged device! :D SerialInterface::ChangeDevice(tempType, deviceNum); @@ -1172,7 +1172,7 @@ void CConfigMain::ChooseEXIDevice(wxString deviceName, int deviceNum) SConfig::GetInstance().m_EXIDevice[deviceNum] = tempType; - if (Core::GetState() != Core::CORE_UNINITIALIZED) + if (Core::IsRunning()) { // Change plugged device! :D ExpansionInterface::ChangeDevice( diff --git a/Source/Core/DolphinWX/Debugger/CodeWindowFunctions.cpp b/Source/Core/DolphinWX/Debugger/CodeWindowFunctions.cpp index 41abb27300..9f3c081c16 100644 --- a/Source/Core/DolphinWX/Debugger/CodeWindowFunctions.cpp +++ b/Source/Core/DolphinWX/Debugger/CodeWindowFunctions.cpp @@ -219,7 +219,7 @@ void CCodeWindow::OnSymbolsMenu(wxCommandEvent& event) { Parent->ClearStatusBar(); - if (Core::GetState() == Core::CORE_UNINITIALIZED) return; + if (!Core::IsRunning()) return; std::string existing_map_file, writable_map_file; bool map_exists = CBoot::FindMapFile(&existing_map_file, diff --git a/Source/Core/DolphinWX/Frame.cpp b/Source/Core/DolphinWX/Frame.cpp index 3e41b8c7d8..32fa469034 100644 --- a/Source/Core/DolphinWX/Frame.cpp +++ b/Source/Core/DolphinWX/Frame.cpp @@ -217,7 +217,7 @@ WXLRESULT CRenderFrame::MSWWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lPa case WM_CLOSE: // Let Core finish initializing before accepting any WM_CLOSE messages - if (Core::GetState() == Core::CORE_UNINITIALIZED) break; + if (!Core::IsRunning()) break; // Use default action otherwise default: @@ -352,7 +352,7 @@ CFrame::CFrame(wxFrame* parent, , m_LogWindow(nullptr), m_LogConfigWindow(nullptr) , m_FifoPlayerDlg(nullptr), UseDebugger(_UseDebugger) , m_bBatchMode(_BatchMode), m_bEdit(false), m_bTabSplit(false), m_bNoDocking(false) - , m_bGameLoading(false) + , m_bGameLoading(false), m_bClosing(false) { for (int i = 0; i <= IDM_CODEWINDOW - IDM_LOGWINDOW; i++) bFloatWindow[i] = false; @@ -425,6 +425,7 @@ CFrame::CFrame(wxFrame* parent, Movie::SetInputManip(TASManipFunction); State::SetOnAfterLoadCallback(OnAfterLoadCallback); + Core::SetOnStoppedCallback(OnStoppedCallback); // Setup perspectives if (g_pCodeWindow) @@ -535,15 +536,18 @@ void CFrame::OnActive(wxActivateEvent& event) void CFrame::OnClose(wxCloseEvent& event) { + m_bClosing = true; + + // 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(); - if (Core::GetState() != Core::CORE_UNINITIALIZED) - return; - UpdateGUI(); + event.Veto(); + return; } - //Stop Dolphin from saving the minimized Xpos and Ypos + // Stop Dolphin from saving the minimized Xpos and Ypos if (main_frame->IsIconized()) main_frame->Iconize(false); @@ -692,6 +696,10 @@ void CFrame::OnHostMessage(wxCommandEvent& event) case WM_USER_STOP: DoStop(); break; + + case IDM_STOPPED: + OnStopped(); + break; } } @@ -714,7 +722,7 @@ void CFrame::GetRenderWindowSize(int& x, int& y, int& width, int& height) void CFrame::OnRenderWindowSizeRequest(int width, int height) { - if (Core::GetState() == Core::CORE_UNINITIALIZED || + if (!Core::IsRunning() || !SConfig::GetInstance().m_LocalCoreStartupParameter.bRenderWindowAutoSize || RendererIsFullscreen() || m_RenderFrame->IsMaximized()) return; @@ -904,6 +912,16 @@ void OnAfterLoadCallback() } } +void OnStoppedCallback() +{ + // warning: this gets called from the EmuThread, so we should only queue things to do on the proper thread + if (main_frame) + { + wxCommandEvent event(wxEVT_HOST_COMMAND, IDM_STOPPED); + main_frame->GetEventHandler()->AddPendingEvent(event); + } +} + void TASManipFunction(SPADStatus *PadStatus, int controllerID) { if (main_frame) @@ -1091,8 +1109,7 @@ void CFrame::OnKeyDown(wxKeyEvent& event) void CFrame::OnKeyUp(wxKeyEvent& event) { - if(Core::GetState() != Core::CORE_UNINITIALIZED && - (RendererHasFocus() || TASInputHasFocus())) + if(Core::IsRunning() && (RendererHasFocus() || TASInputHasFocus())) { if (IsHotkey(event, HK_TOGGLE_THROTTLE)) { diff --git a/Source/Core/DolphinWX/Frame.h b/Source/Core/DolphinWX/Frame.h index 32292c1cb4..27f88690c9 100644 --- a/Source/Core/DolphinWX/Frame.h +++ b/Source/Core/DolphinWX/Frame.h @@ -123,6 +123,7 @@ public: void InitBitmaps(); void DoPause(); void DoStop(); + void OnStopped(); void DoRecordingSave(); void UpdateGUI(); void UpdateGameList(); @@ -185,6 +186,7 @@ private: bool m_bTabSplit; bool m_bNoDocking; bool m_bGameLoading; + bool m_bClosing; std::vector drives; @@ -353,6 +355,7 @@ private: int GetCmdForHotkey(unsigned int key); void OnAfterLoadCallback(); +void OnStoppedCallback(); // For TASInputDlg void TASManipFunction(SPADStatus *PadStatus, int controllerID); 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); + // 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); + // 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 - { + // 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; - - // Clean framerate indications from the status bar. - GetStatusBar()->SetStatusText(" ", 0); - - // 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 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(); + // 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); + + // Clear wiimote connection status from the status bar. + GetStatusBar()->SetStatusText(" ", 1); + + // 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); + + 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; diff --git a/Source/Core/DolphinWX/Globals.h b/Source/Core/DolphinWX/Globals.h index d51ee2c135..401f4265ad 100644 --- a/Source/Core/DolphinWX/Globals.h +++ b/Source/Core/DolphinWX/Globals.h @@ -254,6 +254,7 @@ enum IDM_PANIC, IDM_KEYSTATE, IDM_WINDOWSIZEREQUEST, + IDM_STOPPED, IDM_HOST_MESSAGE, IDM_MPANEL, ID_STATUSBAR, diff --git a/Source/Core/DolphinWX/Main.cpp b/Source/Core/DolphinWX/Main.cpp index 3643d6e5ec..0559e9b7bf 100644 --- a/Source/Core/DolphinWX/Main.cpp +++ b/Source/Core/DolphinWX/Main.cpp @@ -37,6 +37,7 @@ #include "Common/Logging/LogManager.h" #include "Core/ConfigManager.h" +#include "Core/Core.h" #include "Core/CoreParameter.h" #include "Core/Movie.h" #include "Core/HW/Wiimote.h" @@ -455,6 +456,7 @@ int DolphinApp::OnExit() VideoBackend::ClearList(); SConfig::Shutdown(); LogManager::Shutdown(); + Core::Shutdown(); delete m_locale; diff --git a/Source/Core/DolphinWX/MainNoGUI.cpp b/Source/Core/DolphinWX/MainNoGUI.cpp index d4b75d83cb..0345e20b2b 100644 --- a/Source/Core/DolphinWX/MainNoGUI.cpp +++ b/Source/Core/DolphinWX/MainNoGUI.cpp @@ -131,7 +131,7 @@ void Host_SetWiiMoteConnectionState(int _State) {} void X11_MainLoop() { bool fullscreen = SConfig::GetInstance().m_LocalCoreStartupParameter.bFullscreen; - while (Core::GetState() == Core::CORE_UNINITIALIZED) + while (!Core::IsRunning()) updateMainFrameEvent.Wait(); Display *dpy = XOpenDisplay(0); diff --git a/Source/Core/DolphinWX/VideoConfigDiag.cpp b/Source/Core/DolphinWX/VideoConfigDiag.cpp index 6a21fadce0..eaf9ef2b8a 100644 --- a/Source/Core/DolphinWX/VideoConfigDiag.cpp +++ b/Source/Core/DolphinWX/VideoConfigDiag.cpp @@ -246,7 +246,7 @@ VideoConfigDiag::VideoConfigDiag(wxWindow* parent, const std::string &title, con szr_basic->Add(label_backend, 1, wxALIGN_CENTER_VERTICAL, 5); szr_basic->Add(choice_backend, 1, 0, 0); - if (Core::GetState() != Core::CORE_UNINITIALIZED) + if (Core::IsRunning()) { label_backend->Disable(); choice_backend->Disable(); @@ -291,7 +291,7 @@ VideoConfigDiag::VideoConfigDiag(wxWindow* parent, const std::string &title, con szr_display->Add(label_display_resolution, 1, wxALIGN_CENTER_VERTICAL, 0); szr_display->Add(choice_display_resolution); - if (Core::GetState() != Core::CORE_UNINITIALIZED) + if (Core::IsRunning()) { label_display_resolution->Disable(); choice_display_resolution->Disable(); @@ -328,9 +328,8 @@ VideoConfigDiag::VideoConfigDiag(wxWindow* parent, const std::string &title, con szr_other->Add(CreateCheckBox(page_general, _("Hide Mouse Cursor"), wxGetTranslation(hide_mouse_cursor_desc), SConfig::GetInstance().m_LocalCoreStartupParameter.bHideCursor)); szr_other->Add(render_to_main_cb = CreateCheckBox(page_general, _("Render to Main Window"), wxGetTranslation(render_to_main_win_desc), SConfig::GetInstance().m_LocalCoreStartupParameter.bRenderToMain)); - if (Core::GetState() != Core::CORE_UNINITIALIZED) + if (Core::IsRunning()) render_to_main_cb->Disable(); - } @@ -576,7 +575,7 @@ VideoConfigDiag::VideoConfigDiag(wxWindow* parent, const std::string &title, con wxCheckBox* const cb_prog_scan = new wxCheckBox(page_advanced, wxID_ANY, _("Enable Progressive Scan")); RegisterControl(cb_prog_scan, wxGetTranslation(prog_scan_desc)); cb_prog_scan->Bind(wxEVT_CHECKBOX, &VideoConfigDiag::Event_ProgressiveScan, this); - if (Core::GetState() != Core::CORE_UNINITIALIZED) + if (Core::IsRunning()) cb_prog_scan->Disable(); cb_prog_scan->SetValue(SConfig::GetInstance().m_LocalCoreStartupParameter.bProgressive); diff --git a/Source/Core/DolphinWX/VideoConfigDiag.h b/Source/Core/DolphinWX/VideoConfigDiag.h index 695a01ee7a..c17506351b 100644 --- a/Source/Core/DolphinWX/VideoConfigDiag.h +++ b/Source/Core/DolphinWX/VideoConfigDiag.h @@ -86,7 +86,7 @@ protected: VideoBackend* new_backend = g_available_video_backends[ev.GetInt()]; if (g_video_backend != new_backend) { - bool do_switch = Core::GetState() == Core::CORE_UNINITIALIZED; + bool do_switch = !Core::IsRunning(); if (new_backend->GetName() == "Software Renderer") { do_switch = (wxYES == wxMessageBox(_("Software rendering is an order of magnitude slower than using the other backends.\nIt's only useful for debugging purposes.\nDo you really want to enable software rendering? If unsure, select 'No'."),