You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
plasma-workspace/0127-Avoid-blocking-DBus-ca...

90 lines
4.3 KiB

From 49440a7ce0623d1bc8aca459eaed35612d384cfd Mon Sep 17 00:00:00 2001
From: David Edmundson <david@davidedmundson.co.uk>
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 <QStringList>
#include "statusnotifieritemsource.h"
+#include "dbusproperties.h"
+
#include <QDebug>
#include <iostream>
@@ -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<QDBusVariant> pendingItems = propetriesIface.Get(m_statusNotifierWatcher->interface(), "RegisteredStatusNotifierItems");
+
+ QDBusPendingCallWatcher *watcher = new QDBusPendingCallWatcher(pendingItems, this);
+ connect(watcher, &QDBusPendingCallWatcher::finished, this, [=]() {
+ watcher->deleteLater();
+ QDBusReply<QDBusVariant> 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<QStringList>();
- foreach (const QString &service, registeredItems) {
- newItem(service);
- }
} else {
delete m_statusNotifierWatcher;
m_statusNotifierWatcher = 0;
--
2.5.0