Просмотр исходного кода

yuzu: main: Register a callback for Exit

Morph 4 лет назад
Родитель
Сommit
282bdfd1bf
4 измененных файлов с 17 добавлено и 0 удалено
  1. 5 0
      src/yuzu/bootmanager.cpp
  2. 4 0
      src/yuzu/bootmanager.h
  3. 7 0
      src/yuzu/main.cpp
  4. 1 0
      src/yuzu/main.h

+ 5 - 0
src/yuzu/bootmanager.cpp

@@ -302,12 +302,17 @@ GRenderWindow::GRenderWindow(GMainWindow* parent, EmuThread* emu_thread_,
     connect(this, &GRenderWindow::FirstFrameDisplayed, parent, &GMainWindow::OnLoadComplete);
     connect(this, &GRenderWindow::ExecuteProgramSignal, parent, &GMainWindow::OnExecuteProgram,
             Qt::QueuedConnection);
+    connect(this, &GRenderWindow::ExitSignal, parent, &GMainWindow::OnExit, Qt::QueuedConnection);
 }
 
 void GRenderWindow::ExecuteProgram(std::size_t program_index) {
     emit ExecuteProgramSignal(program_index);
 }
 
+void GRenderWindow::Exit() {
+    emit ExitSignal();
+}
+
 GRenderWindow::~GRenderWindow() {
     input_subsystem->Shutdown();
 }

+ 4 - 0
src/yuzu/bootmanager.h

@@ -181,6 +181,9 @@ public:
      */
     void ExecuteProgram(std::size_t program_index);
 
+    /// Instructs the window to exit the application.
+    void Exit();
+
 public slots:
     void OnEmulationStarting(EmuThread* emu_thread);
     void OnEmulationStopping();
@@ -191,6 +194,7 @@ signals:
     void Closed();
     void FirstFrameDisplayed();
     void ExecuteProgramSignal(std::size_t program_index);
+    void ExitSignal();
     void MouseActivity();
 
 private:

+ 7 - 0
src/yuzu/main.cpp

@@ -1384,6 +1384,9 @@ void GMainWindow::BootGame(const QString& filename, u64 program_id, std::size_t
     system.RegisterExecuteProgramCallback(
         [this](std::size_t program_index) { render_window->ExecuteProgram(program_index); });
 
+    // Register an Exit callback such that Core can exit the currently running application.
+    system.RegisterExitCallback([this]() { render_window->Exit(); });
+
     connect(render_window, &GRenderWindow::Closed, this, &GMainWindow::OnStopGame);
     connect(render_window, &GRenderWindow::MouseActivity, this, &GMainWindow::OnMouseActivity);
     // BlockingQueuedConnection is important here, it makes sure we've finished refreshing our views
@@ -2469,6 +2472,10 @@ void GMainWindow::OnExecuteProgram(std::size_t program_index) {
     BootGame(last_filename_booted, 0, program_index);
 }
 
+void GMainWindow::OnExit() {
+    OnStopGame();
+}
+
 void GMainWindow::ErrorDisplayDisplayError(QString error_code, QString error_text) {
     OverlayDialog dialog(render_window, Core::System::GetInstance(), error_code, error_text,
                          QString{}, tr("OK"), Qt::AlignLeft | Qt::AlignVCenter);

+ 1 - 0
src/yuzu/main.h

@@ -153,6 +153,7 @@ signals:
 public slots:
     void OnLoadComplete();
     void OnExecuteProgram(std::size_t program_index);
+    void OnExit();
     void ControllerSelectorReconfigureControllers(
         const Core::Frontend::ControllerParameters& parameters);
     void SoftwareKeyboardInitialize(