Forráskód Böngészése

implement pause on system suspend (#8585)

snek 4 éve
szülő
commit
b7642cff36
2 módosított fájl, 43 hozzáadás és 1 törlés
  1. 39 0
      src/yuzu/main.cpp
  2. 4 1
      src/yuzu/main.h

+ 39 - 0
src/yuzu/main.cpp

@@ -386,6 +386,8 @@ GMainWindow::GMainWindow(bool has_broken_vulkan)
     SDL_EnableScreenSaver();
 #endif
 
+    SetupPrepareForSleep();
+
     Common::Log::Start();
 
     QStringList args = QApplication::arguments();
@@ -1327,6 +1329,43 @@ void GMainWindow::OnDisplayTitleBars(bool show) {
     }
 }
 
+void GMainWindow::SetupPrepareForSleep() {
+#ifdef __linux__
+    auto bus = QDBusConnection::systemBus();
+    if (bus.isConnected()) {
+        const bool success = bus.connect(
+            QStringLiteral("org.freedesktop.login1"), QStringLiteral("/org/freedesktop/login1"),
+            QStringLiteral("org.freedesktop.login1.Manager"), QStringLiteral("PrepareForSleep"),
+            QStringLiteral("b"), this, SLOT(OnPrepareForSleep(bool)));
+
+        if (!success) {
+            LOG_WARNING(Frontend, "Couldn't register PrepareForSleep signal");
+        }
+    } else {
+        LOG_WARNING(Frontend, "QDBusConnection system bus is not connected");
+    }
+#endif // __linux__
+}
+
+void GMainWindow::OnPrepareForSleep(bool prepare_sleep) {
+    if (emu_thread == nullptr) {
+        return;
+    }
+
+    if (prepare_sleep) {
+        if (emu_thread->IsRunning()) {
+            auto_paused = true;
+            OnPauseGame();
+        }
+    } else {
+        if (!emu_thread->IsRunning() && auto_paused) {
+            auto_paused = false;
+            RequestGameResume();
+            OnStartGame();
+        }
+    }
+}
+
 #ifdef __linux__
 static std::optional<QDBusObjectPath> HoldWakeLockLinux(u32 window_id = 0) {
     if (!QDBusConnection::sessionBus().isConnected()) {

+ 4 - 1
src/yuzu/main.h

@@ -204,7 +204,7 @@ private:
     void ConnectMenuEvents();
     void UpdateMenuState();
 
-    MultiplayerState* multiplayer_state = nullptr;
+    void SetupPrepareForSleep();
 
     void PreventOSSleep();
     void AllowOSSleep();
@@ -265,6 +265,7 @@ private slots:
     void OnPauseGame();
     void OnPauseContinueGame();
     void OnStopGame();
+    void OnPrepareForSleep(bool prepare_sleep);
     void OnMenuReportCompatibility();
     void OnOpenModsPage();
     void OnOpenQuickstartGuide();
@@ -355,6 +356,8 @@ private:
     std::unique_ptr<DiscordRPC::DiscordInterface> discord_rpc;
     std::shared_ptr<InputCommon::InputSubsystem> input_subsystem;
 
+    MultiplayerState* multiplayer_state = nullptr;
+
     GRenderWindow* render_window;
     GameList* game_list;
     LoadingScreen* loading_screen;