From c51b463dae1ebcee4e9394e068079fb6639bb71e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20M=C3=BCllner?= Date: Mon, 10 Oct 2016 12:33:54 +0200 Subject: [PATCH] gdkdisplay-wayland: Add API to set startup notification ID For wayland clients, the startup notification ID is currently only set from the DESKTOP_STARTUP_ID environment variable. As that variable is only set for clients launched via exec(), startup completion is not indicated correctly for DBus-activated applications unless an explicit ID is specified - usually that is not the case, as the default handling uses gdk_notify_startup_complete(). To address this, we need API to set the startup notification ID from GTK as we have on X11. https://bugzilla.gnome.org/show_bug.cgi?id=768531 --- gdk/wayland/gdkdisplay-wayland.c | 27 +++++++++++++++++++++++++++ gdk/wayland/gdkwaylanddisplay.h | 3 +++ 2 files changed, 30 insertions(+) diff --git a/gdk/wayland/gdkdisplay-wayland.c b/gdk/wayland/gdkdisplay-wayland.c index cddb2de..784cfbe 100644 --- a/gdk/wayland/gdkdisplay-wayland.c +++ b/gdk/wayland/gdkdisplay-wayland.c @@ -796,6 +796,33 @@ gdk_wayland_display_get_next_serial (GdkDisplay *display) return ++serial; } +/** + * gdk_wayland_display_set_startup_notification_id: + * @display: (type GdkWaylandDisplay): a #GdkDisplay + * @startup_id: the startup notification ID (must be valid utf8) + * + * Sets the startup notification ID for a display. + * + * This is usually taken from the value of the DESKTOP_STARTUP_ID + * environment variable, but in some cases (such as the application not + * being launched using exec()) it can come from other sources. + * + * The startup ID is also what is used to signal that the startup is + * complete (for example, when opening a window or when calling + * gdk_notify_startup_complete()). + * + * Since: 3.22 + **/ +void +gdk_wayland_display_set_startup_notification_id (GdkDisplay *display, + const char *startup_id) +{ + GdkWaylandDisplay *display_wayland = GDK_WAYLAND_DISPLAY (display); + + g_free (display_wayland->startup_notification_id); + display_wayland->startup_notification_id = g_strdup (startup_id); +} + static void gdk_wayland_display_notify_startup_complete (GdkDisplay *display, const gchar *startup_id) diff --git a/gdk/wayland/gdkwaylanddisplay.h b/gdk/wayland/gdkwaylanddisplay.h index a5587ca..f4b51c8 100644 --- a/gdk/wayland/gdkwaylanddisplay.h +++ b/gdk/wayland/gdkwaylanddisplay.h @@ -53,6 +53,9 @@ GDK_AVAILABLE_IN_3_10 void gdk_wayland_display_set_cursor_theme (GdkDisplay *display, const gchar *theme, gint size); +GDK_AVAILABLE_IN_3_22 +void gdk_wayland_display_set_startup_notification_id (GdkDisplay *display, + const char *startup_id); G_END_DECLS -- 2.9.3 From b29fbaa1d5a615aed7204de7b99c430e52e362b9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20M=C3=BCllner?= Date: Mon, 10 Oct 2016 12:33:54 +0200 Subject: [PATCH] wayland: Set startup ID from GApplication platform data The GApplication platform data may contain a startup ID that on X11 is used to set the startup notification ID when activated. Do the same on the wayland backend to make startup notifications work for DBus-activated applications where the DESKTOP_STARTUP_ID environment variable is not set. https://bugzilla.gnome.org/show_bug.cgi?id=768531 --- gtk/gtkapplication-wayland.c | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/gtk/gtkapplication-wayland.c b/gtk/gtkapplication-wayland.c index 84df82c..221a1ad 100644 --- a/gtk/gtkapplication-wayland.c +++ b/gtk/gtkapplication-wayland.c @@ -61,6 +61,17 @@ gtk_application_impl_wayland_handle_window_realize (GtkApplicationImpl *impl, } static void +gtk_application_impl_wayland_before_emit (GtkApplicationImpl *impl, + GVariant *platform_data) +{ + const char *startup_notification_id = NULL; + + g_variant_lookup (platform_data, "desktop-startup-id", "&s", &startup_notification_id); + + gdk_wayland_display_set_startup_notification_id (gdk_display_get_default (), startup_notification_id); +} + +static void gtk_application_impl_wayland_init (GtkApplicationImplWayland *wayland) { } @@ -72,4 +83,6 @@ gtk_application_impl_wayland_class_init (GtkApplicationImplWaylandClass *class) impl_class->handle_window_realize = gtk_application_impl_wayland_handle_window_realize; + impl_class->before_emit = + gtk_application_impl_wayland_before_emit; } -- 2.9.3