From b0398f5aa7f587322c612f13b166c50a705492c5 Mon Sep 17 00:00:00 2001 From: Connor McLaughlin Date: Fri, 8 Jan 2021 23:42:17 +1000 Subject: [PATCH] Qt: Add shutdown without saving menu option --- android/app/src/cpp/android_host_interface.cpp | 4 ++++ src/duckstation-qt/mainwindow.cpp | 3 +++ src/duckstation-qt/mainwindow.ui | 12 +++++++++++- src/duckstation-qt/qthostinterface.cpp | 14 ++++++++++++++ src/duckstation-qt/qthostinterface.h | 1 + .../resources/icons/process-stop.png | Bin 0 -> 2054 bytes .../resources/icons/process-stop@2x.png | Bin 0 -> 4696 bytes src/duckstation-qt/resources/resources.qrc | 2 ++ src/duckstation-sdl/sdl_host_interface.cpp | 6 +++++- src/frontend-common/common_host_interface.cpp | 6 +++--- 10 files changed, 43 insertions(+), 5 deletions(-) create mode 100644 src/duckstation-qt/resources/icons/process-stop.png create mode 100644 src/duckstation-qt/resources/icons/process-stop@2x.png diff --git a/android/app/src/cpp/android_host_interface.cpp b/android/app/src/cpp/android_host_interface.cpp index 21c1a92cd..f422ff3be 100644 --- a/android/app/src/cpp/android_host_interface.cpp +++ b/android/app/src/cpp/android_host_interface.cpp @@ -374,6 +374,10 @@ void AndroidHostInterface::EmulationThreadEntryPoint(jobject emulation_activity, EmulationThreadLoop(); thread_env->CallVoidMethod(m_emulation_activity_object, s_EmulationActivity_method_onEmulationStopped); + + if (g_settings.save_state_on_exit) + SaveResumeSaveState(); + PowerOffSystem(); DestroyImGuiContext(); thread_env->DeleteGlobalRef(m_emulation_activity_object); diff --git a/src/duckstation-qt/mainwindow.cpp b/src/duckstation-qt/mainwindow.cpp index 693abc27c..247441f77 100644 --- a/src/duckstation-qt/mainwindow.cpp +++ b/src/duckstation-qt/mainwindow.cpp @@ -810,6 +810,7 @@ void MainWindow::updateEmulationActions(bool starting, bool running) m_ui.actionResumeLastState->setDisabled(starting || running); m_ui.actionPowerOff->setDisabled(starting || !running); + m_ui.actionPowerOffWithoutSaving->setDisabled(starting || !running); m_ui.actionReset->setDisabled(starting || !running); m_ui.actionPause->setDisabled(starting || !running); m_ui.actionChangeDisc->setDisabled(starting || !running); @@ -926,6 +927,8 @@ void MainWindow::connectSignals() connect(m_ui.actionAddGameDirectory, &QAction::triggered, [this]() { getSettingsDialog()->getGameListSettingsWidget()->addSearchDirectory(this); }); connect(m_ui.actionPowerOff, &QAction::triggered, m_host_interface, &QtHostInterface::powerOffSystem); + connect(m_ui.actionPowerOffWithoutSaving, &QAction::triggered, m_host_interface, + &QtHostInterface::powerOffSystemWithoutSaving); connect(m_ui.actionReset, &QAction::triggered, m_host_interface, &QtHostInterface::resetSystem); connect(m_ui.actionPause, &QAction::toggled, [this](bool active) { m_host_interface->pauseSystem(active); }); connect(m_ui.actionScreenshot, &QAction::triggered, m_host_interface, &QtHostInterface::saveScreenshot); diff --git a/src/duckstation-qt/mainwindow.ui b/src/duckstation-qt/mainwindow.ui index b1eba0743..2edf3b0e7 100644 --- a/src/duckstation-qt/mainwindow.ui +++ b/src/duckstation-qt/mainwindow.ui @@ -87,6 +87,7 @@ + @@ -177,7 +178,7 @@ - + @@ -790,6 +791,15 @@ Open Data Directory... + + + + :/icons/process-stop.png:/icons/process-stop.png + + + Power Off &Without Saving + + diff --git a/src/duckstation-qt/qthostinterface.cpp b/src/duckstation-qt/qthostinterface.cpp index 7a0a5bc3a..1d26202d2 100644 --- a/src/duckstation-qt/qthostinterface.cpp +++ b/src/duckstation-qt/qthostinterface.cpp @@ -808,6 +808,20 @@ void QtHostInterface::powerOffSystem() return; } + if (g_settings.save_state_on_exit) + SaveResumeSaveState(); + + PowerOffSystem(); +} + +void QtHostInterface::powerOffSystemWithoutSaving() +{ + if (!isOnWorkerThread()) + { + QMetaObject::invokeMethod(this, "powerOffSystemWithoutSaving", Qt::QueuedConnection); + return; + } + PowerOffSystem(); } diff --git a/src/duckstation-qt/qthostinterface.h b/src/duckstation-qt/qthostinterface.h index 383bb33f4..19a9f7383 100644 --- a/src/duckstation-qt/qthostinterface.h +++ b/src/duckstation-qt/qthostinterface.h @@ -154,6 +154,7 @@ public Q_SLOTS: void resumeSystemFromState(const QString& filename, bool boot_on_failure); void resumeSystemFromMostRecentState(); void powerOffSystem(); + void powerOffSystemWithoutSaving(); void synchronousPowerOffSystem(); void resetSystem(); void pauseSystem(bool paused, bool wait_until_paused = false); diff --git a/src/duckstation-qt/resources/icons/process-stop.png b/src/duckstation-qt/resources/icons/process-stop.png new file mode 100644 index 0000000000000000000000000000000000000000..290a46d5b59393518c73a48c69b38cd885ca8887 GIT binary patch literal 2054 zcmV+h2>JJkP)004R>004l5008;`004mK004C`008P>0026e000+ooVrmw00006 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/preferences-desktop-keyboard-shortcuts@2x.png icons/preferences-system.png icons/preferences-system@2x.png + icons/process-stop.png + icons/process-stop@2x.png icons/software-update-available.png icons/software-update-available@2x.png icons/star-0.png diff --git a/src/duckstation-sdl/sdl_host_interface.cpp b/src/duckstation-sdl/sdl_host_interface.cpp index 0a4ab44fa..5de776675 100644 --- a/src/duckstation-sdl/sdl_host_interface.cpp +++ b/src/duckstation-sdl/sdl_host_interface.cpp @@ -673,7 +673,11 @@ void SDLHostInterface::DrawMainMenuBar() if (ImGui::MenuItem("Power Off", nullptr, false, system_enabled)) { - RunLater([this]() { DestroySystem(); }); + RunLater([this]() { + if (g_settings.save_state_on_exit) + SaveResumeSaveState(); + PowerOffSystem(); + }); ClearImGuiFocus(); } diff --git a/src/frontend-common/common_host_interface.cpp b/src/frontend-common/common_host_interface.cpp index 1666ff926..7696ffe68 100644 --- a/src/frontend-common/common_host_interface.cpp +++ b/src/frontend-common/common_host_interface.cpp @@ -174,9 +174,6 @@ void CommonHostInterface::PowerOffSystem() if (System::IsShutdown()) return; - if (g_settings.save_state_on_exit) - SaveResumeSaveState(); - HostInterface::PowerOffSystem(); if (InBatchMode()) @@ -1489,6 +1486,9 @@ void CommonHostInterface::RegisterGeneralHotkeys() } } + if (g_settings.save_state_on_exit) + SaveResumeSaveState(); + PowerOffSystem(); } });