summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIlya Fedin <fedin-ilja2010@ya.ru>2022-11-25 22:01:10 +0400
committerPhilip Withnall <pwithnall@endlessos.org>2022-12-19 12:45:02 +0000
commit627f2738e07725f2652c0306d850ffb631699dd0 (patch)
tree339c4b6b151e19e5fc5ae6c16e49eef8f1598c09
parent24e1bfba166fc5480cc44e8e3c3cfe5d69455d16 (diff)
downloadglib-627f2738e07725f2652c0306d850ffb631699dd0.tar.gz
gdesktopappinfo: Set XDG_ACTIVATION_TOKEN/activation-token startup ID key
See: * https://gitlab.freedesktop.org/xdg/xdg-specs/-/blob/master/desktop-entry/desktop-entry-spec.xml#L1061-1068 * https://wayland.app/protocols/xdg-activation-v1 * https://gitlab.freedesktop.org/wayland/wayland-protocols/-/blob/main/staging/xdg-activation/x11-interoperation.rst Fixes: #2709
-rw-r--r--gio/gappinfo.c20
-rw-r--r--gio/gapplication-tool.c3
-rw-r--r--gio/gdesktopappinfo.c10
-rw-r--r--gio/tests/dbus-appinfo.c17
4 files changed, 39 insertions, 11 deletions
diff --git a/gio/gappinfo.c b/gio/gappinfo.c
index d1a1a1d65..8449aab2d 100644
--- a/gio/gappinfo.c
+++ b/gio/gappinfo.c
@@ -577,9 +577,9 @@ g_app_info_get_icon (GAppInfo *appinfo)
* environment variable with the path of the launched desktop file and
* `GIO_LAUNCHED_DESKTOP_FILE_PID` to the process id of the launched
* process. This can be used to ignore `GIO_LAUNCHED_DESKTOP_FILE`,
- * should it be inherited by further processes. The `DISPLAY` and
- * `DESKTOP_STARTUP_ID` environment variables are also set, based
- * on information provided in @context.
+ * should it be inherited by further processes. The `DISPLAY`,
+ * `XDG_ACTIVATION_TOKEN` and `DESKTOP_STARTUP_ID` environment
+ * variables are also set, based on information provided in @context.
*
* Returns: %TRUE on successful launch, %FALSE otherwise.
**/
@@ -1594,10 +1594,18 @@ g_app_launch_context_get_display (GAppLaunchContext *context,
* @files: (element-type GFile): a #GList of of #GFile objects
*
* Initiates startup notification for the application and returns the
- * `DESKTOP_STARTUP_ID` for the launched operation, if supported.
+ * `XDG_ACTIVATION_TOKEN` or `DESKTOP_STARTUP_ID` for the launched operation,
+ * if supported.
*
- * Startup notification IDs are defined in the
- * [FreeDesktop.Org Startup Notifications standard](http://standards.freedesktop.org/startup-notification-spec/startup-notification-latest.txt).
+ * The returned token may be referred to equivalently as an ‘activation token’
+ * (using Wayland terminology) or a ‘startup sequence ID’ (using X11 terminology).
+ * The two [are interoperable](https://gitlab.freedesktop.org/wayland/wayland-protocols/-/blob/main/staging/xdg-activation/x11-interoperation.rst).
+ *
+ * Activation tokens are defined in the [XDG Activation Protocol](https://wayland.app/protocols/xdg-activation-v1),
+ * and startup notification IDs are defined in the
+ * [freedesktop.org Startup Notification Protocol](http://standards.freedesktop.org/startup-notification-spec/startup-notification-latest.txt).
+ *
+ * Support for the XDG Activation Protocol was added in GLib 2.76.
*
* Returns: (nullable): a startup notification ID for the application, or %NULL if
* not supported.
diff --git a/gio/gapplication-tool.c b/gio/gapplication-tool.c
index 514d99a3f..b810e8ee9 100644
--- a/gio/gapplication-tool.c
+++ b/gio/gapplication-tool.c
@@ -304,6 +304,9 @@ app_get_platform_data (void)
if ((startup_id = g_getenv ("DESKTOP_STARTUP_ID")))
g_variant_builder_add (&builder, "{sv}", "desktop-startup-id", g_variant_new_string (startup_id));
+ if ((startup_id = g_getenv ("XDG_ACTIVATION_TOKEN")))
+ g_variant_builder_add (&builder, "{sv}", "activation-token", g_variant_new_string (startup_id));
+
return g_variant_builder_end (&builder);
}
diff --git a/gio/gdesktopappinfo.c b/gio/gdesktopappinfo.c
index d0cdef51a..5f2525b23 100644
--- a/gio/gdesktopappinfo.c
+++ b/gio/gdesktopappinfo.c
@@ -2895,7 +2895,10 @@ g_desktop_app_info_launch_uris_with_spawn (GDesktopAppInfo *info,
G_APP_INFO (info),
launched_files);
if (sn_id)
- envp = g_environ_setenv (envp, "DESKTOP_STARTUP_ID", sn_id, TRUE);
+ {
+ envp = g_environ_setenv (envp, "DESKTOP_STARTUP_ID", sn_id, TRUE);
+ envp = g_environ_setenv (envp, "XDG_ACTIVATION_TOKEN", sn_id, TRUE);
+ }
}
g_list_free_full (launched_files, g_object_unref);
@@ -3032,7 +3035,10 @@ g_desktop_app_info_make_platform_data (GDesktopAppInfo *info,
sn_id = g_app_launch_context_get_startup_notify_id (launch_context, G_APP_INFO (info), launched_files);
if (sn_id)
- g_variant_builder_add (&builder, "{sv}", "desktop-startup-id", g_variant_new_take_string (sn_id));
+ {
+ g_variant_builder_add (&builder, "{sv}", "desktop-startup-id", g_variant_new_string (sn_id));
+ g_variant_builder_add (&builder, "{sv}", "activation-token", g_variant_new_take_string (g_steal_pointer (&sn_id)));
+ }
}
g_list_free_full (launched_files, g_object_unref);
diff --git a/gio/tests/dbus-appinfo.c b/gio/tests/dbus-appinfo.c
index 91e76403c..d84de7de9 100644
--- a/gio/tests/dbus-appinfo.c
+++ b/gio/tests/dbus-appinfo.c
@@ -226,13 +226,24 @@ test_application_before_emit (GApplication *application,
GVariant *platform_data)
{
const gchar *startup_id;
+ gsize i;
g_assert (!saw_startup_id);
- if (!g_variant_lookup (platform_data, "desktop-startup-id", "&s", &startup_id))
- return;
+ const gchar *startup_id_keys[] = {
+ "desktop-startup-id",
+ "activation-token",
+ NULL,
+ };
+
+ for (i = 0; startup_id_keys[i] != NULL; i++)
+ {
+ if (!g_variant_lookup (platform_data, startup_id_keys[i], "&s", &startup_id))
+ return;
+
+ g_assert_cmpstr (startup_id, ==, "expected startup id");
+ }
- g_assert_cmpstr (startup_id, ==, "expected startup id");
saw_startup_id = TRUE;
}