diff --git a/src/citra_qt/bootmanager.cpp b/src/citra_qt/bootmanager.cpp index 9aec165069..2aab343f29 100644 --- a/src/citra_qt/bootmanager.cpp +++ b/src/citra_qt/bootmanager.cpp @@ -223,6 +223,11 @@ QByteArray GRenderWindow::saveGeometry() return geometry; } +void GRenderWindow::closeEvent(QCloseEvent* event) { + emit Closed(); + QWidget::closeEvent(event); +} + void GRenderWindow::keyPressEvent(QKeyEvent* event) { this->KeyPressed({event->key(), keyboard_id}); diff --git a/src/citra_qt/bootmanager.h b/src/citra_qt/bootmanager.h index 1a1e0e6a50..d0fe397af6 100644 --- a/src/citra_qt/bootmanager.h +++ b/src/citra_qt/bootmanager.h @@ -110,6 +110,8 @@ public: void restoreGeometry(const QByteArray& geometry); // overridden QByteArray saveGeometry(); // overridden + void closeEvent(QCloseEvent* event) override; + void keyPressEvent(QKeyEvent* event) override; void keyReleaseEvent(QKeyEvent* event) override; @@ -129,6 +131,10 @@ public slots: void OnEmulationStarting(EmuThread* emu_thread); void OnEmulationStopping(); +signals: + /// Emitted when the window is closed + void Closed(); + private: void OnMinimalClientAreaChangeRequest(const std::pair& minimal_size) override; diff --git a/src/citra_qt/main.cpp b/src/citra_qt/main.cpp index 11813a2a8a..8dadb44efb 100644 --- a/src/citra_qt/main.cpp +++ b/src/citra_qt/main.cpp @@ -251,6 +251,7 @@ void GMainWindow::BootGame(const std::string& filename) { render_window->moveContext(); emu_thread->start(); + connect(render_window, SIGNAL(Closed()), this, SLOT(OnStopGame())); // BlockingQueuedConnection is important here, it makes sure we've finished refreshing our views before the CPU continues connect(emu_thread.get(), SIGNAL(DebugModeEntered()), disasmWidget, SLOT(OnDebugModeEntered()), Qt::BlockingQueuedConnection); connect(emu_thread.get(), SIGNAL(DebugModeEntered()), registersWidget, SLOT(OnDebugModeEntered()), Qt::BlockingQueuedConnection); @@ -283,6 +284,9 @@ void GMainWindow::ShutdownGame() { emu_thread->wait(); emu_thread = nullptr; + // The emulation is stopped, so closing the window or not does not matter anymore + disconnect(render_window, SIGNAL(Closed()), this, SLOT(OnStopGame())); + // Update the GUI ui.action_Start->setEnabled(false); ui.action_Start->setText(tr("Start"));