aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gnu/local.mk1
-rw-r--r--gnu/packages/kde.scm36
-rw-r--r--gnu/packages/patches/grantlee-merge-theme-dirs.patch163
3 files changed, 200 insertions, 0 deletions
diff --git a/gnu/local.mk b/gnu/local.mk
index b9d97ace27..83e899b1ab 100644
--- a/gnu/local.mk
+++ b/gnu/local.mk
@@ -939,6 +939,7 @@ dist_patch_DATA = \
%D%/packages/patches/gpm-glibc-2.26.patch \
%D%/packages/patches/gpsbabel-minizip.patch \
%D%/packages/patches/gpsbabel-qstring.patch \
+ %D%/packages/patches/grantlee-merge-theme-dirs.patch \
%D%/packages/patches/grep-timing-sensitive-test.patch \
%D%/packages/patches/groovy-add-exceptionutilsgenerator.patch \
%D%/packages/patches/grub-efi-fat-serial-number.patch \
diff --git a/gnu/packages/kde.scm b/gnu/packages/kde.scm
index 82116610ec..31b917d033 100644
--- a/gnu/packages/kde.scm
+++ b/gnu/packages/kde.scm
@@ -64,8 +64,44 @@
#:use-module (gnu packages version-control)
#:use-module (gnu packages video)
#:use-module (gnu packages xdisorg)
+ #:use-module (gnu packages xml)
#:use-module (gnu packages xorg))
+(define-public grantleetheme
+ (package
+ (name "grantleetheme")
+ (version "19.08.3")
+ (source
+ (origin
+ (method url-fetch)
+ (uri (string-append "mirror://kde/stable/applications/" version
+ "/src/grantleetheme-" version ".tar.xz"))
+ (sha256
+ (base32 "0j77q1yyfmggzgkqgcw2xr0v9xg3h5cdhh8jry8h2llw75ahy6xb"))
+ (patches (search-patches "grantlee-merge-theme-dirs.patch"))))
+ (build-system qt-build-system)
+ (native-inputs
+ `(("extra-cmake-modules" ,extra-cmake-modules)
+ ("libxml2" ,libxml2))) ;; xmllint required for tests
+ (inputs
+ `(("grantlee" ,grantlee)
+ ("ki18n" ,ki18n)
+ ("kiconthemes" ,kiconthemes)
+ ("knewstuff" ,knewstuff)
+ ("qtbase" ,qtbase)))
+ (arguments
+ `(#:phases
+ (modify-phases %standard-phases
+ (add-before 'check 'check-setup
+ (lambda _
+ (setenv "QT_QPA_PLATFORM" "offscreen")
+ #t)))))
+ (home-page "https://cgit.kde.org/grantleetheme.git")
+ (synopsis "Library providing Grantlee theme support")
+ (description "This library provides Grantlee theme support.")
+ (license ;; LGPL for libraries, FDL for documentation
+ (list license:lgpl2.0+ license:fdl1.2+))))
+
(define-public kdenlive
(let ((version "18.08.1"))
(package
diff --git a/gnu/packages/patches/grantlee-merge-theme-dirs.patch b/gnu/packages/patches/grantlee-merge-theme-dirs.patch
new file mode 100644
index 0000000000..96a15a387b
--- /dev/null
+++ b/gnu/packages/patches/grantlee-merge-theme-dirs.patch
@@ -0,0 +1,163 @@
+Taken from nixpkgs, see
+grantleetheme: merge themes across multiple prefixes
+<https://github.com/NixOS/nixpkgs/commits/master/pkgs/applications/kde/grantleetheme/grantlee-merge-theme-dirs.patch>
+
+
+diff --git a/src/grantleetheme.cpp b/src/grantleetheme.cpp
+index 27d5bc8..8d43140 100644
+--- a/src/grantleetheme.cpp
++++ b/src/grantleetheme.cpp
+@@ -46,7 +46,7 @@ ThemePrivate::ThemePrivate(const ThemePrivate &other)
+ , description(other.description)
+ , name(other.name)
+ , dirName(other.dirName)
+- , absolutePath(other.absolutePath)
++ , absolutePaths(other.absolutePaths)
+ , author(other.author)
+ , email(other.email)
+ , loader(other.loader)
+@@ -64,12 +64,15 @@ void ThemePrivate::setupEngine()
+
+ void ThemePrivate::setupLoader()
+ {
+- // Get the parent dir with themes, we set the theme directory separately
+- QDir dir(absolutePath);
+- dir.cdUp();
++ QStringList templateDirs;
++ for (const QString& path : absolutePaths) {
++ QDir dir(path);
++ dir.cdUp();
++ templateDirs << dir.absolutePath();
++ }
+
+ loader = QSharedPointer<GrantleeTheme::QtResourceTemplateLoader>::create();
+- loader->setTemplateDirs({ dir.absolutePath() });
++ loader->setTemplateDirs(templateDirs);
+ loader->setTheme(dirName);
+
+ if (!sEngine) {
+@@ -121,7 +124,7 @@ Theme::Theme(const QString &themePath, const QString &dirName, const QString &de
+ KConfigGroup group(&config, QStringLiteral("Desktop Entry"));
+ if (group.isValid()) {
+ d->dirName = dirName;
+- d->absolutePath = themePath;
++ d->absolutePaths = QStringList(themePath);
+ d->name = group.readEntry("Name", QString());
+ d->description = group.readEntry("Description", QString());
+ d->themeFileName = group.readEntry("FileName", QString());
+@@ -140,7 +143,7 @@ Theme::~Theme()
+
+ bool Theme::operator==(const Theme &other) const
+ {
+- return isValid() && other.isValid() && d->absolutePath == other.absolutePath();
++ return isValid() && other.isValid() && d->absolutePaths == other.absolutePaths();
+ }
+
+ Theme &Theme::operator=(const Theme &other)
+@@ -184,7 +187,15 @@ QString Theme::dirName() const
+
+ QString Theme::absolutePath() const
+ {
+- return d->absolutePath;
++ if (! d->absolutePaths.isEmpty()) {
++ return d->absolutePaths.first();
++ };
++ return QString();
++}
++
++QStringList Theme::absolutePaths() const
++{
++ return d->absolutePaths;
+ }
+
+ QString Theme::author() const
+@@ -223,6 +231,13 @@ QString Theme::render(const QString &templateName, const QVariantHash &data, con
+ return result;
+ }
+
++void Theme::addThemeDir(const QString& path)
++{
++ QDir dir(path);
++ dir.cdUp();
++ d->absolutePaths << dir.absolutePath();
++}
++
+ void Theme::addPluginPath(const QString &path)
+ {
+ if (!ThemePrivate::sEngine) {
+diff --git a/src/grantleetheme.h b/src/grantleetheme.h
+index a25c27b..be38299 100644
+--- a/src/grantleetheme.h
++++ b/src/grantleetheme.h
+@@ -48,11 +48,14 @@ public:
+ Q_REQUIRED_RESULT QStringList displayExtraVariables() const;
+ Q_REQUIRED_RESULT QString dirName() const;
+ Q_REQUIRED_RESULT QString absolutePath() const;
++ Q_REQUIRED_RESULT QStringList absolutePaths() const;
+ Q_REQUIRED_RESULT QString author() const;
+ Q_REQUIRED_RESULT QString authorEmail() const;
+
+ Q_REQUIRED_RESULT QString render(const QString &templateName, const QVariantHash &data, const QByteArray &applicationDomain = QByteArray());
+
++ void addThemeDir(const QString&);
++
+ static void addPluginPath(const QString &path);
+
+ private:
+diff --git a/src/grantleetheme_p.h b/src/grantleetheme_p.h
+index eb73dcb..00510e9 100644
+--- a/src/grantleetheme_p.h
++++ b/src/grantleetheme_p.h
+@@ -43,7 +43,7 @@ public:
+ QString description;
+ QString name;
+ QString dirName;
+- QString absolutePath;
++ QStringList absolutePaths;
+ QString author;
+ QString email;
+
+diff --git a/src/grantleethememanager.cpp b/src/grantleethememanager.cpp
+index 606d717..dc99041 100644
+--- a/src/grantleethememanager.cpp
++++ b/src/grantleethememanager.cpp
+@@ -125,25 +125,18 @@ public:
+
+ for (const QString &directory : qAsConst(themesDirectories)) {
+ QDirIterator dirIt(directory, QStringList(), QDir::AllDirs | QDir::NoDotAndDotDot);
+- QStringList alreadyLoadedThemeName;
+ while (dirIt.hasNext()) {
+ dirIt.next();
+ const QString dirName = dirIt.fileName();
+ GrantleeTheme::Theme theme = q->loadTheme(dirIt.filePath(), dirName, defaultDesktopFileName);
+ if (theme.isValid()) {
+ QString themeName = theme.name();
+- if (alreadyLoadedThemeName.contains(themeName)) {
+- int i = 2;
+- const QString originalName(theme.name());
+- while (alreadyLoadedThemeName.contains(themeName)) {
+- themeName = originalName + QStringLiteral(" (%1)").arg(i);
+- ++i;
+- }
+- theme.d->name = themeName;
++ QMap<QString, GrantleeTheme::Theme>::iterator i = themes.find(dirName);
++ if (i != themes.end()) {
++ i.value().addThemeDir(dirIt.filePath());
++ } else {
++ themes.insert(dirName, theme);
+ }
+- alreadyLoadedThemeName << themeName;
+- themes.insert(dirName, theme);
+- //qDebug()<<" theme.name()"<<theme.name();
+ }
+ }
+ watch->addDir(directory);
+@@ -366,7 +359,7 @@ QString ThemeManager::pathFromThemes(const QString &themesRelativePath, const QS
+ GrantleeTheme::Theme theme = loadTheme(dirIt.filePath(), dirName, defaultDesktopFileName);
+ if (theme.isValid()) {
+ if (dirName == themeName) {
+- return theme.absolutePath();
++ return theme.absolutePaths().first();
+ }
+ }
+ }