Sfoglia il codice sorgente

Stop emulation when render window is closed

LittleWhite 11 anni fa
parent
commit
86e29ac281
3 ha cambiato i file con 15 aggiunte e 0 eliminazioni
  1. 5 0
      src/citra_qt/bootmanager.cpp
  2. 6 0
      src/citra_qt/bootmanager.h
  3. 4 0
      src/citra_qt/main.cpp

+ 5 - 0
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});

+ 6 - 0
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<unsigned,unsigned>& minimal_size) override;
 

+ 4 - 0
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"));