From b655e4aa47a01d9c39254e0f10fe586d979faabf Mon Sep 17 00:00:00 2001 From: Megamouse Date: Fri, 18 Dec 2020 12:40:25 +0100 Subject: [PATCH] Emu: implement on_exit callback --- rpcs3/Emu/System.cpp | 10 +++++----- rpcs3/Emu/System.h | 2 +- rpcs3/headless_application.cpp | 7 ++++++- rpcs3/rpcs3qt/gui_application.cpp | 7 ++++++- 4 files changed, 18 insertions(+), 8 deletions(-) diff --git a/rpcs3/Emu/System.cpp b/rpcs3/Emu/System.cpp index b571a16a26..6ef89cf19a 100644 --- a/rpcs3/Emu/System.cpp +++ b/rpcs3/Emu/System.cpp @@ -1979,13 +1979,13 @@ bool Emulator::Quit(bool force_quit) { m_force_boot = false; - // Deinitialize object manager to prevent any hanging objects at program exit - if (force_quit) + // The callback is only used if we actually quit RPCS3 + const auto on_exit = []() { + // Deinitialize object manager to prevent any hanging objects at program exit *g_fxo = {}; - } - - return GetCallbacks().exit(force_quit); + }; + return GetCallbacks().try_to_quit(force_quit, on_exit); } std::string Emulator::GetFormattedTitle(double fps) const diff --git a/rpcs3/Emu/System.h b/rpcs3/Emu/System.h index 1953f7134b..449b31b350 100644 --- a/rpcs3/Emu/System.h +++ b/rpcs3/Emu/System.h @@ -42,7 +42,7 @@ struct EmuCallbacks std::function on_stop; std::function on_ready; std::function on_missing_fw; - std::function exit; // (force_quit) close RPCS3 + std::function)> try_to_quit; // (force_quit, on_exit) Try to close RPCS3 std::function handle_taskbar_progress; // (type, value) type: 0 for reset, 1 for increment, 2 for set_limit std::function init_kb_handler; std::function init_mouse_handler; diff --git a/rpcs3/headless_application.cpp b/rpcs3/headless_application.cpp index f2239eab00..a0eee215d6 100644 --- a/rpcs3/headless_application.cpp +++ b/rpcs3/headless_application.cpp @@ -39,10 +39,15 @@ void headless_application::InitializeCallbacks() { EmuCallbacks callbacks = CreateCallbacks(); - callbacks.exit = [this](bool force_quit) -> bool + callbacks.try_to_quit = [this](bool force_quit, std::function on_exit) -> bool { if (force_quit) { + if (on_exit) + { + on_exit(); + } + quit(); return true; } diff --git a/rpcs3/rpcs3qt/gui_application.cpp b/rpcs3/rpcs3qt/gui_application.cpp index 95ee00bf7a..01b242666a 100644 --- a/rpcs3/rpcs3qt/gui_application.cpp +++ b/rpcs3/rpcs3qt/gui_application.cpp @@ -283,11 +283,16 @@ void gui_application::InitializeCallbacks() { EmuCallbacks callbacks = CreateCallbacks(); - callbacks.exit = [this](bool force_quit) -> bool + callbacks.try_to_quit = [this](bool force_quit, std::function on_exit) -> bool { // Close rpcs3 if closed in no-gui mode if (force_quit || !m_main_window) { + if (on_exit) + { + on_exit(); + } + if (m_main_window) { // Close main window in order to save its window state