浏览代码

UI: Add HighContrastEnabled implementation for Linux

tytan652 1 年之前
父节点
当前提交
41ba8bdfdd
共有 4 个文件被更改,包括 51 次插入6 次删除
  1. 2 2
      UI/cmake/legacy.cmake
  2. 1 1
      UI/cmake/os-linux.cmake
  3. 1 1
      UI/cmake/ui-qt.cmake
  4. 47 2
      UI/platform-x11.cpp

+ 2 - 2
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}"
                                          "$<$<BOOL:${LINUX_PORTABLE}>:LINUX_PORTABLE>")

+ 1 - 1
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)

+ 1 - 1
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)

+ 47 - 2
UI/platform-x11.cpp

@@ -21,6 +21,9 @@
 
 #include <QGuiApplication>
 #include <QScreen>
+#include <QDBusConnection>
+#include <QDBusMessage>
+#include <QDBusReply>
 
 #include <unistd.h>
 #include <sstream>
@@ -272,6 +275,48 @@ void TaskbarOverlaySetStatus(TaskbarOverlayStatus) {}
 
 bool HighContrastEnabled()
 {
-	// Note implemented yet
-	return false;
+	QDBusReply<QVariant> 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;
 }