From: Fabian Vogt 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 cache; if (variant.canConvert()) { 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'"; }