diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 7dd1840..23a8276 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -26,4 +26,12 @@ build:ubuntu:
- pip3 install meson
script:
- meson _build -Ddocbook_docs=enabled
- - ninja -C _build
+ - ninja -C _build install
+ artifacts:
+ expose_as: "Build artifacts"
+ paths:
+ - _build/docs/notification-spec.html
+ - _build/docs/reference/html
+ - _build/docs/reference/html/index.html
+ - _build/meson-logs
+
diff --git a/docs/notification-spec.xml b/docs/notification-spec.xml
index 5f66077..37a7552 100644
--- a/docs/notification-spec.xml
+++ b/docs/notification-spec.xml
@@ -1272,6 +1272,65 @@
+
+
+ org.freedesktop.Notifications.ActivationToken
+
+
+
+ org.freedesktop.Notifications.ActivationToken
+
+ UINT32 id
+ STRING activation_token
+
+
+
+ This signal can be emitted before a ActionInvoked
+ signal. It carries an activation token that can be used to activate a
+ toplevel.
+
+
+ ActivationToken Parameters
+
+
+
+ Name
+ Type
+ Description
+
+
+
+
+ id
+ UINT32
+
+ The ID of the notification emitting the ActionInvoked
+ signal.
+
+
+
+ activation_token
+ STRING
+
+ An activation token. This can be either an X11-style startup ID (see
+ Startup notification protocol)
+ or a
+ Wayland xdg-activation
+ token.
+
+
+
+
+
+
+
+ Clients should not assume the server will generate this signal. Some
+ servers may not support user interaction at all, or may not support
+ the concept of being able to generate an activation token for a
+ notification.
+
+
+
diff --git a/docs/reference/libnotify-sections.txt b/docs/reference/libnotify-sections.txt
index 5aaa2f7..f78a33a 100644
--- a/docs/reference/libnotify-sections.txt
+++ b/docs/reference/libnotify-sections.txt
@@ -27,6 +27,7 @@ notify_notification_clear_hints
notify_notification_add_action
notify_notification_clear_actions
notify_notification_close
+notify_notification_get_activation_token
notify_notification_get_closed_reason
NotifyNotificationPrivate
diff --git a/libnotify/notification.c b/libnotify/notification.c
index fef195e..85f9d02 100644
--- a/libnotify/notification.c
+++ b/libnotify/notification.c
@@ -68,6 +68,7 @@ struct _NotifyNotificationPrivate
char *app_name;
char *summary;
char *body;
+ char *activation_token;
const char *snap_path;
const char *snap_name;
@@ -88,6 +89,7 @@ struct _NotifyNotificationPrivate
GHashTable *hints;
gboolean has_nondefault_actions;
+ gboolean activating;
gboolean updates_pending;
gulong proxy_signal_handler;
@@ -484,6 +486,7 @@ notify_notification_finalize (GObject *object)
g_free (priv->summary);
g_free (priv->body);
g_free (priv->icon_name);
+ g_free (priv->activation_token);
g_free (priv->snap_app);
if (priv->actions != NULL) {
@@ -736,8 +739,25 @@ proxy_g_signal_cb (GDBusProxy *proxy,
g_warning ("Received unknown action %s", action);
}
} else {
+ notification->priv->activating = TRUE;
pair->cb (notification, (char *) action, pair->user_data);
+ notification->priv->activating = FALSE;
+
+ g_free (notification->priv->activation_token);
+ notification->priv->activation_token = NULL;
}
+ } else if (g_strcmp0 (signal_name, "ActivationToken") == 0 &&
+ g_variant_is_of_type (parameters, G_VARIANT_TYPE ("(us)"))) {
+ guint32 id;
+ const char *activation_token;
+
+ g_variant_get (parameters, "(u&s)", &id, &activation_token);
+
+ if (id != notification->priv->id)
+ return;
+
+ g_free (notification->priv->activation_token);
+ notification->priv->activation_token = g_strdup (activation_token);
}
}
@@ -1351,6 +1371,29 @@ notify_notification_add_action (NotifyNotification *notification,
}
}
+/**
+ * notify_notification_get_activation_token:
+ *
+ * If an an action is currently being activated, return the activation token.
+ * This function is intended to be used in a #NotifyActionCallback to get
+ * the activation token for the activated action, if the notification daemon
+ * supports it.
+ *
+ * Return value: (transfer none): The current activation token, or %NULL if none
+ *
+ * Since: 0.7.10
+ */
+const char *
+notify_notification_get_activation_token (NotifyNotification *notification)
+{
+ g_return_val_if_fail (NOTIFY_IS_NOTIFICATION (notification), NULL);
+
+ if (notification->priv->activating)
+ return notification->priv->activation_token;
+
+ return NULL;
+}
+
gboolean
_notify_notification_has_nondefault_actions (const NotifyNotification *n)
{
diff --git a/libnotify/notification.h b/libnotify/notification.h
index b232b3b..ffc960f 100644
--- a/libnotify/notification.h
+++ b/libnotify/notification.h
@@ -180,6 +180,8 @@ void notify_notification_add_action (NotifyNotificatio
gpointer user_data,
GFreeFunc free_func);
+const char *notify_notification_get_activation_token (NotifyNotification *notification);
+
void notify_notification_clear_actions (NotifyNotification *notification);
gboolean notify_notification_close (NotifyNotification *notification,
GError **error);
diff --git a/tools/notify-send.c b/tools/notify-send.c
index 65963ff..88599bf 100644
--- a/tools/notify-send.c
+++ b/tools/notify-send.c
@@ -134,8 +134,16 @@ handle_action (NotifyNotification *notify,
gpointer user_data)
{
const char *action_name = user_data;
+ const char *activation_token;
+
+ activation_token = notify_notification_get_activation_token (notify);
g_printf ("%s\n", action_name);
+
+ if (activation_token) {
+ g_debug ("Activation Token: %s", activation_token);
+ }
+
notify_notification_close (notify, NULL);
}