From c9fae1fb3f8e8a820fd480ce227d7fabf87bd045 Mon Sep 17 00:00:00 2001
From: David Rosca <nowrep@gmail.com>
Date: Tue, 26 Jun 2018 10:56:04 +0200
Subject: [PATCH] Make GConf optional dependency

When building without GConf, Advanded Output Configuration will be hidden in KCM.

BUG: 386665
FIXED-IN: 5.13.4

Differential Revision: https://phabricator.kde.org/D13734
---
 CMakeLists.txt                           |  9 ++++--
 config.h.cmake                           |  3 ++
 src/CMakeLists.txt                       | 18 ++++++++----
 src/kcm/package/contents/ui/Advanced.qml |  5 +++-
 src/modulemanager.cpp                    | 47 ++++++++++++++++++++++++++------
 src/modulemanager.h                      |  3 ++
 6 files changed, 68 insertions(+), 17 deletions(-)
 create mode 100644 config.h.cmake

diff --git a/CMakeLists.txt b/CMakeLists.txt
index e494ced..2505696 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -19,8 +19,11 @@ include(KDECompilerSettings NO_POLICY_SCOPE)
 include(ECMOptionalAddSubdirectory)
 
 include(FindPkgConfig)
-pkg_check_modules(GCONF REQUIRED gconf-2.0)
-pkg_check_modules(GOBJECT REQUIRED gobject-2.0)
+pkg_check_modules(GCONF gconf-2.0)
+pkg_check_modules(GOBJECT gobject-2.0)
+if (GCONF_FOUND AND GOBJECT_FOUND)
+    set(HAVE_GCONF TRUE)
+endif()
 
 find_package(Qt5 ${QT_MIN_VERSION} REQUIRED COMPONENTS
     Core
@@ -41,6 +44,8 @@ find_package(PulseAudio 5.0.0 REQUIRED)
 find_package(Canberra REQUIRED)
 find_package(GLIB2 REQUIRED)
 
+configure_file(config.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/config.h)
+
 add_subdirectory(applet)
 add_subdirectory(src)
 add_subdirectory(data)
diff --git a/config.h.cmake b/config.h.cmake
new file mode 100644
index 0000000..1643e50
--- /dev/null
+++ b/config.h.cmake
@@ -0,0 +1,3 @@
+/* config.h.  Generated by cmake from config.h.cmake  */
+
+#cmakedefine01 HAVE_GCONF
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index e6cddfc..09d108c 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -1,5 +1,4 @@
-include_directories(${PULSEAUDIO_INCLUDE_DIR} ${GLIB2_INCLUDE_DIR}     ${GCONF_INCLUDE_DIRS}
-    ${GOBJECT_INCLUDE_DIRS})
+include_directories(${PULSEAUDIO_INCLUDE_DIR} ${GLIB2_INCLUDE_DIR})
 
 set(cpp_SRCS
     card.cpp
@@ -15,7 +14,6 @@ set(cpp_SRCS
     sink.cpp
     sinkinput.cpp
     modulemanager.cpp
-    gconfitem.cpp
     source.cpp
     sourceoutput.cpp
     stream.cpp
@@ -38,6 +36,11 @@ set(qml_SRCS
 set_property(SOURCE qml/dbus/osdService.xml APPEND PROPERTY CLASSNAME OsdServiceInterface)
 qt5_add_dbus_interface(dbus_SRCS qml/dbus/osdService.xml osdservice)
 
+if (HAVE_GCONF)
+    include_directories(${GCONF_INCLUDE_DIRS} ${GOBJECT_INCLUDE_DIRS})
+    set(cpp_SRCS ${cpp_SRCS} gconfitem.cpp)
+endif()
+
 add_library(plasma-volume-declarative SHARED ${dbus_SRCS} ${cpp_SRCS} ${qml_SRCS})
 target_link_libraries(plasma-volume-declarative
     Qt5::Core
@@ -47,11 +50,16 @@ target_link_libraries(plasma-volume-declarative
     KF5::GlobalAccel
     ${PULSEAUDIO_LIBRARY}
     ${PULSEAUDIO_MAINLOOP_LIBRARY}
-    ${GCONF_LDFLAGS}
-    ${GOBJECT_LDFLAGS}
     ${CANBERRA_LIBRARIES}
 )
 
+if (HAVE_GCONF)
+    target_link_libraries(plasma-volume-declarative
+        ${GCONF_LDFLAGS}
+        ${GOBJECT_LDFLAGS}
+    )
+endif()
+
 set(PRIVATE_QML_INSTALL_DIR ${QML_INSTALL_DIR}/org/kde/plasma/private/volume)
 install(TARGETS plasma-volume-declarative DESTINATION ${PRIVATE_QML_INSTALL_DIR})
 install(FILES ${qml_SRCS} DESTINATION ${PRIVATE_QML_INSTALL_DIR})
diff --git a/src/kcm/package/contents/ui/Advanced.qml b/src/kcm/package/contents/ui/Advanced.qml
index b305cf1..0cd9eb9 100644
--- a/src/kcm/package/contents/ui/Advanced.qml
+++ b/src/kcm/package/contents/ui/Advanced.qml
@@ -56,6 +56,7 @@ ScrollView {
         Header {
             Layout.fillWidth: true
             text: i18n("Advanced Output Configuration")
+            visible: moduleManager.settingsSupported
         }
 
         ModuleManager {
@@ -71,6 +72,7 @@ ScrollView {
             checked: moduleManager.combineSinks
             onCheckedChanged: moduleManager.combineSinks = checked;
             enabled: moduleManager.loadedModules.indexOf("module-gconf") != -1
+            visible: moduleManager.settingsSupported
         }
 
         CheckBox {
@@ -81,6 +83,7 @@ ScrollView {
             checked: moduleManager.switchOnConnect
             onCheckedChanged: moduleManager.switchOnConnect = checked;
             enabled: moduleManager.loadedModules.indexOf("module-gconf") != -1
+            visible: moduleManager.settingsSupported
         }
 
         Label {
@@ -88,7 +91,7 @@ ScrollView {
             enabled: false
             font.italic: true
             text: i18n("Requires 'module-gconf' PulseAudio module")
-            visible: moduleManager.loadedModules.indexOf("module-gconf") == -1
+            visible: moduleManager.settingsSupported && moduleManager.loadedModules.indexOf("module-gconf") == -1
         }
     }
 }
diff --git a/src/modulemanager.cpp b/src/modulemanager.cpp
index 635adc8..5245ac5 100644
--- a/src/modulemanager.cpp
+++ b/src/modulemanager.cpp
@@ -21,20 +21,22 @@
 
 #include "modulemanager.h"
 #include "module.h"
+#include "../config.h"
 
+#if HAVE_GCONF
+#include "gconfitem.h"
 #define PA_GCONF_ROOT "/system/pulseaudio"
 #define PA_GCONF_PATH_MODULES PA_GCONF_ROOT"/modules"
-
-#include "gconfitem.h"
+#endif
 
 #include <QTimer>
 
 namespace QPulseAudio
 {
 
+#if HAVE_GCONF
 class GConfModule : public GConfItem
 {
-    Q_OBJECT
 public:
     GConfModule(const QString &configName, const QString &moduleName, QObject *parent);
     bool isEnabled() const;
@@ -67,17 +69,21 @@ void GConfModule::setEnabled(bool enabled, const QVariant &args)
     }
     set(QStringLiteral("locked"), false);
 }
+#endif
 
 
 ModuleManager::ModuleManager(QObject *parent) :
-    QObject(parent),
-    m_combineSinks(new GConfModule(QStringLiteral("combine"), QStringLiteral("module-combine"), this)),
-    m_switchOnConnect(new GConfModule(QStringLiteral("switch-on-connect"), QStringLiteral("module-switch-on-connect"), this)),
-    m_deviceManager(new GConfModule(QStringLiteral("device-manager"), QStringLiteral("module-device-manager"), this))
+    QObject(parent)
 {
+#if HAVE_GCONF
+    m_combineSinks = new GConfModule(QStringLiteral("combine"), QStringLiteral("module-combine"), this);
+    m_switchOnConnect = new GConfModule(QStringLiteral("switch-on-connect"), QStringLiteral("module-switch-on-connect"), this);
+    m_deviceManager = new GConfModule(QStringLiteral("device-manager"), QStringLiteral("module-device-manager"), this);
+
     connect(m_combineSinks, &GConfItem::subtreeChanged, this, &ModuleManager::combineSinksChanged);
     connect(m_switchOnConnect, &GConfItem::subtreeChanged, this, &ModuleManager::switchOnConnectChanged);
     connect(m_deviceManager, &GConfItem::subtreeChanged, this, &ModuleManager::switchOnConnectChanged);
+#endif
 
     QTimer *updateModulesTimer = new QTimer(this);
     updateModulesTimer->setInterval(500);
@@ -92,14 +98,31 @@ ModuleManager::~ModuleManager()
 {
 };
 
+bool ModuleManager::settingsSupported() const
+{
+#if HAVE_GCONF
+    return true;
+#else
+    return false;
+#endif
+}
+
 bool ModuleManager::combineSinks() const
 {
+#if HAVE_GCONF
     return m_combineSinks->isEnabled();
+#else
+    return false;
+#endif
 }
 
 void ModuleManager::setCombineSinks(bool combineSinks)
 {
+#if HAVE_GCONF
     m_combineSinks->setEnabled(combineSinks);
+#else
+    Q_UNUSED(combineSinks)
+#endif
 }
 
 bool ModuleManager::switchOnConnect() const
@@ -109,13 +132,21 @@ bool ModuleManager::switchOnConnect() const
     //Note on the first run m_deviceManager will appear to be disabled even though it's actually running
     //because there is no gconf entry, however m_switchOnConnect will only exist if set by Plasma PA
     //hence only check this entry
+#if HAVE_GCONF
     return m_switchOnConnect->isEnabled() ;
+#else
+    return false;
+#endif
 }
 
 void ModuleManager::setSwitchOnConnect(bool switchOnConnect)
 {
+#if HAVE_GCONF
     m_deviceManager->setEnabled(!switchOnConnect);
     m_switchOnConnect->setEnabled(switchOnConnect);
+#else
+    Q_UNUSED(switchOnConnect)
+#endif
 }
 
 QStringList ModuleManager::loadedModules() const
@@ -134,5 +165,3 @@ void ModuleManager::updateLoadedModules()
 }
 
 }
-
-#include "modulemanager.moc"
diff --git a/src/modulemanager.h b/src/modulemanager.h
index b8fcd0b..8108fe0 100644
--- a/src/modulemanager.h
+++ b/src/modulemanager.h
@@ -38,12 +38,15 @@ class GConfModule;
 class ModuleManager : public QObject
 {
     Q_OBJECT
+    Q_PROPERTY(bool settingsSupported READ settingsSupported CONSTANT)
     Q_PROPERTY(bool combineSinks READ combineSinks WRITE setCombineSinks NOTIFY combineSinksChanged)
     Q_PROPERTY(bool switchOnConnect READ switchOnConnect WRITE setSwitchOnConnect NOTIFY switchOnConnectChanged)
     Q_PROPERTY(QStringList loadedModules READ loadedModules NOTIFY loadedModulesChanged)
 public:
     ModuleManager(QObject *parent = nullptr);
     ~ModuleManager();
+
+    bool settingsSupported() const;
     bool combineSinks() const;
     void setCombineSinks(bool combineSinks);
     bool switchOnConnect() const;
