diff --git a/src/citra_qt/bootmanager.cpp b/src/citra_qt/bootmanager.cpp index 6107074116..7a1360d34f 100644 --- a/src/citra_qt/bootmanager.cpp +++ b/src/citra_qt/bootmanager.cpp @@ -219,6 +219,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 5b52a0a58d..dc422358e9 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 d2c7459a44..01841b33c2 100644 --- a/src/citra_qt/main.cpp +++ b/src/citra_qt/main.cpp @@ -252,6 +252,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); @@ -284,6 +285,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"));