diff options
-rw-r--r-- | gnu/local.mk | 1 | ||||
-rw-r--r-- | gnu/packages/kde.scm | 36 | ||||
-rw-r--r-- | gnu/packages/patches/grantlee-merge-theme-dirs.patch | 163 |
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(); + } + } + } |