Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Toggle main menu visibility
Loading...
Searching...
No Matches
qdbusmenuconnection.cpp
Go to the documentation of this file.
1
// Copyright (C) 2016 The Qt Company Ltd.
2
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3
// Qt-Security score:significant reason:default
4
5
#
include
<
QtGui
/
qtgui
-
config
.
h
>
6
7
#
include
<
QDBusMessage
>
8
#
include
<
QDBusInterface
>
9
#
include
<
QDBusServiceWatcher
>
10
#
include
<
QDBusConnectionInterface
>
11
#
include
<
QDebug
>
12
#
include
<
QCoreApplication
>
13
14
#
ifndef
QT_NO_SYSTEMTRAYICON
15
#
include
<
private
/
qdbustrayicon_p
.
h
>
16
#
endif
17
#
include
<
private
/
qdbusmenuconnection_p
.
h
>
18
#
include
<
private
/
qdbusmenuadaptor_p
.
h
>
19
#
include
<
private
/
qdbusplatformmenu_p
.
h
>
20
21
QT_BEGIN_NAMESPACE
22
23
using
namespace
Qt::StringLiterals;
24
25
const
QString
StatusNotifierWatcherService
=
"org.kde.StatusNotifierWatcher"_L1
;
26
const
QString
StatusNotifierWatcherPath
=
"/StatusNotifierWatcher"_L1
;
27
const
QString
StatusNotifierItemPath
=
"/StatusNotifierItem"_L1
;
28
const
QString
MenuBarPath
=
"/MenuBar"_L1
;
29
30
/*!
31
\class QDBusMenuConnection
32
\internal
33
A D-Bus connection which is used for both menu and tray icon services.
34
Connects to the session bus and registers with the respective watcher services.
35
*/
36
QDBusMenuConnection::QDBusMenuConnection(QObject *parent,
const
QString &serviceName)
37
: QObject(parent)
38
, m_serviceName(serviceName)
39
, m_connection(serviceName.isNull() ? QDBusConnection::sessionBus()
40
: QDBusConnection::connectToBus(QDBusConnection::SessionBus, serviceName))
41
, m_dbusWatcher(
new
QDBusServiceWatcher(StatusNotifierWatcherService, m_connection, QDBusServiceWatcher::WatchForRegistration,
this
))
42
, m_watcherRegistered(
false
)
43
{
44
#
ifndef
QT_NO_SYSTEMTRAYICON
45
// Start monitoring if any known tray-related services are registered.
46
if
(m_connection.interface()->isServiceRegistered(StatusNotifierWatcherService))
47
m_watcherRegistered =
true
;
48
else
49
qCDebug(qLcMenu) <<
"failed to find service"
<< StatusNotifierWatcherService;
50
#
endif
51
}
52
53
QDBusMenuConnection::~QDBusMenuConnection()
54
{
55
if
(!m_serviceName.isEmpty() && m_connection.isConnected())
56
QDBusConnection::disconnectFromBus(m_serviceName);
57
}
58
59
void
QDBusMenuConnection::dbusError(
const
QDBusError &error)
60
{
61
qWarning() <<
"QDBusTrayIcon encountered a D-Bus error:"
<< error;
62
}
63
64
#
ifndef
QT_NO_SYSTEMTRAYICON
65
bool
QDBusMenuConnection::registerTrayIconMenu(QDBusTrayIcon *item)
66
{
67
bool
success = connection().registerObject(MenuBarPath, item->menu());
68
if
(!success)
// success == false is normal, because the object may be already registered
69
qCDebug(qLcMenu) <<
"failed to register"
<< item->instanceId() << MenuBarPath;
70
return
success;
71
}
72
73
void
QDBusMenuConnection::unregisterTrayIconMenu(QDBusTrayIcon *item)
74
{
75
if
(item->menu())
76
connection().unregisterObject(MenuBarPath);
77
}
78
79
bool
QDBusMenuConnection::registerTrayIcon(QDBusTrayIcon *item)
80
{
81
bool
success = connection().registerObject(StatusNotifierItemPath, item);
82
if
(!success) {
83
unregisterTrayIcon(item);
84
qWarning() <<
"failed to register"
<< item->instanceId() << StatusNotifierItemPath;
85
return
false
;
86
}
87
88
if
(item->menu())
89
registerTrayIconMenu(item);
90
91
return
registerTrayIconWithWatcher(item);
92
}
93
94
bool
QDBusMenuConnection::registerTrayIconWithWatcher(QDBusTrayIcon *item)
95
{
96
Q_UNUSED(item);
97
QDBusMessage registerMethod = QDBusMessage::createMethodCall(
98
StatusNotifierWatcherService, StatusNotifierWatcherPath, StatusNotifierWatcherService,
99
"RegisterStatusNotifierItem"_L1
);
100
registerMethod.setArguments(QVariantList() << m_connection.baseService());
101
return
m_connection.callWithCallback(registerMethod,
this
, SIGNAL(trayIconRegistered()), SLOT(dbusError(QDBusError)));
102
}
103
104
void
QDBusMenuConnection::unregisterTrayIcon(QDBusTrayIcon *item)
105
{
106
unregisterTrayIconMenu(item);
107
connection().unregisterObject(StatusNotifierItemPath);
108
}
109
#
endif
// QT_NO_SYSTEMTRAYICON
110
111
QT_END_NAMESPACE
112
113
#
include
"moc_qdbusmenuconnection_p.cpp"
StatusNotifierWatcherService
const QString StatusNotifierWatcherService
Definition
qdbusmenuconnection.cpp:25
StatusNotifierWatcherPath
const QString StatusNotifierWatcherPath
Definition
qdbusmenuconnection.cpp:26
StatusNotifierItemPath
const QString StatusNotifierItemPath
Definition
qdbusmenuconnection.cpp:27
MenuBarPath
const QString MenuBarPath
Definition
qdbusmenuconnection.cpp:28
qtbase
src
gui
platform
unix
dbusmenu
qdbusmenuconnection.cpp
Generated on
for Qt by
1.18.0