diff --git a/app/app.pri b/app/app.pri index 3dc35f887cf0401f44e57cf58edb9467911bb100..7e03a9c0fa9cc860f9a31358cc220eead6766d19 100644 --- a/app/app.pri +++ b/app/app.pri @@ -32,11 +32,15 @@ unix:!ios:!android { $${PWD}/src/handlers/desktopthemehandler.h \ $${PWD}/src/desktopthemes/kdetheme.h \ $${PWD}/src/desktopthemes/gnometheme.h \ - $${PWD}/src/desktopthemes/xfcetheme.h + $${PWD}/src/desktopthemes/xfcetheme.h \ + $${PWD}/src/desktopthemes/cinnamontheme.h \ + $${PWD}/src/desktopthemes/matetheme.h SOURCES += \ $${PWD}/src/handlers/desktopthemehandler.cpp \ $${PWD}/src/desktopthemes/kdetheme.cpp \ $${PWD}/src/desktopthemes/gnometheme.cpp \ - $${PWD}/src/desktopthemes/xfcetheme.cpp + $${PWD}/src/desktopthemes/xfcetheme.cpp \ + $${PWD}/src/desktopthemes/cinnamontheme.cpp \ + $${PWD}/src/desktopthemes/matetheme.cpp } diff --git a/app/src/desktopthemes/cinnamontheme.cpp b/app/src/desktopthemes/cinnamontheme.cpp new file mode 100644 index 0000000000000000000000000000000000000000..4cc86ed063e21cb26b32c4f13fd58d2438c52886 --- /dev/null +++ b/app/src/desktopthemes/cinnamontheme.cpp @@ -0,0 +1,46 @@ +#include "cinnamontheme.h" + +#include <QStringList> +#include <QDir> +#include <QProcess> + +CinnamonTheme::CinnamonTheme(const QString &path, QObject *parent) + : QObject(parent), path_(path) +{ + themeName_ = QDir(path_).dirName(); +} + +bool CinnamonTheme::applyAsWallpaper() const +{ + return setConfig("org.cinnamon.desktop.background", "picture-uri", "file://" + path_); +} + +bool CinnamonTheme::applyAsIcon() const +{ + return setConfig("org.cinnamon.desktop.interface", "icon-theme", themeName_); +} + +bool CinnamonTheme::applyAsCursor() const +{ + return setConfig("org.cinnamon.desktop.interface", "cursor-theme", themeName_); +} + +bool CinnamonTheme::applyAsGtk3Theme() const +{ + return setConfig("org.cinnamon.desktop.interface", "gtk-theme", themeName_); +} + +bool CinnamonTheme::applyAsMetacityTheme() const +{ + return setConfig("org.cinnamon.desktop.wm.preferences", "theme", themeName_); +} + +bool CinnamonTheme::applyAsCinnamonTheme() const +{ + return setConfig("org.cinnamon.theme", "name", themeName_); +} + +bool CinnamonTheme::setConfig(const QString &schema, const QString &key, const QString &value) const +{ + return QProcess::startDetached("gsettings", QStringList() << "set" << schema << key << value); +} diff --git a/app/src/desktopthemes/cinnamontheme.h b/app/src/desktopthemes/cinnamontheme.h new file mode 100644 index 0000000000000000000000000000000000000000..07ff77a854a8b54b0f2293da4de1b2a5c1a92c29 --- /dev/null +++ b/app/src/desktopthemes/cinnamontheme.h @@ -0,0 +1,24 @@ +#pragma once + +#include <QObject> + +class CinnamonTheme : public QObject +{ + Q_OBJECT + +public: + explicit CinnamonTheme(const QString &path, QObject *parent = nullptr); + + bool applyAsWallpaper() const; + bool applyAsIcon() const; + bool applyAsCursor() const; + bool applyAsGtk3Theme() const; + bool applyAsMetacityTheme() const; + bool applyAsCinnamonTheme() const; + +private: + bool setConfig(const QString &schema, const QString &key, const QString &value) const; + + QString path_; + QString themeName_; +}; diff --git a/app/src/desktopthemes/matetheme.cpp b/app/src/desktopthemes/matetheme.cpp new file mode 100644 index 0000000000000000000000000000000000000000..6e10f456567c398e932ea53bf07bc2924fdf51b4 --- /dev/null +++ b/app/src/desktopthemes/matetheme.cpp @@ -0,0 +1,41 @@ +#include "matetheme.h" + +#include <QStringList> +#include <QDir> +#include <QProcess> + +MateTheme::MateTheme(const QString &path, QObject *parent) + : QObject(parent), path_(path) +{ + themeName_ = QDir(path_).dirName(); +} + +bool MateTheme::applyAsWallpaper() const +{ + return setConfig("org.mate.background", "picture-filename", path_); +} + +bool MateTheme::applyAsIcon() const +{ + return setConfig("org.mate.interface", "icon-theme", themeName_); +} + +bool MateTheme::applyAsCursor() const +{ + return setConfig("org.mate.peripherals-mouse", "cursor-theme", themeName_); +} + +bool MateTheme::applyAsGtk2Theme() const +{ + return setConfig("org.mate.interface", "gtk-theme", themeName_); +} + +bool MateTheme::applyAsMetacityTheme() const +{ + return setConfig("org.mate.Marco.general", "theme", themeName_); +} + +bool MateTheme::setConfig(const QString &schema, const QString &key, const QString &value) const +{ + return QProcess::startDetached("gsettings", QStringList() << "set" << schema << key << value); +} diff --git a/app/src/desktopthemes/matetheme.h b/app/src/desktopthemes/matetheme.h new file mode 100644 index 0000000000000000000000000000000000000000..35032c46b02bad6cab1f0356cf854d38a2d6eea4 --- /dev/null +++ b/app/src/desktopthemes/matetheme.h @@ -0,0 +1,23 @@ +#pragma once + +#include <QObject> + +class MateTheme : public QObject +{ + Q_OBJECT + +public: + explicit MateTheme(const QString &path, QObject *parent = nullptr); + + bool applyAsWallpaper() const; + bool applyAsIcon() const; + bool applyAsCursor() const; + bool applyAsGtk2Theme() const; + bool applyAsMetacityTheme() const; + +private: + bool setConfig(const QString &schema, const QString &key, const QString &value) const; + + QString path_; + QString themeName_; +}; diff --git a/app/src/handlers/desktopthemehandler.cpp b/app/src/handlers/desktopthemehandler.cpp index 923883c7b30801416ab45c0819ee4c7dc897d01b..20869ec8ac63d9f919df1a02ce6279852328d18a 100644 --- a/app/src/handlers/desktopthemehandler.cpp +++ b/app/src/handlers/desktopthemehandler.cpp @@ -8,6 +8,8 @@ #include "desktopthemes/kdetheme.h" #include "desktopthemes/gnometheme.h" #include "desktopthemes/xfcetheme.h" +#include "desktopthemes/cinnamontheme.h" +#include "desktopthemes/matetheme.h" #endif DesktopThemeHandler::DesktopThemeHandler(QObject *parent) @@ -38,6 +40,12 @@ QString DesktopThemeHandler::desktopEnvironment() const else if (currentDesktop.contains("xfce")) { desktop = "xfce"; } + else if (currentDesktop.contains("cinnamon")) { + desktop = "cinnamon"; + } + else if (currentDesktop.contains("mate")) { + desktop = "mate"; + } return desktop; } @@ -69,6 +77,21 @@ bool DesktopThemeHandler::isApplicableType(const QString &installType) const << "gtk2_themes" << "xfwm4_themes"; } + else if (desktop == "cinnamon") { + applicableTypes << "wallpapers" + << "icons" + << "cursors" + << "gtk3_themes" + << "metacity_themes" + << "cinnamon_themes"; + } + else if (desktop == "mate") { + applicableTypes << "wallpapers" + << "icons" + << "cursors" + << "gtk2_themes" + << "metacity_themes"; + } return applicableTypes.contains(installType); } @@ -133,6 +156,45 @@ bool DesktopThemeHandler::applyTheme(const QString &path, const QString &install return xfceTheme.applyAsXfwm4Theme(); } } + else if (desktop == "cinnamon") { + CinnamonTheme cinnamonTheme(path); + if (installType == "wallpapers") { + return cinnamonTheme.applyAsWallpaper(); + } + else if (installType == "icons") { + return cinnamonTheme.applyAsIcon(); + } + else if (installType == "cursors") { + return cinnamonTheme.applyAsCursor(); + } + else if (installType == "gtk3_themes") { + return cinnamonTheme.applyAsGtk3Theme(); + } + else if (installType == "metacity_themes") { + return cinnamonTheme.applyAsMetacityTheme(); + } + else if (installType == "cinnamon_themes") { + return cinnamonTheme.applyAsCinnamonTheme(); + } + } + else if (desktop == "mate") { + MateTheme mateTheme(path); + if (installType == "wallpapers") { + return mateTheme.applyAsWallpaper(); + } + else if (installType == "icons") { + return mateTheme.applyAsIcon(); + } + else if (installType == "cursors") { + return mateTheme.applyAsCursor(); + } + else if (installType == "gtk2_themes") { + return mateTheme.applyAsGtk2Theme(); + } + else if (installType == "metacity_themes") { + return mateTheme.applyAsMetacityTheme(); + } + } } return false;