FdoNotificationDaemon: Emit ActivationToken before ActionInvoked signal

Two years ago FDO notifications spec gained the ability to pass an
activation token (often called startup id) let's finally implement it.

See: https://gitlab.freedesktop.org/xdg/xdg-specs/-/commit/b9a470004d

Closes: https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/358
Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/3199>
This commit is contained in:
Julian Sparber 2024-02-19 17:31:52 +01:00 committed by Florian Müllner
parent 7d6f465a47
commit bb73bf548c
3 changed files with 24 additions and 0 deletions

View File

@ -31,5 +31,9 @@
<arg type="u"/>
<arg type="s"/>
</signal>
<signal name="ActivationToken">
<arg type="u"/>
<arg type="s"/>
</signal>
</interface>
</node>

View File

@ -27,6 +27,14 @@ export const NotificationDaemon = class extends ServiceImplementation {
log(error.message);
});
this._proxy.connectSignal('ActivationToken',
(proxy, sender, params) => {
const [id] = params;
this._emitSignal(
this._activeNotifications.get(id),
'ActivationToken',
new GLib.Variant('(us)', params));
});
this._proxy.connectSignal('ActionInvoked',
(proxy, sender, params) => {
const [id] = params;

View File

@ -217,6 +217,7 @@ class FdoNotificationDaemon {
hasDefaultAction = true;
} else {
notification.addAction(label, () => {
this._emitActivationToken(source, ndata.id);
this._emitActionInvoked(ndata.id, actionId);
});
}
@ -225,6 +226,7 @@ class FdoNotificationDaemon {
if (hasDefaultAction) {
notification.connect('activated', () => {
this._emitActivationToken(source, ndata.id);
this._emitActionInvoked(ndata.id, 'default');
});
} else {
@ -301,6 +303,16 @@ class FdoNotificationDaemon {
this._dbusImpl.emit_signal('ActionInvoked',
GLib.Variant.new('(us)', [id, action]));
}
_emitActivationToken(source, id) {
const context = global.create_app_launch_context(0, -1);
const info = source.app?.get_app_info();
if (info) {
const token = context.get_startup_notify_id(info, []);
this._dbusImpl.emit_signal('ActivationToken',
GLib.Variant.new('(us)', [id, token]));
}
}
}
export const FdoNotificationDaemonSource = GObject.registerClass(