From 1b91753dbed168eb71b3ba18cc50daf5192dc7e9 Mon Sep 17 00:00:00 2001
From: Akira Ohgaki <akiraohgaki@gmail.com>
Date: Sun, 9 Jul 2017 10:30:58 +0900
Subject: [PATCH] Add KdeTheme class

---
 app/src/desktopthemes/kdetheme.cpp | 119 +++++++++++++++++++++++++++++
 app/src/desktopthemes/kdetheme.h   |  23 ++++++
 2 files changed, 142 insertions(+)
 create mode 100644 app/src/desktopthemes/kdetheme.cpp
 create mode 100644 app/src/desktopthemes/kdetheme.h

diff --git a/app/src/desktopthemes/kdetheme.cpp b/app/src/desktopthemes/kdetheme.cpp
new file mode 100644
index 0000000..6267320
--- /dev/null
+++ b/app/src/desktopthemes/kdetheme.cpp
@@ -0,0 +1,119 @@
+#include "kdetheme.h"
+
+#include <QVariantList>
+#include <QTextStream>
+#include <QDir>
+#include <QProcess>
+#include <QDBusMessage>
+#include <QDBusConnection>
+#include <QDebug>
+
+KdeTheme::KdeTheme(const QString &path, QObject *parent)
+    : QObject(parent), path_(path)
+{
+    themeName_ = QDir(path_).dirName();
+}
+
+bool KdeTheme::applyAsWallpaper() const
+{
+    QString script;
+    QTextStream out(&script);
+    out << "for (var key in desktops()) {"
+        << "var d = desktops()[key];"
+        << "d.wallpaperPlugin = 'org.kde.image';"
+        << "d.currentConfigGroup = ['Wallpaper', 'org.kde.image', 'General'];"
+        << "d.writeConfig('Image', 'file://" + path_ + "');"
+        << "}";
+
+    return evaluateScript(script);
+}
+
+bool KdeTheme::applyAsIcon() const
+{
+    QString script;
+    QTextStream out(&script);
+    out << "var c = ConfigFile('kdeglobals');"
+        << "c.group = 'Icons';"
+        << "c.writeEntry('Theme', '" + themeName_ + "');";
+
+    if (evaluateScript(script)) {
+        auto iconChanged = QDBusMessage::createSignal("/KIconLoader", "org.kde.KIconLoader", "iconChanged");
+        iconChanged.setArguments(QVariantList() << QVariant(qint32(0)));
+        QDBusConnection::sessionBus().send(iconChanged);
+
+        auto notifyChange = QDBusMessage::createSignal("/KGlobalSettings", "org.kde.KGlobalSettings", "notifyChange");
+        notifyChange.setArguments(QVariantList() << QVariant(qint32(4)) << QVariant(qint32(0)));
+        QDBusConnection::sessionBus().send(notifyChange);
+
+        return true;
+    }
+    return false;
+}
+
+bool KdeTheme::applyAsCursor() const
+{
+    QString script;
+    QTextStream out(&script);
+    out << "var c = ConfigFile('kcminputrc');"
+        << "c.group = 'Mouse';"
+        << "c.writeEntry('cursorTheme', '" + themeName_ + "');";
+
+    if (evaluateScript(script)) {
+        auto setLaunchEnv = QDBusMessage::createMethodCall("org.kde.klauncher5", "/KLauncher", "org.kde.KLauncher", "setLaunchEnv");
+        setLaunchEnv.setArguments(QVariantList() << QVariant(QString("XCURSOR_THEME")) << QVariant(themeName_));
+        QDBusConnection::sessionBus().call(setLaunchEnv);
+
+        auto notifyChange = QDBusMessage::createSignal("/KGlobalSettings", "org.kde.KGlobalSettings", "notifyChange");
+        notifyChange.setArguments(QVariantList() << QVariant(qint32(5)) << QVariant(qint32(0)));
+        QDBusConnection::sessionBus().send(notifyChange);
+
+        return true;
+    }
+    return false;
+}
+
+bool KdeTheme::applyAsPlasmaDesktoptheme() const
+{
+    QString script;
+    QTextStream out(&script);
+    out << "var c = ConfigFile('plasmarc');"
+        << "c.group = 'Theme';"
+        << "c.writeEntry('name', '" + themeName_ + "');";
+
+    if (evaluateScript(script)) {
+        QProcess::startDetached("kquitapp5 plasmashell");
+        QProcess::startDetached("kstart5 plasmashell");
+        return true;
+    }
+    return false;
+}
+
+bool KdeTheme::applyAsAuroraeTheme() const
+{
+    QString script;
+    QTextStream out(&script);
+    out << "var c = ConfigFile('kwinrc');"
+        << "c.group = 'org.kde.kdecoration2';"
+        << "c.writeEntry('library', 'org.kde.kwin.aurorae');"
+        << "c.writeEntry('theme', '__aurorae__svg__" + themeName_ + "');";
+
+    if (evaluateScript(script)) {
+        auto reloadConfig = QDBusMessage::createSignal("/KWin", "org.kde.KWin", "reloadConfig");
+        QDBusConnection::sessionBus().send(reloadConfig);
+        return true;
+    }
+    return false;
+}
+
+bool KdeTheme::evaluateScript(const QString &script) const
+{
+    auto message = QDBusMessage::createMethodCall("org.kde.plasmashell", "/PlasmaShell", "org.kde.PlasmaShell", "evaluateScript");
+    message.setArguments(QVariantList() << QVariant(script));
+    auto reply = QDBusConnection::sessionBus().call(message);
+
+    if (reply.type() == QDBusMessage::ErrorMessage) {
+        qWarning() << reply.errorMessage();
+        return false;
+    }
+    return true;
+}
diff --git a/app/src/desktopthemes/kdetheme.h b/app/src/desktopthemes/kdetheme.h
new file mode 100644
index 0000000..8c6dbad
--- /dev/null
+++ b/app/src/desktopthemes/kdetheme.h
@@ -0,0 +1,23 @@
+#pragma once
+
+#include <QObject>
+
+class KdeTheme : public QObject
+{
+    Q_OBJECT
+
+public:
+    explicit KdeTheme(const QString &path, QObject *parent = nullptr);
+
+    bool applyAsWallpaper() const;
+    bool applyAsIcon() const;
+    bool applyAsCursor() const;
+    bool applyAsPlasmaDesktoptheme() const;
+    bool applyAsAuroraeTheme() const;
+
+private:
+    bool evaluateScript(const QString &script) const;
+
+    QString path_;
+    QString themeName_;
+};
-- 
GitLab