1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
|
From 13181b03eac3c85f0649d5399d8c3037c388928c Mon Sep 17 00:00:00 2001
From: Jan Blackquill <uhhadd@gmail.com>
Date: Thu, 25 Nov 2021 14:51:06 -0500
Subject: [PATCH] KIconLoader: prefer icons from current theme before falling
back to other themes
BUG: 445804
---
autotests/kiconloader_unittest.cpp | 25 ++++++++++++++++++++++
src/kiconloader.cpp | 34 ++++++------------------------
2 files changed, 32 insertions(+), 27 deletions(-)
diff --git a/autotests/kiconloader_unittest.cpp b/autotests/kiconloader_unittest.cpp
index 813215d..c232111 100644
--- a/autotests/kiconloader_unittest.cpp
+++ b/autotests/kiconloader_unittest.cpp
@@ -112,6 +112,12 @@ private Q_SLOTS:
QVERIFY(QFile::copy(QStringLiteral(":/test-22x22.png"), testIconsDir.filePath(QStringLiteral("breeze/22x22/mimetypes/unknown.png"))));
QVERIFY(QFile::copy(QStringLiteral(":/coloredsvgicon.svg"), testIconsDir.filePath(QStringLiteral("breeze/22x22/apps/coloredsvgicon.svg"))));
+ // prepare some icons for our actions test
+ // when querying breeze for 'one-two', we expect
+ // 'one' from breeze instead of oxygen's 'one-two'.
+ QVERIFY(QFile::copy(QStringLiteral(":/test-22x22.png"), testIconsDir.filePath(QStringLiteral("oxygen/22x22/actions/one-two.png"))));
+ QVERIFY(QFile::copy(QStringLiteral(":/test-22x22.png"), testIconsDir.filePath(QStringLiteral("breeze/22x22/actions/one.png"))));
+
QVERIFY(QFile::setPermissions(breezeThemeFile, QFileDevice::ReadOwner | QFileDevice::WriteOwner));
KConfig configFile(breezeThemeFile);
KConfigGroup iconThemeGroup = configFile.group("Icon Theme");
@@ -332,6 +338,25 @@ private Q_SLOTS:
QVERIFY(QFile::exists(unknownPath));
}
+ void testCorrectFallback()
+ {
+ // we want to prefer icons from the same theme
+
+ // so if we have something like:
+ /*
+ oxygen:
+ one-two
+
+ breeze:
+ one
+ */
+ // and we ask for 'one-two', we expect to see 'one' from breeze instead
+ // of 'one-two' from oxygen.
+ QString path;
+ KIconLoader::global()->loadIcon(QStringLiteral("one-two"), KIconLoader::Desktop, 24, KIconLoader::DefaultState, QStringList(), &path);
+ QVERIFY(path.contains("breeze/22x22/actions"));
+ }
+
void testPathStore()
{
QString path;
diff --git a/src/kiconloader.cpp b/src/kiconloader.cpp
index 4d4181d..8a644d4 100644
--- a/src/kiconloader.cpp
+++ b/src/kiconloader.cpp
@@ -1021,12 +1021,7 @@ QString KIconLoaderPrivate::findMatchingIcon(const QString &name, int size, qrea
{
const_cast<KIconLoaderPrivate *>(this)->initIconThemes();
- // Do two passes through themeNodes.
- //
- // The first pass looks for an exact match in each themeNode one after the other.
- // If one is found and it is an app icon then return that icon.
- //
- // In the next pass (assuming the first pass failed), it looks for
+ // This looks for the exact match and its
// generic fallbacks in each themeNode one after the other.
// In theory we should only do this for mimetype icons, not for app icons,
@@ -1036,22 +1031,17 @@ QString KIconLoaderPrivate::findMatchingIcon(const QString &name, int size, qrea
// Once everyone uses that to look up mimetype icons, we can kill the fallback code
// from this method.
- for (KIconThemeNode *themeNode : std::as_const(links)) {
- const QString path = themeNode->theme->iconPathByName(name, size, KIconLoader::MatchBest, scale);
- if (!path.isEmpty()) {
- return path;
- }
- }
-
- if (name.endsWith(QLatin1String("-x-generic"))) {
- return QString(); // no further fallback
- }
- bool genericFallback = false;
+ bool genericFallback = name.endsWith(QLatin1String("-x-generic"));;
QString path;
for (KIconThemeNode *themeNode : std::as_const(links)) {
QString currentName = name;
while (!currentName.isEmpty()) {
+ path = themeNode->theme->iconPathByName(currentName, size, KIconLoader::MatchBest, scale);
+ if (!path.isEmpty()) {
+ return path;
+ }
+
if (genericFallback) {
// we already tested the base name
break;
@@ -1088,16 +1078,6 @@ QString KIconLoaderPrivate::findMatchingIcon(const QString &name, int size, qrea
break;
}
}
-
- if (currentName.isEmpty()) {
- break;
- }
-
- // qCDebug(KICONTHEMES) << "Looking up" << currentName;
- path = themeNode->theme->iconPathByName(currentName, size, KIconLoader::MatchBest, scale);
- if (!path.isEmpty()) {
- return path;
- }
}
}
--
GitLab
|