plasma5-workspace/add-tray-icon-cache.patch

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'";
}