gnu: kvantum: Support XDG directory specification.

* gnu/packages/patches/kvantum-1.1.5-xdg-dirs-support.patch: New file.
* gnu/local.mk: Register it.
* gnu/packages/qt.scm (kvantum)[source]<patches>: Add
"kvantum-1.1.5-xdg-dirs-support.patch".

Change-Id: I40208afdbc839b4b56d94eddfbc75dcd7dc09a7d
This commit is contained in:
Sughosha 2025-07-23 22:26:16 +05:30
parent d5546adc2d
commit eb5bc46c65
No known key found for this signature in database
GPG key ID: CDBC0BD95943A706
3 changed files with 472 additions and 1 deletions

View file

@ -1709,6 +1709,7 @@ dist_patch_DATA = \
%D%/packages/patches/kodi-set-libcurl-ssl-parameters.patch \
%D%/packages/patches/krita-bump-sip-abi-version-to-12.8.patch \
%D%/packages/patches/krita-xsimd-13-compat.patch \
%D%/packages/patches/kvantum-1.1.5-xdg-dirs-support.patch \
%D%/packages/patches/kwayland-5-fix-build.patch \
%D%/packages/patches/kwin-unwrap-executable-name-for-dot-desktop-search.patch\
%D%/packages/patches/laby-make-install.patch \

View file

@ -0,0 +1,468 @@
This patch is copied from
https://github.com/tsujan/Kvantum/commit/01989083f9ee75a013c2654e760efd0a1dea4a68.patch
(URL taken from NixOS).
The author of Kvantum refused to allow searching themes from XDG_DATA_DIRS:
https://github.com/tsujan/Kvantum/issues/210.
From 01989083f9ee75a013c2654e760efd0a1dea4a68 Mon Sep 17 00:00:00 2001
From: Mark Sagi-Kazar <mark.sagikazar@gmail.com>
Date: Fri, 1 Apr 2022 21:10:31 +0200
Subject: [PATCH] wip: add xdg dirs support
Signed-off-by: Mark Sagi-Kazar <mark.sagikazar@gmail.com>
---
Kvantum/kvantummanager/KvCommand.cpp | 38 ++++-
Kvantum/kvantummanager/KvantumManager.cpp | 53 +++++-
Kvantum/style/Kvantum.cpp | 199 +++++++++++++++-------
3 files changed, 224 insertions(+), 66 deletions(-)
diff --git a/Kvantum/kvantummanager/KvCommand.cpp b/Kvantum/kvantummanager/KvCommand.cpp
index 8dd20820..481ed74b 100644
--- a/Kvantum/kvantummanager/KvCommand.cpp
+++ b/Kvantum/kvantummanager/KvCommand.cpp
@@ -18,6 +18,7 @@
#include "KvCommand.h"
#include <QDir>
#include <QSettings>
+#include <QStandardPaths>
namespace KvManager {
@@ -148,6 +149,36 @@ static const QStringList getAllThemes()
/* now add the root themes */
QStringList rootList;
+ const QStringList xdgKvantumDirs = QStandardPaths::locateAll(QStandardPaths::GenericDataLocation, QString("Kvantum"), QStandardPaths::LocateDirectory);
+ for (const QString &xdgKvantumDir : xdgKvantumDirs)
+ {
+ kv = QDir(xdgKvantumDir);
+ if (kv.exists())
+ {
+ const QStringList folders = kv.entryList (QDir::Dirs | QDir::NoDotAndDotDot, QDir::Name);
+ for (const QString &folder : folders)
+ {
+ QString path = QString ("%1/%2").arg (xdgKvantumDir).arg (folder);
+ if (!folder.contains ("#") && isThemeDir (path))
+ {
+ if (!list.contains (folder) // a user theme with the same name takes priority
+ && !list.contains (folder + "#")
+ // a root theme inside 'XDG_DATA_DIRS/Kvantum/' with the same name takes priority
+ && !rootList.contains (folder))
+ {
+ rootList << folder;
+ }
+ if (isLightWithDarkDir (path)
+ && !list.contains (folder + "Dark")
+ && !list.contains (folder + "Dark" + "#")
+ && !rootList.contains (folder + "Dark"))
+ {
+ rootList << (folder + "Dark");
+ }
+ }
+ }
+ }
+ }
kv = QDir (QString (DATADIR) + QString ("/Kvantum"));
if (kv.exists())
{
@@ -158,13 +189,16 @@ static const QStringList getAllThemes()
if (!folder.contains ("#") && isThemeDir (path))
{
if (!list.contains (folder) // a user theme with the same name takes priority
- && !list.contains (folder + "#"))
+ && !list.contains (folder + "#")
+ // a root theme inside 'XDG_DATA_DIRS/Kvantum/' with the same name takes priority
+ && !rootList.contains (folder))
{
rootList << folder;
}
if (isLightWithDarkDir (path)
&& !list.contains (folder + "Dark")
- && !list.contains (folder + "Dark" + "#"))
+ && !list.contains (folder + "Dark" + "#")
+ && !rootList.contains (folder + "Dark"))
{
rootList << (folder + "Dark");
}
diff --git a/Kvantum/kvantummanager/KvantumManager.cpp b/Kvantum/kvantummanager/KvantumManager.cpp
index 958af9ff..a747ff46 100644
--- a/Kvantum/kvantummanager/KvantumManager.cpp
+++ b/Kvantum/kvantummanager/KvantumManager.cpp
@@ -500,6 +500,22 @@ QString KvantumManager::rootThemeDir (const QString &themeName) const
{
return QString();
}
+ // XDG_DATA_DIRS/Kvantum
+ const QStringList xdgKvantumDirs = QStandardPaths::locateAll(QStandardPaths::GenericDataLocation, QString("Kvantum"), QStandardPaths::LocateDirectory);
+ for (const QString &xdgKvantumDir : xdgKvantumDirs)
+ {
+ QString themeDir = QString ("%1/%2").arg (xdgKvantumDir).arg (themeName);
+ if (fileBelongsToThemeDir (themeName, themeDir))
+ return themeDir;
+ QString lightFolder;
+ if (themeName.size() > 4 && themeName.endsWith ("Dark"))
+ {
+ lightFolder = themeName.left (themeName.size() - 4);
+ themeDir = QString ("%1/%2").arg (xdgKvantumDir).arg (lightFolder);
+ if (fileBelongsToThemeDir (themeName, themeDir))
+ return themeDir;
+ }
+ }
// /usr/share/Kvantum
QString themeDir = QString (DATADIR) + QString ("/Kvantum/") + themeName;
if (fileBelongsToThemeDir (themeName, themeDir))
@@ -1968,6 +1984,36 @@ void KvantumManager::updateThemeList (bool updateAppThemes)
/* now add the root themes */
QStringList rootList;
+ const QStringList xdgKvantumDirs = QStandardPaths::locateAll(QStandardPaths::GenericDataLocation, QString("Kvantum"), QStandardPaths::LocateDirectory);
+ for (const QString &xdgKvantumDir : xdgKvantumDirs)
+ {
+ kv = QDir(xdgKvantumDir);
+ if (kv.exists())
+ {
+ const QStringList folders = kv.entryList (QDir::Dirs | QDir::NoDotAndDotDot, QDir::Name);
+ for (const QString &folder : folders)
+ {
+ QString path = QString ("%1/%2").arg (xdgKvantumDir).arg (folder);
+ if (!folder.contains ("#") && isThemeDir (path))
+ {
+ if (!list.contains (folder) // a user theme with the same name takes priority
+ && !list.contains (folder + modifiedSuffix_)
+ // a root theme inside 'DATADIR/Kvantum/' with the same name takes priority
+ && !rootList.contains (folder))
+ {
+ rootList.append (folder);
+ }
+ if (isLightWithDarkDir (path)
+ && !list.contains (folder + "Dark")
+ && !list.contains (folder + "Dark" + modifiedSuffix_)
+ && !rootList.contains (folder + "Dark"))
+ {
+ rootList.append (folder + "Dark");
+ }
+ }
+ }
+ }
+ }
kv = QDir (QString (DATADIR) + QString ("/Kvantum"));
if (kv.exists())
{
@@ -1978,13 +2024,16 @@ void KvantumManager::updateThemeList (bool updateAppThemes)
if (!folder.contains ("#") && isThemeDir (path))
{
if (!list.contains (folder) // a user theme with the same name takes priority
- && !list.contains (folder + modifiedSuffix_))
+ && !list.contains (folder + modifiedSuffix_)
+ // a root theme inside 'DATADIR/Kvantum/' with the same name takes priority
+ && !rootList.contains (folder))
{
rootList.append (folder);
}
if (isLightWithDarkDir (path)
&& !list.contains (folder + "Dark")
- && !list.contains (folder + "Dark" + modifiedSuffix_))
+ && !list.contains (folder + "Dark" + modifiedSuffix_)
+ && !rootList.contains (folder + "Dark"))
{
rootList.append (folder + "Dark");
}
diff --git a/Kvantum/style/Kvantum.cpp b/Kvantum/style/Kvantum.cpp
index f198187b..f5c2f443 100644
--- a/Kvantum/style/Kvantum.cpp
+++ b/Kvantum/style/Kvantum.cpp
@@ -642,44 +642,68 @@ void Style::setTheme(const QString &baseThemeName, bool useDark)
else if (userSvg.isEmpty() // otherwise it's a user theme without config file
&& !themeName.endsWith(QLatin1String("#"))) // root theme names can't have the ending "#"
{ // root theme
- temp = QString(DATADIR)
- + QString("/Kvantum/%1/%1.kvconfig").arg(themeName);
- if (QFile::exists(temp))
- themeSettings_ = new ThemeConfig(temp);
- else if (!isThemeDir(QString(DATADIR) + "/Kvantum", themeName) // svg shouldn't be found
- && isThemeDir(QString(DATADIR) + "/Kvantum", lightName))
+ temp = QString("");
+ const QStringList xdgKvantumDirs = QStandardPaths::locateAll(QStandardPaths::GenericDataLocation, QString("Kvantum"), QStandardPaths::LocateDirectory);
+ for (const QString &xdgKvantumDir : xdgKvantumDirs)
{
- temp = QString(DATADIR)
- + QString("/Kvantum/%1/%2.kvconfig").arg(lightName).arg(themeName);
- if (QFile::exists(temp))
+ temp = xdgKvantumDir
+ + QString("/%1/%1.kvconfig").arg(themeName);
+ if (QFile::exists(temp)) {
themeSettings_ = new ThemeConfig(temp);
+ break;
+ }
+ else if (!isThemeDir(xdgKvantumDir, themeName) // svg shouldn't be found
+ && isThemeDir(xdgKvantumDir, lightName))
+ {
+ temp = xdgKvantumDir
+ + QString("/%1/%2.kvconfig").arg(lightName).arg(themeName);
+ if (QFile::exists(temp)) {
+ themeSettings_ = new ThemeConfig(temp);
+ break;
+ }
+ }
}
-
if (!QFile::exists(temp))
{
temp = QString(DATADIR)
- + QString("/Kvantum/%1/%1.svg").arg(themeName);
- if (!QFile::exists(temp)) // otherwise the checked root theme was just an SVG image
+ + QString("/Kvantum/%1/%1.kvconfig").arg(themeName);
+ if (QFile::exists(temp))
+ themeSettings_ = new ThemeConfig(temp);
+ else if (!isThemeDir(QString(DATADIR) + "/Kvantum", themeName) // svg shouldn't be found
+ && isThemeDir(QString(DATADIR) + "/Kvantum", lightName))
{
temp = QString(DATADIR)
- + QString("/themes/%1/Kvantum/%1.kvconfig").arg(themeName);
+ + QString("/Kvantum/%1/%2.kvconfig").arg(lightName).arg(themeName);
if (QFile::exists(temp))
themeSettings_ = new ThemeConfig(temp);
}
- if (!QFile::exists(temp)
- && !isThemeDir(QString(DATADIR) + "/themes", themeName)
- && isThemeDir(QString(DATADIR) + "/themes", lightName))
+ if (!QFile::exists(temp))
{
temp = QString(DATADIR)
- + QString("/Kvantum/%1/%2.svg").arg(lightName).arg(themeName);
- if (!QFile::exists(temp))
+ + QString("/Kvantum/%1/%1.svg").arg(themeName);
+ if (!QFile::exists(temp)) // otherwise the checked root theme was just an SVG image
{
temp = QString(DATADIR)
- + QString("/themes/%1/Kvantum/%2.kvconfig").arg(lightName).arg(themeName);
+ + QString("/themes/%1/Kvantum/%1.kvconfig").arg(themeName);
if (QFile::exists(temp))
themeSettings_ = new ThemeConfig(temp);
}
+
+ if (!QFile::exists(temp)
+ && !isThemeDir(QString(DATADIR) + "/themes", themeName)
+ && isThemeDir(QString(DATADIR) + "/themes", lightName))
+ {
+ temp = QString(DATADIR)
+ + QString("/Kvantum/%1/%2.svg").arg(lightName).arg(themeName);
+ if (!QFile::exists(temp))
+ {
+ temp = QString(DATADIR)
+ + QString("/themes/%1/Kvantum/%2.kvconfig").arg(lightName).arg(themeName);
+ if (QFile::exists(temp))
+ themeSettings_ = new ThemeConfig(temp);
+ }
+ }
}
}
}
@@ -697,33 +721,43 @@ void Style::setTheme(const QString &baseThemeName, bool useDark)
{
if (userConfig.isEmpty()) // otherwise it's a user theme without SVG image
{ // root theme
- temp = QString(DATADIR)
- + QString("/Kvantum/%1/%1.svg").arg(themeName);
- if (QFile::exists(temp))
+ temp = QString("");
+ const QStringList xdgKvantumDirs = QStandardPaths::locateAll(QStandardPaths::GenericDataLocation, QString("Kvantum"), QStandardPaths::LocateDirectory);
+ for (const QString &xdgKvantumDir : xdgKvantumDirs)
{
- themeRndr_ = new QSvgRenderer();
- themeRndr_->load(temp);
+ temp = xdgKvantumDir
+ + QString("/%1/%1.svg").arg(themeName);
+ if (QFile::exists(temp)) {
+ themeRndr_ = new QSvgRenderer();
+ themeRndr_->load(temp);
+ break;
+ }
+ else if (!isThemeDir(xdgKvantumDir, themeName) // svg shouldn't be found
+ && isThemeDir(xdgKvantumDir, lightName))
+ {
+ temp = xdgKvantumDir
+ + QString("/%1/%2.svg").arg(lightName).arg(themeName);
+ if (QFile::exists(temp)) {
+ themeRndr_ = new QSvgRenderer();
+ themeRndr_->load(temp);
+ break;
+ }
+ }
}
- else if (!isThemeDir(QString(DATADIR) + "/Kvantum", themeName) // config shouldn't be found
- && isThemeDir(QString(DATADIR) + "/Kvantum", lightName))
+ if (!QFile::exists(temp))
{
temp = QString(DATADIR)
- + QString("/Kvantum/%1/%2.svg").arg(lightName).arg(themeName);
+ + QString("/Kvantum/%1/%1.svg").arg(themeName);
if (QFile::exists(temp))
{
themeRndr_ = new QSvgRenderer();
themeRndr_->load(temp);
}
- }
-
- if (!QFile::exists(temp))
- {
- temp = QString(DATADIR)
- + QString("/Kvantum/%1/%1.kvconfig").arg(themeName);
- if (!QFile::exists(temp)) // otherwise the checked root theme was just a config file
+ else if (!isThemeDir(QString(DATADIR) + "/Kvantum", themeName) // config shouldn't be found
+ && isThemeDir(QString(DATADIR) + "/Kvantum", lightName))
{
temp = QString(DATADIR)
- + QString("/themes/%1/Kvantum/%1.svg").arg(themeName);
+ + QString("/Kvantum/%1/%2.svg").arg(lightName).arg(themeName);
if (QFile::exists(temp))
{
themeRndr_ = new QSvgRenderer();
@@ -731,22 +765,38 @@ void Style::setTheme(const QString &baseThemeName, bool useDark)
}
}
- if (!QFile::exists(temp)
- && !isThemeDir(QString(DATADIR) + "/themes", themeName)
- && isThemeDir(QString(DATADIR) + "/themes", lightName))
+ if (!QFile::exists(temp))
{
temp = QString(DATADIR)
- + QString("/Kvantum/%1/%2.kvconfig").arg(lightName).arg(themeName);
- if (!QFile::exists(temp))
+ + QString("/Kvantum/%1/%1.kvconfig").arg(themeName);
+ if (!QFile::exists(temp)) // otherwise the checked root theme was just a config file
{
temp = QString(DATADIR)
- + QString("/themes/%1/Kvantum/%2.svg").arg(lightName).arg(themeName);
+ + QString("/themes/%1/Kvantum/%1.svg").arg(themeName);
if (QFile::exists(temp))
{
themeRndr_ = new QSvgRenderer();
themeRndr_->load(temp);
}
}
+
+ if (!QFile::exists(temp)
+ && !isThemeDir(QString(DATADIR) + "/themes", themeName)
+ && isThemeDir(QString(DATADIR) + "/themes", lightName))
+ {
+ temp = QString(DATADIR)
+ + QString("/Kvantum/%1/%2.kvconfig").arg(lightName).arg(themeName);
+ if (!QFile::exists(temp))
+ {
+ temp = QString(DATADIR)
+ + QString("/themes/%1/Kvantum/%2.svg").arg(lightName).arg(themeName);
+ if (QFile::exists(temp))
+ {
+ themeRndr_ = new QSvgRenderer();
+ themeRndr_->load(temp);
+ }
+ }
+ }
}
}
}
@@ -756,32 +806,41 @@ void Style::setTheme(const QString &baseThemeName, bool useDark)
QString _themeName = themeName.left(themeName.length() - 1);
if (!_themeName.isEmpty() && !_themeName.contains(QLatin1String("#")))
{
- temp = QString(DATADIR)
- + QString("/Kvantum/%1/%1.svg").arg(_themeName);
- if (QFile::exists(temp))
+ temp = QString("");
+ const QStringList xdgKvantumDirs = QStandardPaths::locateAll(QStandardPaths::GenericDataLocation, QString("Kvantum"), QStandardPaths::LocateDirectory);
+ for (const QString &xdgKvantumDir : xdgKvantumDirs)
{
- themeRndr_ = new QSvgRenderer();
- themeRndr_->load(temp);
+ temp = xdgKvantumDir
+ + QString("/%1/%1.svg").arg(_themeName);
+ if (QFile::exists(temp)) {
+ themeRndr_ = new QSvgRenderer();
+ themeRndr_->load(temp);
+ break;
+ }
+ else if (isThemeDir(xdgKvantumDir, lightName))
+ {
+ temp = xdgKvantumDir
+ + QString("/%1/%2.svg").arg(lightName).arg(_themeName);
+ if (QFile::exists(temp)) {
+ themeRndr_ = new QSvgRenderer();
+ themeRndr_->load(temp);
+ break;
+ }
+ }
}
- else if (isThemeDir(QString(DATADIR) + "/Kvantum", lightName))
+ if (!QFile::exists(temp))
{
temp = QString(DATADIR)
- + QString("/Kvantum/%1/%2.svg").arg(lightName).arg(_themeName);
+ + QString("/Kvantum/%1/%1.svg").arg(_themeName);
if (QFile::exists(temp))
{
themeRndr_ = new QSvgRenderer();
themeRndr_->load(temp);
}
- }
-
- if (!QFile::exists(temp))
- {
- temp = QString(DATADIR)
- + QString("/Kvantum/%1/%1.kvconfig").arg(_themeName);
- if (!QFile::exists(temp)) // otherwise the checked root theme was just a config file
+ else if (isThemeDir(QString(DATADIR) + "/Kvantum", lightName))
{
temp = QString(DATADIR)
- + QString("/themes/%1/Kvantum/%1.svg").arg(_themeName);
+ + QString("/Kvantum/%1/%2.svg").arg(lightName).arg(_themeName);
if (QFile::exists(temp))
{
themeRndr_ = new QSvgRenderer();
@@ -789,22 +848,38 @@ void Style::setTheme(const QString &baseThemeName, bool useDark)
}
}
- if (!QFile::exists(temp)
- && !isThemeDir(QString(DATADIR) + "/themes", _themeName)
- && isThemeDir(QString(DATADIR) + "/themes", lightName))
+ if (!QFile::exists(temp))
{
temp = QString(DATADIR)
- + QString("/Kvantum/%1/%2.kvconfig").arg(lightName).arg(_themeName);
- if (!QFile::exists(temp))
+ + QString("/Kvantum/%1/%1.kvconfig").arg(_themeName);
+ if (!QFile::exists(temp)) // otherwise the checked root theme was just a config file
{
temp = QString(DATADIR)
- + QString("/themes/%1/Kvantum/%2.svg").arg(lightName).arg(_themeName);
+ + QString("/themes/%1/Kvantum/%1.svg").arg(_themeName);
if (QFile::exists(temp))
{
themeRndr_ = new QSvgRenderer();
themeRndr_->load(temp);
}
}
+
+ if (!QFile::exists(temp)
+ && !isThemeDir(QString(DATADIR) + "/themes", _themeName)
+ && isThemeDir(QString(DATADIR) + "/themes", lightName))
+ {
+ temp = QString(DATADIR)
+ + QString("/Kvantum/%1/%2.kvconfig").arg(lightName).arg(_themeName);
+ if (!QFile::exists(temp))
+ {
+ temp = QString(DATADIR)
+ + QString("/themes/%1/Kvantum/%2.svg").arg(lightName).arg(_themeName);
+ if (QFile::exists(temp))
+ {
+ themeRndr_ = new QSvgRenderer();
+ themeRndr_->load(temp);
+ }
+ }
+ }
}
}
}

View file

@ -372,7 +372,9 @@ Qt. Some of its features include:
(file-name (git-file-name name version))
(sha256
(base32
"17fjhnc8dpxb27dmv1c8mkcy2jwdny06zzqgd9zpamlqi97alp0v"))))
"17fjhnc8dpxb27dmv1c8mkcy2jwdny06zzqgd9zpamlqi97alp0v"))
(patches
(search-patches "kvantum-1.1.5-xdg-dirs-support.patch"))))
(build-system qt-build-system)
(arguments
(list