From 49440a7ce0623d1bc8aca459eaed35612d384cfd Mon Sep 17 00:00:00 2001 From: David Edmundson Date: Mon, 29 Feb 2016 11:08:24 +0000 Subject: [PATCH 127/152] Avoid blocking DBus calls in SNI startup All autogenerated qtdbus property fetches are synchronous and not ideal for Plasma to call. 1) Don't bother checking the protocol version. If the signals are the same, we may as well try and use the old signals, if it's not - the signals won't match anything anyway so it won't do anything anyway. 2) Replace the blocking RegisteredStatusNotifierItem request with an async variant. CCBUG: 359611 REVIEW: 127199 --- dataengines/statusnotifieritem/CMakeLists.txt | 1 + .../statusnotifieritem_engine.cpp | 28 +++++++++++++++------- 2 files changed, 21 insertions(+), 8 deletions(-) diff --git a/dataengines/statusnotifieritem/CMakeLists.txt b/dataengines/statusnotifieritem/CMakeLists.txt index c28312e..2e93583 100644 --- a/dataengines/statusnotifieritem/CMakeLists.txt +++ b/dataengines/statusnotifieritem/CMakeLists.txt @@ -17,6 +17,7 @@ set(statusnotifieritem_engine_SRCS set(statusnotifierwatcher_xml ${KNOTIFICATIONS_DBUS_INTERFACES_DIR}/kf5_org.kde.StatusNotifierWatcher.xml) qt5_add_dbus_interface(statusnotifieritem_engine_SRCS ${statusnotifierwatcher_xml} statusnotifierwatcher_interface) +qt5_add_dbus_interface(statusnotifieritem_engine_SRCS ../mpris2/org.freedesktop.DBus.Properties.xml dbusproperties) set(statusnotifieritem_xml ${KNOTIFICATIONS_DBUS_INTERFACES_DIR}/kf5_org.kde.StatusNotifierItem.xml) diff --git a/dataengines/statusnotifieritem/statusnotifieritem_engine.cpp b/dataengines/statusnotifieritem/statusnotifieritem_engine.cpp index 08a8c86..ae99a80 100644 --- a/dataengines/statusnotifieritem/statusnotifieritem_engine.cpp +++ b/dataengines/statusnotifieritem/statusnotifieritem_engine.cpp @@ -20,8 +20,11 @@ ***************************************************************************/ #include "statusnotifieritem_engine.h" +#include #include "statusnotifieritemsource.h" +#include "dbusproperties.h" + #include #include @@ -89,17 +92,26 @@ void StatusNotifierItemEngine::registerWatcher(const QString& service) m_statusNotifierWatcher = new org::kde::StatusNotifierWatcher(s_watcherServiceName, QStringLiteral("/StatusNotifierWatcher"), QDBusConnection::sessionBus()); - if (m_statusNotifierWatcher->isValid() && - m_statusNotifierWatcher->property("ProtocolVersion").toInt() == s_protocolVersion) { + if (m_statusNotifierWatcher->isValid()) { + m_statusNotifierWatcher->call(QDBus::NoBlock, QStringLiteral("RegisterStatusNotifierHost"), m_serviceName); + + OrgFreedesktopDBusPropertiesInterface propetriesIface(m_statusNotifierWatcher->service(), m_statusNotifierWatcher->path(), m_statusNotifierWatcher->connection()); + + QDBusPendingReply pendingItems = propetriesIface.Get(m_statusNotifierWatcher->interface(), "RegisteredStatusNotifierItems"); + + QDBusPendingCallWatcher *watcher = new QDBusPendingCallWatcher(pendingItems, this); + connect(watcher, &QDBusPendingCallWatcher::finished, this, [=]() { + watcher->deleteLater(); + QDBusReply reply = *watcher; + QStringList registeredItems = reply.value().variant().toStringList(); + foreach (const QString &service, registeredItems) { + newItem(service); + } + }); + connect(m_statusNotifierWatcher, &OrgKdeStatusNotifierWatcherInterface::StatusNotifierItemRegistered, this, &StatusNotifierItemEngine::serviceRegistered); connect(m_statusNotifierWatcher, &OrgKdeStatusNotifierWatcherInterface::StatusNotifierItemUnregistered, this, &StatusNotifierItemEngine::serviceUnregistered); - m_statusNotifierWatcher->call(QDBus::NoBlock, QStringLiteral("RegisterStatusNotifierHost"), m_serviceName); - - QStringList registeredItems = m_statusNotifierWatcher->property("RegisteredStatusNotifierItems").value(); - foreach (const QString &service, registeredItems) { - newItem(service); - } } else { delete m_statusNotifierWatcher; m_statusNotifierWatcher = 0; -- 2.5.0