From 4d2c50cf2f7501afd47ebd11c27854f6041567a7 Mon Sep 17 00:00:00 2001 From: pineappleEA Date: Wed, 22 Dec 2021 10:32:56 +0100 Subject: [PATCH] early-access version 2335 --- CMakeLists.txt | 2 +- README.md | 2 +- src/yuzu/CMakeLists.txt | 3 +++ src/yuzu/main.cpp | 50 +++++++++++++++++++++++++++++++++++++++++ src/yuzu/main.h | 9 ++++++++ 5 files changed, 64 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 7d9056aa3..d1ad55c9c 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -249,7 +249,7 @@ if(ENABLE_QT) # Check for system Qt on Linux, fallback to bundled Qt if (${CMAKE_SYSTEM_NAME} STREQUAL "Linux") if (NOT YUZU_USE_BUNDLED_QT) - find_package(Qt5 ${QT_VERSION} COMPONENTS Widgets) + find_package(Qt5 ${QT_VERSION} COMPONENTS Widgets DBus) endif() if (NOT Qt5_FOUND OR YUZU_USE_BUNDLED_QT) # Check for dependencies, then enable bundled Qt download diff --git a/README.md b/README.md index 87f209f69..23cae8c23 100755 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ yuzu emulator early access ============= -This is the source code for early-access 2334. +This is the source code for early-access 2335. ## Legal Notice diff --git a/src/yuzu/CMakeLists.txt b/src/yuzu/CMakeLists.txt index 732e8c276..30902101d 100755 --- a/src/yuzu/CMakeLists.txt +++ b/src/yuzu/CMakeLists.txt @@ -251,6 +251,9 @@ target_include_directories(yuzu PRIVATE ../../externals/Vulkan-Headers/include) if (NOT WIN32) target_include_directories(yuzu PRIVATE ${Qt5Gui_PRIVATE_INCLUDE_DIRS}) endif() +if (${CMAKE_SYSTEM_NAME} STREQUAL "Linux") + target_link_libraries(yuzu PRIVATE Qt5::DBus) +endif() target_compile_definitions(yuzu PRIVATE # Use QStringBuilder for string concatenation to reduce diff --git a/src/yuzu/main.cpp b/src/yuzu/main.cpp index a7271e075..ea8fe6e9e 100755 --- a/src/yuzu/main.cpp +++ b/src/yuzu/main.cpp @@ -1236,11 +1236,56 @@ void GMainWindow::OnDisplayTitleBars(bool show) { } } +#ifdef __linux__ +static std::optional HoldWakeLockLinux(u32 window_id = 0) { + if (!QDBusConnection::sessionBus().isConnected()) { + return {}; + } + // reference: https://flatpak.github.io/xdg-desktop-portal/#gdbus-org.freedesktop.portal.Inhibit + QDBusInterface xdp(QString::fromLatin1("org.freedesktop.portal.Desktop"), + QString::fromLatin1("/org/freedesktop/portal/desktop"), + QString::fromLatin1("org.freedesktop.portal.Inhibit")); + if (!xdp.isValid()) { + LOG_WARNING(Frontend, "Couldn't connect to XDP D-Bus endpoint"); + return {}; + } + QVariantMap options = {}; + options.insert(QString::fromLatin1("reason"), + QCoreApplication::translate("GMainWindow", "yuzu is emulating a game")); + // 0x4: Suspend lock; 0x8: Idle lock + QDBusReply reply = + xdp.call(QString::fromLatin1("Inhibit"), + QString::fromLatin1("x11:") + QString::number(window_id, 16), 12U, options); + + if (reply.isValid()) { + return reply.value(); + } + LOG_WARNING(Frontend, "Couldn't read Inhibit reply from XDP: {}", + reply.error().message().toStdString()); + return {}; +} + +static void ReleaseWakeLockLinux(QDBusObjectPath lock) { + if (!QDBusConnection::sessionBus().isConnected()) { + return; + } + QDBusInterface unlocker(QString::fromLatin1("org.freedesktop.portal.Desktop"), lock.path(), + QString::fromLatin1("org.freedesktop.portal.Request")); + unlocker.call(QString::fromLatin1("Close")); +} +#endif // __linux__ + void GMainWindow::PreventOSSleep() { #ifdef _WIN32 SetThreadExecutionState(ES_CONTINUOUS | ES_SYSTEM_REQUIRED | ES_DISPLAY_REQUIRED); #elif defined(HAVE_SDL2) SDL_DisableScreenSaver(); +#ifdef __linux__ + auto reply = HoldWakeLockLinux(winId()); + if (reply) { + wake_lock = std::move(reply.value()); + } +#endif #endif } @@ -1249,6 +1294,11 @@ void GMainWindow::AllowOSSleep() { SetThreadExecutionState(ES_CONTINUOUS); #elif defined(HAVE_SDL2) SDL_EnableScreenSaver(); +#ifdef __linux__ + if (!wake_lock.path().isEmpty()) { + ReleaseWakeLockLinux(wake_lock); + } +#endif #endif } diff --git a/src/yuzu/main.h b/src/yuzu/main.h index 0fd41ed4f..7870bb963 100755 --- a/src/yuzu/main.h +++ b/src/yuzu/main.h @@ -17,6 +17,12 @@ #include "yuzu/compatibility_list.h" #include "yuzu/hotkeys.h" +#ifdef __linux__ +#include +#include +#include +#endif + class Config; class EmuThread; class GameList; @@ -394,6 +400,9 @@ private: // Applets QtSoftwareKeyboardDialog* software_keyboard = nullptr; +#ifdef __linux__ + QDBusObjectPath wake_lock{}; +#endif protected: void dropEvent(QDropEvent* event) override;