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);