From 7baea0aee559c70139e03421487d5aa213a547c0 Mon Sep 17 00:00:00 2001 From: Ryan Lortie Date: Thu, 9 May 2013 09:30:38 -0400 Subject: [PATCH] GApplication: set prgname to appid for services Since services are based on D-Bus activation and desktop files are supposed to be named like the busname for DBusActivatable applications and since gnome-shell wants wmclass equal to the desktop file name, we therefore want wmclass equal to the application ID in this case. wmclass is determined from the prgname, which is otherwise pretty pointless to set to some random thing in $(libexec) for a D-Bus service, so set that to the appid. This means that for D-Bus services, the following things are now all the same: - application ID - prgname - wmclass property set on all windows - desktop file name - well-known bus name There are not many applications running as D-Bus services at present so this shouldn't impact anybody except for gnome-clocks (where this change will be fixing a bug) and gnome-terminal. https://bugzilla.gnome.org/show_bug.cgi?id=699259 --- gio/gapplication.c | 24 +++++++++++++++++++----- 1 file changed, 19 insertions(+), 5 deletions(-) diff --git a/gio/gapplication.c b/gio/gapplication.c index 638bb31..5218348 100644 --- a/gio/gapplication.c +++ b/gio/gapplication.c @@ -1539,6 +1539,13 @@ g_application_open (GApplication *application, * except in the case that g_application_set_inactivity_timeout() is in * use. * + * This function sets the prgname (g_set_prgname()), if not already set, + * to the basename of argv[0]. Since 2.38, if %G_APPLICATION_IS_SERVICE + * is specified, the prgname is set to the application ID. The main + * impact of this is is that the wmclass of windows created by Gtk+ will + * be set accordingly, which helps the window manager determine which + * application is showing the window. + * * Returns: the exit status * * Since: 2.28 @@ -1561,13 +1568,20 @@ g_application_run (GApplication *application, arguments[i] = g_strdup (argv[i]); arguments[i] = NULL; - if (g_get_prgname () == NULL && argc > 0) + if (g_get_prgname () == NULL) { - gchar *prgname; + if (application->priv->flags & G_APPLICATION_IS_SERVICE) + { + g_set_prgname (application->priv->id); + } + else if (argc > 0) + { + gchar *prgname; - prgname = g_path_get_basename (argv[0]); - g_set_prgname (prgname); - g_free (prgname); + prgname = g_path_get_basename (argv[0]); + g_set_prgname (prgname); + g_free (prgname); + } } if (!G_APPLICATION_GET_CLASS (application) -- 2.7.4