mirror of
https://github.com/dolphin-emu/dolphin.git
synced 2025-01-30 06:32:56 +00:00
Qt: Implement safe shutdown
This commit is contained in:
parent
2de31317e9
commit
6688e66c60
@ -2,6 +2,7 @@
|
|||||||
// Licensed under GPLv2+
|
// Licensed under GPLv2+
|
||||||
// Refer to the license.txt file included.
|
// Refer to the license.txt file included.
|
||||||
|
|
||||||
|
#include <QCloseEvent>
|
||||||
#include <QDir>
|
#include <QDir>
|
||||||
#include <QFileDialog>
|
#include <QFileDialog>
|
||||||
#include <QIcon>
|
#include <QIcon>
|
||||||
@ -37,6 +38,8 @@
|
|||||||
|
|
||||||
#include "InputCommon/ControllerInterface/ControllerInterface.h"
|
#include "InputCommon/ControllerInterface/ControllerInterface.h"
|
||||||
|
|
||||||
|
#include "UICommon/UICommon.h"
|
||||||
|
|
||||||
MainWindow::MainWindow() : QMainWindow(nullptr)
|
MainWindow::MainWindow() : QMainWindow(nullptr)
|
||||||
{
|
{
|
||||||
setWindowTitle(QString::fromStdString(scm_rev_str));
|
setWindowTitle(QString::fromStdString(scm_rev_str));
|
||||||
@ -92,6 +95,8 @@ void MainWindow::ShutdownControllers()
|
|||||||
void MainWindow::InitCoreCallbacks()
|
void MainWindow::InitCoreCallbacks()
|
||||||
{
|
{
|
||||||
Core::SetOnStoppedCallback([this] { emit EmulationStopped(); });
|
Core::SetOnStoppedCallback([this] { emit EmulationStopped(); });
|
||||||
|
installEventFilter(this);
|
||||||
|
m_render_widget->installEventFilter(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void InstallHotkeyFilter(QWidget* dialog)
|
static void InstallHotkeyFilter(QWidget* dialog)
|
||||||
@ -198,6 +203,11 @@ void MainWindow::ConnectToolBar()
|
|||||||
connect(this, &MainWindow::EmulationStarted, m_tool_bar, &ToolBar::EmulationStarted);
|
connect(this, &MainWindow::EmulationStarted, m_tool_bar, &ToolBar::EmulationStarted);
|
||||||
connect(this, &MainWindow::EmulationPaused, m_tool_bar, &ToolBar::EmulationPaused);
|
connect(this, &MainWindow::EmulationPaused, m_tool_bar, &ToolBar::EmulationPaused);
|
||||||
connect(this, &MainWindow::EmulationStopped, m_tool_bar, &ToolBar::EmulationStopped);
|
connect(this, &MainWindow::EmulationStopped, m_tool_bar, &ToolBar::EmulationStopped);
|
||||||
|
|
||||||
|
connect(this, &MainWindow::EmulationStopped, [this] {
|
||||||
|
m_stop_requested = false;
|
||||||
|
m_render_widget->hide();
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
void MainWindow::ConnectGameList()
|
void MainWindow::ConnectGameList()
|
||||||
@ -272,25 +282,54 @@ void MainWindow::Pause()
|
|||||||
|
|
||||||
bool MainWindow::Stop()
|
bool MainWindow::Stop()
|
||||||
{
|
{
|
||||||
bool stop = true;
|
if (!Core::IsRunning())
|
||||||
|
return true;
|
||||||
|
|
||||||
if (Settings::Instance().GetConfirmStop())
|
if (Settings::Instance().GetConfirmStop())
|
||||||
{
|
{
|
||||||
// We could pause the game here and resume it if they say no.
|
const Core::State state = Core::GetState();
|
||||||
|
// Set to false when Netplay is running as a CPU thread
|
||||||
|
bool pause = true;
|
||||||
|
|
||||||
|
if (pause)
|
||||||
|
Core::SetState(Core::State::Paused);
|
||||||
|
|
||||||
QMessageBox::StandardButton confirm;
|
QMessageBox::StandardButton confirm;
|
||||||
confirm = QMessageBox::question(m_render_widget, tr("Confirm"), tr("Stop emulation?"));
|
confirm = QMessageBox::question(m_render_widget, tr("Confirm"),
|
||||||
stop = (confirm == QMessageBox::Yes);
|
m_stop_requested ?
|
||||||
|
tr("A shutdown is already in progress. Unsaved data "
|
||||||
|
"may be lost if you stop the current emulation "
|
||||||
|
"before it completes. Force stop?") :
|
||||||
|
tr("Do you want to stop the current emulation?"));
|
||||||
|
if (confirm != QMessageBox::Yes)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (pause)
|
||||||
|
Core::SetState(state);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (stop)
|
// TODO: Add Movie shutdown
|
||||||
|
// TODO: Add Debugger shutdown
|
||||||
|
|
||||||
|
if (!m_stop_requested && UICommon::TriggerSTMPowerEvent())
|
||||||
{
|
{
|
||||||
ForceStop();
|
m_stop_requested = true;
|
||||||
|
|
||||||
|
// Unpause because gracefully shutting down needs the game to actually request a shutdown.
|
||||||
|
// Do not unpause in debug mode to allow debugging until the complete shutdown.
|
||||||
|
if (Core::GetState() == Core::State::Paused)
|
||||||
|
Core::SetState(Core::State::Running);
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
ForceStop();
|
||||||
|
|
||||||
#ifdef Q_OS_WIN
|
#ifdef Q_OS_WIN
|
||||||
// Allow windows to idle or turn off display again
|
// Allow windows to idle or turn off display again
|
||||||
SetThreadExecutionState(ES_CONTINUOUS);
|
SetThreadExecutionState(ES_CONTINUOUS);
|
||||||
#endif
|
#endif
|
||||||
}
|
return true;
|
||||||
return stop;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void MainWindow::ForceStop()
|
void MainWindow::ForceStop()
|
||||||
@ -480,3 +519,14 @@ void MainWindow::SetStateSlot(int slot)
|
|||||||
Settings::Instance().SetStateSlot(slot);
|
Settings::Instance().SetStateSlot(slot);
|
||||||
m_state_slot = slot;
|
m_state_slot = slot;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool MainWindow::eventFilter(QObject* object, QEvent* event)
|
||||||
|
{
|
||||||
|
if (event->type() == QEvent::Close && !Stop())
|
||||||
|
{
|
||||||
|
static_cast<QCloseEvent*>(event)->ignore();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
@ -27,6 +27,8 @@ public:
|
|||||||
explicit MainWindow();
|
explicit MainWindow();
|
||||||
~MainWindow();
|
~MainWindow();
|
||||||
|
|
||||||
|
bool eventFilter(QObject* object, QEvent* event) override;
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
void EmulationStarted();
|
void EmulationStarted();
|
||||||
void EmulationPaused();
|
void EmulationPaused();
|
||||||
@ -86,6 +88,7 @@ private:
|
|||||||
GameList* m_game_list;
|
GameList* m_game_list;
|
||||||
RenderWidget* m_render_widget;
|
RenderWidget* m_render_widget;
|
||||||
bool m_rendering_to_main;
|
bool m_rendering_to_main;
|
||||||
|
bool m_stop_requested = false;
|
||||||
int m_state_slot = 1;
|
int m_state_slot = 1;
|
||||||
|
|
||||||
HotkeyScheduler* m_hotkey_scheduler;
|
HotkeyScheduler* m_hotkey_scheduler;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user