From 6be223d84a4f319f82d07b9569541934cc1f66d9 Mon Sep 17 00:00:00 2001 From: Vicki Pfau <vi@endrift.com> Date: Sun, 12 Jan 2025 06:14:10 -0800 Subject: [PATCH] Qt: Defer destroying the CoreController until after the CoreController::stopping slots finish --- src/platform/qt/Window.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/platform/qt/Window.cpp b/src/platform/qt/Window.cpp index 1be4a998c..a224c3ba4 100644 --- a/src/platform/qt/Window.cpp +++ b/src/platform/qt/Window.cpp @@ -972,7 +972,12 @@ void Window::gameStopped() { #endif } - m_controller.reset(); + std::shared_ptr<CoreController> controller; + m_controller.swap(controller); + QTimer::singleShot(0, this, [controller]() { + // Destroy the controller after everything else has cleaned up + Q_UNUSED(controller); + }); detachWidget(); updateTitle(); @@ -2155,11 +2160,6 @@ void Window::setController(CoreController* controller, const QString& fname) { connect(m_controller.get(), &CoreController::started, this, &Window::gameStarted); connect(m_controller.get(), &CoreController::started, GBAApp::app(), &GBAApp::suspendScreensaver); connect(m_controller.get(), &CoreController::stopping, this, &Window::gameStopped); - { - connect(m_controller.get(), &CoreController::stopping, [this]() { - m_controller.reset(); - }); - } connect(m_controller.get(), &CoreController::stopping, GBAApp::app(), &GBAApp::resumeScreensaver); connect(m_controller.get(), &CoreController::paused, this, &Window::updateFrame);