From aa93de2301273f6c69b1d50aca4fc17b68fb3b86 Mon Sep 17 00:00:00 2001 From: Jason Zaman Date: Sat, 5 May 2018 15:52:54 +0800 Subject: [PATCH] xfsettingsd: dbus connection needs setup with g_main and listen for NameLost Without calling dbus_connection_setup_with_g_main, no dbus events get processed. causing xfsettingsd --replace to not work leaving many old xfsettingsd around. Also the signal NameLost gets sent instead of NameOwnerChanged so listen for both now. Signed-off-by: Jason Zaman --- xfsettingsd/main.c | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/xfsettingsd/main.c b/xfsettingsd/main.c index 388a757..5b8cf40 100644 --- a/xfsettingsd/main.c +++ b/xfsettingsd/main.c @@ -38,6 +38,7 @@ #include #include #include +#include #ifdef GDK_WINDOWING_X11 #include @@ -119,6 +120,21 @@ dbus_connection_filter_func (DBusConnection *connection, } } + if (dbus_message_is_signal (message, DBUS_INTERFACE_DBUS, "NameLost")) + { + if (dbus_message_get_args (message, NULL, + DBUS_TYPE_STRING, &name, + DBUS_TYPE_INVALID)) + { + if (g_strcmp0 (name, XFSETTINGS_DBUS_NAME) == 0) + { + g_printerr (G_LOG_DOMAIN ": %s\n", "Another instance took over. Leaving..."); + gtk_main_quit (); + return DBUS_HANDLER_RESULT_HANDLED; + } + } + } + return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; } @@ -241,6 +257,7 @@ main (gint argc, gchar **argv) dbus_connection = dbus_bus_get (DBUS_BUS_SESSION, NULL); if (G_LIKELY (dbus_connection != NULL)) { + dbus_connection_setup_with_g_main (dbus_connection, NULL); dbus_connection_set_exit_on_disconnect (dbus_connection, FALSE); dbus_flags = DBUS_NAME_FLAG_ALLOW_REPLACEMENT | DBUS_NAME_FLAG_DO_NOT_QUEUE; @@ -255,7 +272,12 @@ main (gint argc, gchar **argv) return EXIT_SUCCESS; } - dbus_bus_add_match (dbus_connection, "type='signal',member='NameOwnerChanged',arg0='"XFSETTINGS_DBUS_NAME"'", NULL); + dbus_bus_add_match (dbus_connection, + "type='signal',interface='"DBUS_INTERFACE_DBUS"',member='NameOwnerChanged',arg0='"XFSETTINGS_DBUS_NAME"'", + NULL); + dbus_bus_add_match (dbus_connection, + "type='signal',interface='"DBUS_INTERFACE_DBUS"',member='NameLost',arg0='"XFSETTINGS_DBUS_NAME"'", + NULL); dbus_connection_add_filter (dbus_connection, dbus_connection_filter_func, NULL, NULL); } else -- 2.16.1