* High load due to animated tray icons OBS-URL: https://build.opensuse.org/package/show/KDE:Frameworks5:LTS/plasma5-workspace?expand=0&rev=22
37 lines
1.8 KiB
Diff
37 lines
1.8 KiB
Diff
From: Fabian Vogt <fabian@ritter-vogt.de>
|
|
Subject: Workaround for high load due to animated tray icons
|
|
References: kde#356479
|
|
|
|
When a tray icon name changes, it always does a full lookup, which is expensive.
|
|
Add a small QHash as cache to work around this.
|
|
|
|
diff --git a/applets/systemtray/systemtray.cpp b/applets/systemtray/systemtray.cpp
|
|
index 66bb5b4..f440ff0 100644
|
|
--- a/applets/systemtray/systemtray.cpp
|
|
+++ b/applets/systemtray/systemtray.cpp
|
|
@@ -127,8 +127,13 @@ void SystemTray::cleanupTask(const QString &task)
|
|
|
|
QVariant SystemTray::resolveIcon(const QVariant &variant, const QString &iconThemePath)
|
|
{
|
|
+ static QHash<QString, QVariant> cache;
|
|
if (variant.canConvert<QString>()) {
|
|
if (!iconThemePath.isEmpty()) {
|
|
+ auto i = cache.find(variant.toString() + iconThemePath);
|
|
+ if(i != cache.end())
|
|
+ return i.value();
|
|
+ qCWarning(SYSTEM_TRAY) << "Cache not hit" << iconThemePath;
|
|
const QString path = iconThemePath;
|
|
if (!path.isEmpty()) {
|
|
// FIXME: If last part of path is not "icons", this won't work!
|
|
@@ -136,7 +141,9 @@ QVariant SystemTray::resolveIcon(const QVariant &variant, const QString &iconThe
|
|
if (tokens.length() >= 3 && tokens.takeLast() == QLatin1String("icons")) {
|
|
const QString appName = tokens.takeLast().toString();
|
|
|
|
- return QVariant(QIcon(new AppIconEngine(variant.toString(), path, appName)));
|
|
+ auto v = QVariant(QIcon(new AppIconEngine(variant.toString(), path, appName)));
|
|
+ cache.insert(variant.toString() + iconThemePath, v);
|
|
+ return v;
|
|
} else {
|
|
qCWarning(SYSTEM_TRAY) << "Wrong IconThemePath" << path << ": too short or does not end with 'icons'";
|
|
}
|