Don't own unique name for QDBusTrayIcon

Flatpak doesn't allow to own random name with PID. Even after adding
such a permission into manifest, all flatpaked apps have PID 2, so only
one Qt application at a time can have tray icon.

Even though unique name is a part of the spec, no tray hosts really
check it and SNI implementations without unique name run just fine
inside and outside of Flatpak.

This fixes the inability of Qt applications to have tray icon in Flatpak
outside of KDE.

Change-Id: Ieea6dc335b7a74537a51929f6e70ca68c84228fb
Reviewed-by: Dmitry Shachnev <mitya57@gmail.com>
Reviewed-by: Shawn Rutledge <shawn.rutledge@qt.io>
(cherry picked from commit 9db7cc79a26ced4997277b5c206ca15949133240)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
This commit is contained in:
Ilya Fedin 2021-04-12 12:09:59 +04:00 committed by Qt Cherry-pick Bot
parent b4580e9ea9
commit e066c4d4bf
2 changed files with 5 additions and 14 deletions

View File

@ -106,13 +106,7 @@ void QDBusMenuConnection::unregisterTrayIconMenu(QDBusTrayIcon *item)
bool QDBusMenuConnection::registerTrayIcon(QDBusTrayIcon *item)
{
bool success = connection().registerService(item->instanceId());
if (!success) {
qWarning() << "failed to register service" << item->instanceId();
return false;
}
success = connection().registerObject(StatusNotifierItemPath, item);
bool success = connection().registerObject(StatusNotifierItemPath, item);
if (!success) {
unregisterTrayIcon(item);
qWarning() << "failed to register" << item->instanceId() << StatusNotifierItemPath;
@ -127,21 +121,18 @@ bool QDBusMenuConnection::registerTrayIcon(QDBusTrayIcon *item)
bool QDBusMenuConnection::registerTrayIconWithWatcher(QDBusTrayIcon *item)
{
Q_UNUSED(item);
QDBusMessage registerMethod = QDBusMessage::createMethodCall(
StatusNotifierWatcherService, StatusNotifierWatcherPath, StatusNotifierWatcherService,
QLatin1String("RegisterStatusNotifierItem"));
registerMethod.setArguments(QVariantList() << item->instanceId());
registerMethod.setArguments(QVariantList() << m_connection.baseService());
return m_connection.callWithCallback(registerMethod, this, SIGNAL(trayIconRegistered()), SLOT(dbusError(QDBusError)));
}
bool QDBusMenuConnection::unregisterTrayIcon(QDBusTrayIcon *item)
void QDBusMenuConnection::unregisterTrayIcon(QDBusTrayIcon *item)
{
unregisterTrayIconMenu(item);
connection().unregisterObject(StatusNotifierItemPath);
bool success = connection().unregisterService(item->instanceId());
if (!success)
qWarning() << "failed to unregister service" << item->instanceId();
return success;
}
#endif // QT_NO_SYSTEMTRAYICON

View File

@ -79,7 +79,7 @@ public:
void unregisterTrayIconMenu(QDBusTrayIcon *item);
bool registerTrayIcon(QDBusTrayIcon *item);
bool registerTrayIconWithWatcher(QDBusTrayIcon *item);
bool unregisterTrayIcon(QDBusTrayIcon *item);
void unregisterTrayIcon(QDBusTrayIcon *item);
#endif // QT_NO_SYSTEMTRAYICON
Q_SIGNALS: