From b7642cff361176161e848b004143da4777d0971d Mon Sep 17 00:00:00 2001 From: snek Date: Wed, 27 Jul 2022 16:46:03 -0700 Subject: implement pause on system suspend (#8585) --- src/yuzu/main.cpp | 39 +++++++++++++++++++++++++++++++++++++++ src/yuzu/main.h | 5 ++++- 2 files changed, 43 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/yuzu/main.cpp b/src/yuzu/main.cpp index ef91ef19c..e8a57f4b4 100644 --- a/src/yuzu/main.cpp +++ b/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 HoldWakeLockLinux(u32 window_id = 0) { if (!QDBusConnection::sessionBus().isConnected()) { diff --git a/src/yuzu/main.h b/src/yuzu/main.h index 509bb91df..23b67a14e 100644 --- a/src/yuzu/main.h +++ b/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 discord_rpc; std::shared_ptr input_subsystem; + MultiplayerState* multiplayer_state = nullptr; + GRenderWindow* render_window; GameList* game_list; LoadingScreen* loading_screen; -- cgit v1.2.3