From 969b72c57c81cc5a9be549dd0d501c9e6d2129cb Mon Sep 17 00:00:00 2001
From: Mikhail Zolotukhin <zomial@protonmail.com>
Date: Mon, 27 Jan 2020 13:48:00 +0100
Subject: [PATCH] Upgrade theme to Breeze GTK on startup

Summary:
Also apply it, if the config is empty. This is a port of kconf_update
script from `breeze-gtk` repo, but this time it use gtkconfig kded
module methods to manipulate config (to avoid code duplication and to
write config to all possible configuration storages).

BUG: 416635
FIXED-IN: 5.18.0

Test Plan:
# Remove `gtk-theme-name=` line in `~/.gtkrc-2.0` file or change it to `BreezyGTK`, `Orion` or `oxygen-gtk`
# Run `gtk_theme` executable from `kconf_update` build directory. Line should appear/cahnge to `Breeze`
# Remove `gtk-theme-name=` line in `~/.config/gtk-3.0/settings.ini` file or change it to `BreezyGTK`, `Orion` or `oxygen-gtk`
# Run `gtk_theme` executable from `kconf_update` build directory. Line should appear/cahnge to `Breeze`, also it should be changed in dconf in `org.gnome.desktop.interface.gtk-theme` prefix and in `~/.config/xsettingsd/xsettingsd.conf` file (`Net/ThemeName "Breeze"` line)

Reviewers: fvogt

Subscribers: meven, plasma-devel

Tags: #plasma

Differential Revision: https://phabricator.kde.org/D26891
---
 CMakeLists.txt              |  1 +
 kconf_update/CMakeLists.txt | 38 +++++++++++++++++++++++++
 kconf_update/gtk_theme.upd  |  3 ++
 kconf_update/main.cpp       | 56 +++++++++++++++++++++++++++++++++++++
 kded/configeditor.cpp       |  4 +--
 5 files changed, 100 insertions(+), 2 deletions(-)
 create mode 100644 kconf_update/CMakeLists.txt
 create mode 100644 kconf_update/gtk_theme.upd
 create mode 100644 kconf_update/main.cpp

diff --git a/CMakeLists.txt b/CMakeLists.txt
index 54be644..72aa16f 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -28,6 +28,7 @@ configure_file(${CMAKE_CURRENT_SOURCE_DIR}/config.h.cmake kded/config.h)
 add_subdirectory(gtkproxies)
 add_subdirectory(gtk3proxies)
 add_subdirectory(kded)
+add_subdirectory(kconf_update)
 
 # add clang-format target for all our real source files
 file(GLOB_RECURSE ALL_CLANG_FORMAT_SOURCE_FILES *.cpp *.h)
diff --git a/kconf_update/CMakeLists.txt b/kconf_update/CMakeLists.txt
new file mode 100644
index 0000000..05a5490
--- /dev/null
+++ b/kconf_update/CMakeLists.txt
@@ -0,0 +1,38 @@
+add_executable(gtk_theme main.cpp)
+
+target_sources(gtk_theme
+  PRIVATE
+    ../kded/configeditor.cpp
+)
+
+target_link_libraries(gtk_theme
+  PRIVATE
+    Qt5::Core
+    KF5::ConfigCore
+    ${GIO2_LIBRARY}
+    ${GOBJECT2_LIBRARY}
+)
+
+target_include_directories(gtk_theme
+  PRIVATE
+    ../kded/
+    ${GTK3_INCLUDE_DIRS}
+)
+
+target_compile_definitions(gtk_theme
+  PRIVATE
+    QT_NO_SIGNALS_SLOTS_KEYWORDS
+)
+
+install(
+  TARGETS
+    gtk_theme
+  DESTINATION
+    ${LIB_INSTALL_DIR}/kconf_update_bin/
+)
+install(
+  FILES
+    gtk_theme.upd
+  DESTINATION
+    ${KCONF_UPDATE_INSTALL_DIR}
+)
diff --git a/kconf_update/gtk_theme.upd b/kconf_update/gtk_theme.upd
new file mode 100644
index 0000000..6214e77
--- /dev/null
+++ b/kconf_update/gtk_theme.upd
@@ -0,0 +1,3 @@
+Version=5
+Id=gtk_theme
+Script=gtk_theme
diff --git a/kconf_update/main.cpp b/kconf_update/main.cpp
new file mode 100644
index 0000000..bf9993c
--- /dev/null
+++ b/kconf_update/main.cpp
@@ -0,0 +1,56 @@
+/*
+ * Copyright (C) 2020 Mikhail Zolotukhin <zomial@protonmail.com>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License or (at your option) version 3 or any later version
+ * accepted by the membership of KDE e.V. (or its successor approved
+ * by the membership of KDE e.V.), which shall act as a proxy
+ * defined in Section 14 of version 3 of the license.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <QString>
+
+#include "configeditor.h"
+
+void upgradeGtk2Theme();
+void upgradeGtk3Theme();
+
+int main() {
+    upgradeGtk2Theme();
+    upgradeGtk3Theme();
+    return 0;
+}
+
+void upgradeGtk2Theme() {
+    QString currentGtk2Theme = ConfigEditor::gtk2ConfigValue(QStringLiteral("gtk-theme-name"));
+    if (currentGtk2Theme.isEmpty()
+     || currentGtk2Theme == QStringLiteral("oxygen-gtk")
+     || currentGtk2Theme == QStringLiteral("BreezyGTK")
+     || currentGtk2Theme == QStringLiteral("Orion")
+    ) {
+        ConfigEditor::setGtk2ConfigValue(QStringLiteral("gtk-theme-name"), QStringLiteral("Breeze"));
+    }
+}
+
+void upgradeGtk3Theme() {
+    QString currentGtk3Theme = ConfigEditor::gtk3ConfigValueSettingsIni(QStringLiteral("gtk-theme-name"));
+    if (currentGtk3Theme.isEmpty()
+     || currentGtk3Theme == QStringLiteral("oxygen-gtk")
+     || currentGtk3Theme == QStringLiteral("BreezyGTK")
+     || currentGtk3Theme == QStringLiteral("Orion")
+    ) {
+        ConfigEditor::setGtk3ConfigValueDconf(QStringLiteral("gtk-theme"), QStringLiteral("Breeze"));
+        ConfigEditor::setGtk3ConfigValueSettingsIni(QStringLiteral("gtk-theme-name"), QStringLiteral("Breeze"));
+        ConfigEditor::setGtk3ConfigValueXSettingsd(QStringLiteral("Net/ThemeName"),  QStringLiteral("Breeze"));
+    }
+}
diff --git a/kded/configeditor.cpp b/kded/configeditor.cpp
index 244fe2c..3074f70 100644
--- a/kded/configeditor.cpp
+++ b/kded/configeditor.cpp
@@ -109,7 +109,7 @@ QString ConfigEditor::gtk2ConfigValue(const QString& paramName)
         }
     }
 
-    return QStringLiteral("Breeze");
+    return QString();
 }
 
 QString ConfigEditor::gtk3ConfigValueSettingsIni(const QString& paramName)
@@ -120,7 +120,7 @@ QString ConfigEditor::gtk3ConfigValueSettingsIni(const QString& paramName)
     KSharedConfig::Ptr gtk3Config = KSharedConfig::openConfig(gtk3ConfigPath, KConfig::NoGlobals);
     KConfigGroup group = gtk3Config->group(QStringLiteral("Settings"));
 
-    return group.readEntry(paramName, QStringLiteral("Breeze"));
+    return group.readEntry(paramName);
 }
 
 
-- 
2.23.0