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