[gtk+] gtk-launch: add hack to close up dbus-daemon race
- From: Ray Strode <halfline src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk+] gtk-launch: add hack to close up dbus-daemon race
- Date: Fri, 4 Mar 2016 17:42:56 +0000 (UTC)
commit 50598ee08f0c3a6a448c266a3451392c48226635
Author: Ray Strode <rstrode redhat com>
Date: Fri Mar 4 10:02:34 2016 -0500
gtk-launch: add hack to close up dbus-daemon race
If gtk-launch exits before the program it starts fully activates,
then the dbus-daemon may avoid doing the activating method call.
This commit works around the problem by pinging the activated
application, and waiting for a reply.
This is similar to the gvfs-open bug here:
https://bugzilla.gnome.org/show_bug.cgi?id=746534
https://bugzilla.gnome.org/show_bug.cgi?id=763103
gtk/gtk-launch.c | 41 +++++++++++++++++++++++++++++++++++++++--
1 files changed, 39 insertions(+), 2 deletions(-)
---
diff --git a/gtk/gtk-launch.c b/gtk/gtk-launch.c
index 576a449..4186a45 100644
--- a/gtk/gtk-launch.c
+++ b/gtk/gtk-launch.c
@@ -51,6 +51,7 @@ main (int argc, char *argv[])
gchar *app_name;
#ifdef G_OS_UNIX
gchar *desktop_file_name;
+ gchar *bus_name = NULL;
#endif
GAppInfo *info = NULL;
GAppLaunchContext *launch_context;
@@ -119,10 +120,19 @@ main (int argc, char *argv[])
app_name = *args;
#ifdef G_OS_UNIX
+ bus_name = g_strdup (app_name);
if (g_str_has_suffix (app_name, ".desktop"))
- desktop_file_name = g_strdup (app_name);
+ {
+ desktop_file_name = g_strdup (app_name);
+ bus_name[strlen (bus_name) - strlen(".desktop")] = '\0';
+ }
else
- desktop_file_name = g_strconcat (app_name, ".desktop", NULL);
+ {
+ desktop_file_name = g_strconcat (app_name, ".desktop", NULL);
+ }
+
+ if (!g_dbus_is_name (bus_name))
+ g_clear_pointer (&bus_name, g_free);
info = G_APP_INFO (g_desktop_app_info_new (desktop_file_name));
g_free (desktop_file_name);
#else
@@ -159,6 +169,33 @@ main (int argc, char *argv[])
}
g_object_unref (info);
g_object_unref (launch_context);
+
+#ifdef G_OS_UNIX
+ if (bus_name != NULL)
+ {
+ GDBusConnection *connection;
+ gchar *object_path, *p;
+
+ connection = g_bus_get_sync (G_BUS_TYPE_SESSION, NULL, NULL);
+
+ object_path = g_strdup_printf ("/%s", bus_name);
+ for (p = object_path; *p != '\0'; p++)
+ if (*p == '.')
+ *p = '/';
+
+ if (connection)
+ g_dbus_connection_call_sync (connection,
+ bus_name,
+ object_path,
+ "org.freedesktop.DBus.Peer",
+ "Ping",
+ NULL, NULL,
+ G_DBUS_CALL_FLAGS_NONE, -1, NULL, NULL);
+ g_clear_pointer (&object_path, g_free);
+ g_clear_object (&connection);
+ g_clear_pointer (&bus_name, g_free);
+ }
+#endif
g_list_free_full (l, g_object_unref);
return 0;
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]