From da3dc765a4b98e858a050cdea00ec3377f9850e1 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Fri, 12 Nov 2021 10:48:39 -0800 Subject: [PATCH] implement inhibiting sleep on linux during video playback Fixes #1791 --- CMakeLists.txt | 14 +++++++-- app/widget/viewer/viewerpreventsleep.cpp | 40 ++++++++++++++++++++++++ 2 files changed, 51 insertions(+), 3 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 35b402073..e8c28db2a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -81,8 +81,7 @@ list(APPEND OLIVE_LIBRARIES ${OPENEXR_LIBRARIES}) list(APPEND OLIVE_INCLUDE_DIRS ${OPENEXR_INCLUDES}) # Link Qt 5 -find_package(Qt5 5.6 REQUIRED - COMPONENTS +set(QT_LIBRARIES Core Gui Widgets @@ -90,8 +89,15 @@ find_package(Qt5 5.6 REQUIRED Svg LinguistTools Concurrent +) +if (UNIX AND NOT APPLE) + list(APPEND QT_LIBRARIES DBus) +endif() +find_package(Qt5 5.6 REQUIRED + COMPONENTS + ${QT_LIBRARIES} OPTIONAL_COMPONENTS - Network + Network ) if (NOT Qt5Network_FOUND) message(" Qt5::Network module not found, crash reporting will be disabled.") @@ -158,6 +164,8 @@ endif() if (APPLE) list(APPEND OLIVE_LIBRARIES "-framework IOKit") +elseif(UNIX) + list(APPEND OLIVE_LIBRARIES Qt5::DBus) endif() # Generate Git hash diff --git a/app/widget/viewer/viewerpreventsleep.cpp b/app/widget/viewer/viewerpreventsleep.cpp index 8de97c7c1..1d50f918d 100644 --- a/app/widget/viewer/viewerpreventsleep.cpp +++ b/app/widget/viewer/viewerpreventsleep.cpp @@ -6,12 +6,16 @@ #include #elif defined(Q_OS_MAC) #include +#elif defined(Q_OS_LINUX) +#include #endif namespace olive { #if defined(Q_OS_MAC) IOPMAssertionID assertionID = 0; +#elif defined(Q_OS_LINUX) + #endif void PreventSleep(bool on) @@ -28,6 +32,42 @@ void PreventSleep(bool on) IOPMAssertionRelease(assertionID); assertionID = 0; } +#elif defined(Q_OS_LINUX) + QDBusConnection bus = QDBusConnection::sessionBus(); + if(bus.isConnected()) { + static const QStringList sleep_services = { + QStringLiteral("org.freedesktop.ScreenSaver"), + //QStringLiteral("org.gnome.SessionManager") + }; + static const QStringList sleep_paths = { + QStringLiteral("/org/freedesktop/ScreenSaver"), + //QStringLiteral("/org/gnome/SessionManager") + }; + static QVector sleep_cookies; + + // Initialize vector to 0 + if (sleep_cookies.isEmpty()) { + sleep_cookies.resize(sleep_services.size()); + sleep_cookies.fill(0); + } + + for (int i=0; i reply; + + if (on) { + reply = interface.call(QStringLiteral("Inhibit"), QStringLiteral("Olive Video Editor"), QStringLiteral("Video Playback")); + } else { + reply = interface.call(QStringLiteral("UnInhibit"), sleep_cookies.at(i)); + } + + if (reply.isValid()) { + sleep_cookies[i] = reply.value(); + } + } + } + } #endif }