1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
|
From 1c97e1d9741fd15962474f47932dd09728dae76b Mon Sep 17 00:00:00 2001
From: David Edmundson <kde@davidedmundson.co.uk>
Date: Fri, 28 Jul 2017 13:04:50 +0100
Subject: [PATCH] Don't block starting notification service
Summary:
We don't need to manually start the DBus service.
It blocks the calling app, and dbusServiceExists means that we will
always end up going the DBus route over a popup anyway, so it won't
do anything useful.
The service (in the plasma case plasma-wait-for-name) will be started
automatically when we actually send the notification.
Also fix d-dbusServiceExists being cleared to false when the first
service owner exits.
BUG: 382444
Subscribers: #frameworks
Tags: #frameworks
Differential Revision: https://phabricator.kde.org/D6963
---
src/notifybypopup.cpp | 28 +++++++++++-----------------
1 file changed, 11 insertions(+), 17 deletions(-)
diff --git a/src/notifybypopup.cpp b/src/notifybypopup.cpp
index 735d52b..4f244e1 100644
--- a/src/notifybypopup.cpp
+++ b/src/notifybypopup.cpp
@@ -109,6 +109,9 @@ public:
* Specifies if DBus Notifications interface exists on session bus
*/
bool dbusServiceExists;
+
+ bool dbusServiceActivatable;
+
/**
* DBus notification daemon capabilities cache.
* Do not use this variable. Use #popupServerCapabilities() instead.
@@ -161,6 +164,7 @@ NotifyByPopup::NotifyByPopup(QObject *parent)
{
d->animationTimer = 0;
d->dbusServiceExists = false;
+ d->dbusServiceActivatable = false;
d->dbusServiceCapCacheDirty = true;
d->nextPosition = -1;
@@ -180,32 +184,20 @@ NotifyByPopup::NotifyByPopup(QObject *parent)
connect(watcher, SIGNAL(serviceOwnerChanged(QString,QString,QString)),
SLOT(onServiceOwnerChanged(QString,QString,QString)));
+#ifndef Q_WS_WIN
if (!d->dbusServiceExists) {
- bool startfdo = false;
-#ifdef Q_WS_WIN
- startfdo = true;
-#else
QDBusMessage message = QDBusMessage::createMethodCall(QStringLiteral("org.freedesktop.DBus"),
QStringLiteral("/org/freedesktop/DBus"),
QStringLiteral("org.freedesktop.DBus"),
QStringLiteral("ListActivatableNames"));
-
- // FIXME - this should be async
QDBusReply<QStringList> reply = QDBusConnection::sessionBus().call(message);
if (reply.isValid() && reply.value().contains(dbusServiceName)) {
- startfdo = true;
- // We need to set d->dbusServiceExists to true because dbus might be too slow
- // starting the service and the first call to NotifyByPopup::notify
- // might not have had the service up, by setting this to true we
- // guarantee it will still go through dbus and dbus will do the correct
- // thing and wait for the service to go up
+ d->dbusServiceActivatable = true;
+ //if the service is activatable, we can assume it exists even if it is not currently running
d->dbusServiceExists = true;
}
-#endif
- if (startfdo) {
- QDBusConnection::sessionBus().interface()->startService(dbusServiceName);
- }
}
+#endif
}
@@ -439,7 +431,9 @@ void NotifyByPopup::onServiceOwnerChanged(const QString &serviceName, const QStr
if (newOwner.isEmpty()) {
d->notificationQueue.clear();
- d->dbusServiceExists = false;
+ if (!d->dbusServiceActivatable) {
+ d->dbusServiceExists = false;
+ }
} else if (oldOwner.isEmpty()) {
d->dbusServiceExists = true;
--
2.13.5
|