From 627f2738e07725f2652c0306d850ffb631699dd0 Mon Sep 17 00:00:00 2001 From: Ilya Fedin Date: Fri, 25 Nov 2022 22:01:10 +0400 Subject: [PATCH] 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 --- gio/gappinfo.c | 20 ++++++++++++++------ gio/gapplication-tool.c | 3 +++ gio/gdesktopappinfo.c | 10 ++++++++-- gio/tests/dbus-appinfo.c | 17 ++++++++++++++--- 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; }