From 47f85dc45385e0e4ba739e988d69a0ceb043c468 Mon Sep 17 00:00:00 2001
From: Connor McLaughlin <stenzek@gmail.com>
Date: Mon, 16 Aug 2021 14:06:16 +1000
Subject: [PATCH] Qt: Add function to recreate the main window

---
 src/duckstation-qt/main.cpp            |  3 +--
 src/duckstation-qt/mainwindow.cpp      | 16 +++++++++++++++-
 src/duckstation-qt/mainwindow.h        |  1 +
 src/duckstation-qt/qthostinterface.cpp |  2 ++
 4 files changed, 19 insertions(+), 3 deletions(-)

diff --git a/src/duckstation-qt/main.cpp b/src/duckstation-qt/main.cpp
index 1d6ef5794..20a869519 100644
--- a/src/duckstation-qt/main.cpp
+++ b/src/duckstation-qt/main.cpp
@@ -84,7 +84,7 @@ int main(int argc, char* argv[])
   if (!ParseCommandLineParameters(app, host_interface.get(), &boot_params))
     return EXIT_FAILURE;
 
-  std::unique_ptr<MainWindow> window = std::make_unique<MainWindow>(host_interface.get());
+  MainWindow* window = new MainWindow(host_interface.get());
 
   if (!host_interface->Initialize())
   {
@@ -112,7 +112,6 @@ int main(int argc, char* argv[])
 
   int result = app.exec();
 
-  window.reset();
   host_interface->Shutdown();
   return result;
 }
diff --git a/src/duckstation-qt/mainwindow.cpp b/src/duckstation-qt/mainwindow.cpp
index 0e4d77784..f8d48ff56 100644
--- a/src/duckstation-qt/mainwindow.cpp
+++ b/src/duckstation-qt/mainwindow.cpp
@@ -82,7 +82,8 @@ MainWindow::MainWindow(QtHostInterface* host_interface)
 MainWindow::~MainWindow()
 {
   Assert(!m_display_widget);
-  m_host_interface->setMainWindow(nullptr);
+  if (m_host_interface->getMainWindow() == this)
+    m_host_interface->setMainWindow(nullptr);
 
   Assert(!m_debugger_window);
 }
@@ -562,6 +563,19 @@ std::string MainWindow::getDeviceDiscPath(const QString& title)
   return ret;
 }
 
+void MainWindow::recreate()
+{
+  if (m_emulation_running)
+    m_host_interface->synchronousPowerOffSystem();
+
+  close();
+  m_host_interface->setMainWindow(nullptr);
+
+  MainWindow* new_main_window = new MainWindow(m_host_interface);
+  new_main_window->initializeAndShow();
+  deleteLater();
+}
+
 void MainWindow::onStartDiscActionTriggered()
 {
   std::string path(getDeviceDiscPath(tr("Start Disc")));
diff --git a/src/duckstation-qt/mainwindow.h b/src/duckstation-qt/mainwindow.h
index 389fa72f3..7fc4a5685 100644
--- a/src/duckstation-qt/mainwindow.h
+++ b/src/duckstation-qt/mainwindow.h
@@ -150,6 +150,7 @@ private:
   void updateMenuSelectedTheme();
   void ensureGameListLoaded();
   std::string getDeviceDiscPath(const QString& title);
+  void recreate();
 
   Ui::MainWindow m_ui;
 
diff --git a/src/duckstation-qt/qthostinterface.cpp b/src/duckstation-qt/qthostinterface.cpp
index 892bf79d7..5b1fb4a63 100644
--- a/src/duckstation-qt/qthostinterface.cpp
+++ b/src/duckstation-qt/qthostinterface.cpp
@@ -99,6 +99,8 @@ bool QtHostInterface::Initialize()
 void QtHostInterface::Shutdown()
 {
   stopThread();
+
+  delete m_main_window;
 }
 
 bool QtHostInterface::initializeOnThread()