From 41ba8bdfdd02762ea72fd72dc0d05cf6357a7241 Mon Sep 17 00:00:00 2001 From: tytan652 Date: Wed, 3 Apr 2024 11:01:39 +0200 Subject: [PATCH] UI: Add HighContrastEnabled implementation for Linux --- UI/cmake/legacy.cmake | 4 ++-- UI/cmake/os-linux.cmake | 2 +- UI/cmake/ui-qt.cmake | 2 +- UI/platform-x11.cpp | 49 +++++++++++++++++++++++++++++++++++++++-- 4 files changed, 51 insertions(+), 6 deletions(-) diff --git a/UI/cmake/legacy.cmake b/UI/cmake/legacy.cmake index 650638163..806e382bc 100644 --- a/UI/cmake/legacy.cmake +++ b/UI/cmake/legacy.cmake @@ -71,7 +71,7 @@ find_package(CURL REQUIRED) add_subdirectory(frontend-plugins) add_executable(obs) -find_qt(COMPONENTS Widgets Network Svg Xml COMPONENTS_LINUX Gui) +find_qt(COMPONENTS Widgets Network Svg Xml COMPONENTS_LINUX Gui DBus) target_link_libraries(obs PRIVATE Qt::Widgets Qt::Svg Qt::Xml Qt::Network) @@ -459,7 +459,7 @@ elseif(OS_MACOS) elseif(OS_POSIX) target_sources(obs PRIVATE platform-x11.cpp) - target_link_libraries(obs PRIVATE Qt::GuiPrivate) + target_link_libraries(obs PRIVATE Qt::GuiPrivate Qt::DBus) target_compile_definitions(obs PRIVATE OBS_INSTALL_PREFIX="${OBS_INSTALL_PREFIX}" "$<$:LINUX_PORTABLE>") diff --git a/UI/cmake/os-linux.cmake b/UI/cmake/os-linux.cmake index 0646f68b7..91d9175dc 100644 --- a/UI/cmake/os-linux.cmake +++ b/UI/cmake/os-linux.cmake @@ -1,6 +1,6 @@ target_sources(obs-studio PRIVATE platform-x11.cpp) target_compile_definitions(obs-studio PRIVATE OBS_INSTALL_PREFIX="${OBS_INSTALL_PREFIX}") -target_link_libraries(obs-studio PRIVATE Qt::GuiPrivate) +target_link_libraries(obs-studio PRIVATE Qt::GuiPrivate Qt::DBus) if(TARGET OBS::python) find_package(Python REQUIRED COMPONENTS Interpreter Development) diff --git a/UI/cmake/ui-qt.cmake b/UI/cmake/ui-qt.cmake index 6108dfd81..4989d2d11 100644 --- a/UI/cmake/ui-qt.cmake +++ b/UI/cmake/ui-qt.cmake @@ -5,7 +5,7 @@ find_package(Qt6 REQUIRED Widgets Network Svg Xml) if(OS_LINUX OR OS_FREEBSD OR OS_OPENBSD) - find_package(Qt6 REQUIRED Gui) + find_package(Qt6 REQUIRED Gui DBus) endif() target_link_libraries(obs-studio PRIVATE Qt::Widgets Qt::Svg Qt::Xml Qt::Network) diff --git a/UI/platform-x11.cpp b/UI/platform-x11.cpp index a9ef1797f..7de1008e4 100644 --- a/UI/platform-x11.cpp +++ b/UI/platform-x11.cpp @@ -21,6 +21,9 @@ #include #include +#include +#include +#include #include #include @@ -272,6 +275,48 @@ void TaskbarOverlaySetStatus(TaskbarOverlayStatus) {} bool HighContrastEnabled() { - // Note implemented yet - return false; + QDBusReply reply; + QDBusMessage msgXdpSettingsVersion = QDBusMessage::createMethodCall( + "org.freedesktop.portal.Desktop", + "/org/freedesktop/portal/desktop", + "org.freedesktop.DBus.Properties", "Get"); + msgXdpSettingsVersion << "org.freedesktop.portal.Settings" + << "version"; + + reply = QDBusConnection::sessionBus().call(msgXdpSettingsVersion); + + if (!reply.isValid()) { + blog(LOG_WARNING, + "Get on org.freedesktop.portal.Settings returned an invalid reply"); + return false; + } + + /* NOTE: org.freedesktop.portal.Settings got its contrast settings after + * the ReadOne method. So assumes that if ReadOne is not available, contrast + * isn't available either. */ + if (uint32_t version = reply.value().toUInt() < 2) { + blog(LOG_WARNING, + "org.freedesktop.portal.Settings version %u does not support ReadOne", + version); + return false; + } + + /* NOTE: If contrast is not available if will return 0 (false). */ + QDBusMessage msgXdpSettingsContrast = QDBusMessage::createMethodCall( + "org.freedesktop.portal.Desktop", + "/org/freedesktop/portal/desktop", + "org.freedesktop.portal.Settings", "ReadOne"); + + msgXdpSettingsContrast << "org.freedesktop.appearance" + << "contrast"; + + reply = QDBusConnection::sessionBus().call(msgXdpSettingsContrast); + + if (!reply.isValid()) { + blog(LOG_WARNING, + "ReadOne on org.freedesktop.portal.Settings returned an invalid reply"); + return false; + } + + return reply.value().toUInt() != 0; }