diff --git a/applets/systemtray/plugin/protocols/dbussystemtray/dbussystemtraytask.cpp b/applets/systemtray/plugin/protocols/dbussystemtray/dbussystemtraytask.cpp index 570f54e85..8242d36f8 100644 --- a/applets/systemtray/plugin/protocols/dbussystemtray/dbussystemtraytask.cpp +++ b/applets/systemtray/plugin/protocols/dbussystemtray/dbussystemtraytask.cpp @@ -32,6 +32,7 @@ #include #include +#include #include #include @@ -158,11 +159,7 @@ QVariant DBusSystemTrayTask::customIcon(QVariant variant) const if (hasm_svgIcon(variant)) return variant; - // Otherwise return a QIcon from our custom icon loader. - if (!QIcon::themeSearchPaths().contains(m_iconThemePath)) { - QIcon::setThemeSearchPaths(QStringList(m_iconThemePath) << QIcon::themeSearchPaths()); - } - return QVariant(QIcon::fromTheme(variant.toString())); + return QVariant(QIcon(new KIconEngine(variant.toString(), m_customIconLoader))); } else { // Most importantly QIcons. Nothing to do for those. return variant; @@ -328,15 +325,21 @@ void DBusSystemTrayTask::syncIcons(const Plasma::DataEngine::Data &properties) QStringList tokens = path.split('/', QString::SkipEmptyParts); if (tokens.length() >= 3 && tokens.takeLast() == QLatin1String("icons")) { QString appName = tokens.takeLast(); - QString prefix = QChar('/') + tokens.join("/"); - if (!QIcon::themeSearchPaths().contains(prefix)) { - QIcon::setThemeSearchPaths(QStringList(prefix) << QIcon::themeSearchPaths()); - } + // We use a separate instance of KIconLoader to avoid // adding all application dirs to KIconLoader::global(), to // avoid potential icon name clashes between application // icons - m_customIconLoader = new KIconLoader(appName, QStringList() /* dirs */, this); + m_customIconLoader = new KIconLoader(appName, QStringList(), this); + m_customIconLoader->addAppDir(appName, path); + m_icon = QIcon(new KIconEngine(icon_name, m_customIconLoader)); + // Given we're using custom icon loader to load the icon and IconItem + // would not use this icon loader, we first check if Plasma themed SVG + // exists for this icon and if not, force IconItem to use the QIcon we provide + // instead of trying to lookup the icon by name (and fail) + if (!hasm_svgIcon(icon_name)) { + m_iconName = QString(); + } } else { qWarning() << "Wrong IconThemePath" << path << ": too short or does not end with 'icons'"; } diff --git a/dataengines/statusnotifieritem/CMakeLists.txt b/dataengines/statusnotifieritem/CMakeLists.txt index d5f0a3466..818f3fd1c 100644 --- a/dataengines/statusnotifieritem/CMakeLists.txt +++ b/dataengines/statusnotifieritem/CMakeLists.txt @@ -31,7 +31,6 @@ target_link_libraries(plasma_engine_statusnotifieritem KF5::Service KF5::Plasma KF5::IconThemes - KF5::KDELibs4Support dbusmenu-qt5 ) diff --git a/dataengines/statusnotifieritem/statusnotifieritem_engine.cpp b/dataengines/statusnotifieritem/statusnotifieritem_engine.cpp index 70d203ea9..7f163ed0f 100644 --- a/dataengines/statusnotifieritem/statusnotifieritem_engine.cpp +++ b/dataengines/statusnotifieritem/statusnotifieritem_engine.cpp @@ -23,7 +23,6 @@ #include "statusnotifieritemsource.h" #include -#include #include static const QString s_watcherServiceName("org.kde.StatusNotifierWatcher"); diff --git a/dataengines/statusnotifieritem/statusnotifieritemsource.cpp b/dataengines/statusnotifieritem/statusnotifieritemsource.cpp index 89b337b37..dde197d54 100644 --- a/dataengines/statusnotifieritem/statusnotifieritemsource.cpp +++ b/dataengines/statusnotifieritem/statusnotifieritemsource.cpp @@ -26,10 +26,8 @@ #include #include #include -#include +#include #include -#include -#include #include #include #include @@ -59,7 +57,7 @@ public: protected: virtual QIcon iconForName(const QString &name) { - return KIcon(name, m_iconLoader); + return QIcon(new KIconEngine(name, m_iconLoader)); } private: @@ -211,28 +209,20 @@ void StatusNotifierItemSource::refreshCallback(QDBusPendingCallWatcher *call) //IconThemePath (handle this one first, because it has an impact on //others) QVariantMap properties = reply.argumentAt<0>(); - if (!m_customIconLoader) { - QString path = properties["IconThemePath"].toString(); - if (!path.isEmpty()) { - // FIXME: If last part of path is not "icons", this won't work! - QStringList tokens = path.split('/', QString::SkipEmptyParts); - if (tokens.length() >= 3 && tokens.takeLast() == "icons") { - QString appName = tokens.takeLast(); - QString prefix = '/' + tokens.join("/"); - // FIXME: Fix KIconLoader and KIconTheme so that we can use - // our own instance of KStandardDirs - KGlobal::dirs()->addResourceDir("data", prefix); - // We use a separate instance of KIconLoader to avoid - // adding all application dirs to KIconLoader::global(), to - // avoid potential icon name clashes between application - // icons - m_customIconLoader = new KIconLoader(appName, QStringList() /* dirs */, this); - } else { - qWarning() << "Wrong IconThemePath" << path << ": too short or does not end with 'icons'"; - } + QString path = properties["IconThemePath"].toString(); + if (!path.isEmpty()) { + // FIXME: If last part of path is not "icons", this won't work! + QStringList tokens = path.split('/', QString::SkipEmptyParts); + if (tokens.length() >= 3 && tokens.takeLast() == "icons") { + QString appName = tokens.takeLast(); + + m_customIconLoader = new KIconLoader(appName, QStringList(), this); + m_customIconLoader->addAppDir(appName, path); + } else { + qWarning() << "Wrong IconThemePath" << path << ": too short or does not end with 'icons'"; } } - setData("IconThemePath", properties["IconThemePath"]); + setData("IconThemePath", path); setData("Category", properties["Category"]); setData("Status", properties["Status"]); @@ -259,7 +249,7 @@ void StatusNotifierItemSource::refreshCallback(QDBusPendingCallWatcher *call) setData("OverlayIconName", iconName); if (!iconName.isEmpty()) { overlayNames << iconName; - overlay = KIcon(iconName, iconLoader()); + overlay = QIcon(new KIconEngine(iconName, iconLoader())); } } else { overlay = imageVectorToPixmap(image); @@ -269,7 +259,7 @@ void StatusNotifierItemSource::refreshCallback(QDBusPendingCallWatcher *call) if (image.isEmpty()) { iconName = properties["IconName"].toString(); if (!iconName.isEmpty()) { - icon = KIcon(iconName, iconLoader(), overlayNames); + icon = QIcon(new KIconEngine(iconName, iconLoader())); if (overlayNames.isEmpty() && !overlay.isNull()) { overlayIcon(&icon, &overlay); @@ -295,7 +285,7 @@ void StatusNotifierItemSource::refreshCallback(QDBusPendingCallWatcher *call) QString iconName = properties["AttentionIconName"].toString(); setData("AttentionIconName", iconName); if (!iconName.isEmpty()) { - attentionIcon = KIcon(iconName, iconLoader(), overlayNames); + attentionIcon = QIcon(new KIconEngine(iconName, iconLoader())); if (overlayNames.isEmpty() && !overlay.isNull()) { overlayIcon(&attentionIcon, &overlay); @@ -321,7 +311,7 @@ void StatusNotifierItemSource::refreshCallback(QDBusPendingCallWatcher *call) } else { QIcon toolTipIcon; if (toolTip.image.size() == 0) { - toolTipIcon = KIcon(toolTip.icon, iconLoader()); + toolTipIcon = QIcon(new KIconEngine(toolTip.icon, iconLoader())); } else { toolTipIcon = imageVectorToPixmap(toolTip.image); }