diff --git a/libnotificationmanager/notification.h b/libnotificationmanager/notification.h --- a/libnotificationmanager/notification.h +++ b/libnotificationmanager/notification.h @@ -53,6 +53,9 @@ uint id() const; + QString dBusService() const; + void setDBusService(const QString &dBusService); + QDateTime created() const; QDateTime updated() const; diff --git a/libnotificationmanager/notification.cpp b/libnotificationmanager/notification.cpp --- a/libnotificationmanager/notification.cpp +++ b/libnotificationmanager/notification.cpp @@ -479,6 +479,16 @@ return d->id; } +QString Notification::dBusService() const +{ + return d->dBusService; +} + +void Notification::setDBusService(const QString &dBusService) +{ + d->dBusService = dBusService; +} + QDateTime Notification::created() const { return d->created; diff --git a/libnotificationmanager/notification_p.h b/libnotificationmanager/notification_p.h --- a/libnotificationmanager/notification_p.h +++ b/libnotificationmanager/notification_p.h @@ -58,6 +58,8 @@ void setUrgency(Notifications::Urgency urgency); uint id = 0; + // Bus name of the creator/sender + QString dBusService; QDateTime created; QDateTime updated; bool read = false; diff --git a/libnotificationmanager/notificationsmodel.cpp b/libnotificationmanager/notificationsmodel.cpp --- a/libnotificationmanager/notificationsmodel.cpp +++ b/libnotificationmanager/notificationsmodel.cpp @@ -458,7 +458,7 @@ return; } - Server::self().reply(notificationId, text); + Server::self().reply(notification.dBusService(), notificationId, text); } void NotificationsModel::startTimeout(uint notificationId) diff --git a/libnotificationmanager/server.h b/libnotificationmanager/server.h --- a/libnotificationmanager/server.h +++ b/libnotificationmanager/server.h @@ -151,11 +151,12 @@ /** * Sends a notification reply text * + * @param dbusService The bus name of the receiving application * @param id The notification ID * @param text The reply message text * @since 5.18 */ - void reply(uint id, const QString &text); + void reply(const QString &dbusService, uint id, const QString &text); /** * Adds a notification diff --git a/libnotificationmanager/server.cpp b/libnotificationmanager/server.cpp --- a/libnotificationmanager/server.cpp +++ b/libnotificationmanager/server.cpp @@ -80,9 +80,9 @@ emit d->ActionInvoked(notificationId, actionName); } -void Server::reply(uint notificationId, const QString &text) +void Server::reply(const QString &dbusService, uint notificationId, const QString &text) { - emit d->NotificationReplied(notificationId, text); + d->sendReplyText(dbusService, notificationId, text); } uint Server::add(const Notification ¬ification) diff --git a/libnotificationmanager/server_p.h b/libnotificationmanager/server_p.h --- a/libnotificationmanager/server_p.h +++ b/libnotificationmanager/server_p.h @@ -73,6 +73,7 @@ void NotificationClosed(uint id, uint reason); void ActionInvoked(uint id, const QString &actionKey); // non-standard + // This is manually emitted as targeted signal in sendReplyText() void NotificationReplied(uint id, const QString &text); void validChanged(); @@ -87,9 +88,12 @@ public: // stuff used by public class friend class ServerInfo; static QString notificationServiceName(); + static QString notificationServicePath(); + static QString notificationServiceInterface(); bool init(); uint add(const Notification ¬ification); + void sendReplyText(const QString &dbusService, uint notificationId, const QString &text); ServerInfo *currentOwner() const; diff --git a/libnotificationmanager/server_p.cpp b/libnotificationmanager/server_p.cpp --- a/libnotificationmanager/server_p.cpp +++ b/libnotificationmanager/server_p.cpp @@ -58,6 +58,16 @@ return QStringLiteral("org.freedesktop.Notifications"); } +QString ServerPrivate::notificationServicePath() +{ + return QStringLiteral("/org/freedesktop/Notifications"); +} + +QString ServerPrivate::notificationServiceInterface() +{ + return notificationServiceName(); +} + ServerInfo *ServerPrivate::currentOwner() const { if (!m_currentOwner) { @@ -76,7 +86,7 @@ new NotificationsAdaptor(this); if (!m_dbusObjectValid) { // if already registered, don't fail here - m_dbusObjectValid = QDBusConnection::sessionBus().registerObject(QStringLiteral("/org/freedesktop/Notifications"), this); + m_dbusObjectValid = QDBusConnection::sessionBus().registerObject(notificationServicePath(), this); } if (!m_dbusObjectValid) { @@ -142,6 +152,7 @@ } Notification notification(notificationId); + notification.setDBusService(message().service()); notification.setSummary(summary); notification.setBody(body); notification.setApplicationName(app_name); @@ -303,6 +314,20 @@ return notification.id(); } +void ServerPrivate::sendReplyText(const QString &dbusService, uint notificationId, const QString &text) +{ + if (dbusService.isEmpty()) { + qCWarning(NOTIFICATIONMANAGER) << "Sending notification reply text for notification" << notificationId << "untargeted"; + } + + QDBusMessage msg = QDBusMessage::createTargetedSignal(dbusService, + notificationServicePath(), + notificationServiceName(), + QStringLiteral("NotificationReplied")); + msg.setArguments({notificationId, text}); + QDBusConnection::sessionBus().send(msg); +} + uint ServerPrivate::Inhibit(const QString &desktop_entry, const QString &reason, const QVariantMap &hints) { const QString dbusService = message().service(); @@ -384,13 +409,13 @@ { // emit DBus change signal... QDBusMessage signal = QDBusMessage::createSignal( - QStringLiteral("/org/freedesktop/Notifications"), + notificationServicePath(), QStringLiteral("org.freedesktop.DBus.Properties"), QStringLiteral("PropertiesChanged") ); signal.setArguments({ - QStringLiteral("org.freedesktop.Notifications"), + notificationServiceInterface(), QVariantMap{ // updated {QStringLiteral("Inhibited"), inhibited()}, },