From 4cd2862ee5bf6e0e1769585e49eed0dc6bd455da Mon Sep 17 00:00:00 2001 From: Rex Dieter Date: Mon, 7 Mar 2016 09:21:30 -0600 Subject: [PATCH] backport "Avoid blocking DBus calls in SNI startup" (kde#359611) --- ...DataEngine-ProtocolVersion-is-an-int.patch | 28 ++++++ ...d-blocking-DBus-calls-in-SNI-startup.patch | 89 +++++++++++++++++++ plasma-workspace.spec | 9 +- 3 files changed, 125 insertions(+), 1 deletion(-) create mode 100644 0036-SNI-DataEngine-ProtocolVersion-is-an-int.patch create mode 100644 0127-Avoid-blocking-DBus-calls-in-SNI-startup.patch diff --git a/0036-SNI-DataEngine-ProtocolVersion-is-an-int.patch b/0036-SNI-DataEngine-ProtocolVersion-is-an-int.patch new file mode 100644 index 0000000..92829ec --- /dev/null +++ b/0036-SNI-DataEngine-ProtocolVersion-is-an-int.patch @@ -0,0 +1,28 @@ +From 36586dacd06fbd2af89c88aa1ea2ea54790608f4 Mon Sep 17 00:00:00 2001 +From: Kai Uwe Broulik +Date: Sat, 2 Jan 2016 13:33:44 +0100 +Subject: [PATCH 036/152] [SNI DataEngine] ProtocolVersion is an int + +Obviously. + +REVIEW: 126594 +--- + dataengines/statusnotifieritem/statusnotifieritem_engine.cpp | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/dataengines/statusnotifieritem/statusnotifieritem_engine.cpp b/dataengines/statusnotifieritem/statusnotifieritem_engine.cpp +index 67c2ec5..08a8c86 100644 +--- a/dataengines/statusnotifieritem/statusnotifieritem_engine.cpp ++++ b/dataengines/statusnotifieritem/statusnotifieritem_engine.cpp +@@ -90,7 +90,7 @@ 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").toBool() == s_protocolVersion) { ++ m_statusNotifierWatcher->property("ProtocolVersion").toInt() == s_protocolVersion) { + connect(m_statusNotifierWatcher, &OrgKdeStatusNotifierWatcherInterface::StatusNotifierItemRegistered, this, &StatusNotifierItemEngine::serviceRegistered); + connect(m_statusNotifierWatcher, &OrgKdeStatusNotifierWatcherInterface::StatusNotifierItemUnregistered, this, &StatusNotifierItemEngine::serviceUnregistered); + +-- +2.5.0 + diff --git a/0127-Avoid-blocking-DBus-calls-in-SNI-startup.patch b/0127-Avoid-blocking-DBus-calls-in-SNI-startup.patch new file mode 100644 index 0000000..e921db3 --- /dev/null +++ b/0127-Avoid-blocking-DBus-calls-in-SNI-startup.patch @@ -0,0 +1,89 @@ +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 + diff --git a/plasma-workspace.spec b/plasma-workspace.spec index 10007dc..b17dd3c 100644 --- a/plasma-workspace.spec +++ b/plasma-workspace.spec @@ -8,7 +8,7 @@ Name: plasma-workspace Summary: Plasma workspace, applications and applets Version: 5.5.5 %global full_version 5.5.5.2 -Release: 2%{?dist} +Release: 3%{?dist} License: GPLv2+ URL: https://projects.kde.org/plasma-workspace @@ -43,9 +43,11 @@ Patch1: kde-runtime-4.9.0-installdbgsymbols.patch ## upstream Patches # master branch +Patch136: 0036-SNI-DataEngine-ProtocolVersion-is-an-int.patch Patch199: 0099-Use-ConfigureNotify-instead-of-xcb_configure_window-.patch Patch200: 0100-Add-transparency-support-for-tray-icon.patch Patch201: 0101-Check-whether-there-is-any-BadWindow-error-before-mo.patch +Patch227: 0127-Avoid-blocking-DBus-calls-in-SNI-startup.patch ## master branch Patches @@ -362,9 +364,11 @@ sed -i -e "s|@DEFAULT_LOOKANDFEEL@|%{?default_lookandfeel}%{!?default_lookandfee %patch13 -p1 -b .startplasmacompositor %patch14 -p1 -b .plasmawayland +%patch136 -p1 -b .036 %patch199 -p1 -b .199 %patch200 -p1 -b .200 %patch201 -p1 -b .201 +%patch227 -p1 -b .227 %build @@ -577,6 +581,9 @@ fi %changelog +* Mon Mar 07 2016 Rex Dieter 5.5.5-3 +- backport "Avoid blocking DBus calls in SNI startup" (kde#359611) + * Wed Mar 03 2016 Daniel Vrátil - 5.5.5-2 - Upstream respun tarball