diff --git a/gnome-session-dbus-disconnected.patch b/gnome-session-dbus-disconnected.patch new file mode 100644 index 0000000..2ba0a3c --- /dev/null +++ b/gnome-session-dbus-disconnected.patch @@ -0,0 +1,127 @@ +diff --git a/gnome-session/gsm-consolekit.c b/gnome-session/gsm-consolekit.c +index f53993f..66bebd1 100644 +--- a/gnome-session/gsm-consolekit.c ++++ b/gnome-session/gsm-consolekit.c +@@ -152,7 +152,8 @@ gsm_consolekit_dbus_filter (DBusConnection *connection, + DBUS_INTERFACE_LOCAL, "Disconnected") && + strcmp (dbus_message_get_path (message), DBUS_PATH_LOCAL) == 0) { + gsm_consolekit_free_dbus (manager); +- return DBUS_HANDLER_RESULT_HANDLED; ++ /* let other filters get this disconnected signal, so that they ++ * can handle it too */ + } + + return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; +diff --git a/gnome-session/gsm-manager.c b/gnome-session/gsm-manager.c +index b531197..2d74d40 100644 +--- a/gnome-session/gsm-manager.c ++++ b/gnome-session/gsm-manager.c +@@ -151,6 +151,7 @@ struct GsmManagerPrivate + + DBusGProxy *bus_proxy; + DBusGConnection *connection; ++ gboolean dbus_disconnected : 1; + + /* Interface with other parts of the system */ + UpClient *up_client; +@@ -1814,6 +1815,11 @@ _disconnect_client (GsmManager *manager, + "phase"); + } + ++ if (manager->priv->dbus_disconnected && GSM_IS_DBUS_CLIENT (client)) { ++ g_debug ("GsmManager: dbus disconnected, not restarting application"); ++ goto out; ++ } ++ + if (app == NULL) { + g_debug ("GsmManager: unable to find application for client - not restarting"); + goto out; +@@ -1872,6 +1878,12 @@ _disconnect_dbus_client (const char *id, + return FALSE; + } + ++ /* If no service name, then we simply disconnect all clients */ ++ if (!data->service_name) { ++ _disconnect_client (data->manager, client); ++ return TRUE; ++ } ++ + name = gsm_dbus_client_get_bus_name (GSM_DBUS_CLIENT (client)); + if (IS_STRING_EMPTY (name)) { + return FALSE; +@@ -1885,6 +1897,15 @@ _disconnect_dbus_client (const char *id, + return FALSE; + } + ++/** ++ * remove_clients_for_connection: ++ * @manager: a #GsmManager ++ * @service_name: a service name ++ * ++ * Disconnects clients that own @service_name. ++ * ++ * If @service_name is NULL, then disconnects all clients for the connection. ++ */ + static void + remove_clients_for_connection (GsmManager *manager, + const char *service_name) +@@ -1968,10 +1989,32 @@ bus_name_owner_changed (DBusGProxy *bus_proxy, + } + } + ++static DBusHandlerResult ++gsm_manager_bus_filter (DBusConnection *connection, ++ DBusMessage *message, ++ void *user_data) ++{ ++ GsmManager *manager; ++ ++ manager = GSM_MANAGER (user_data); ++ ++ if (dbus_message_is_signal (message, ++ DBUS_INTERFACE_LOCAL, "Disconnected") && ++ strcmp (dbus_message_get_path (message), DBUS_PATH_LOCAL) == 0) { ++ g_debug ("GsmManager: dbus disconnected; disconnecting dbus clients..."); ++ manager->priv->dbus_disconnected = TRUE; ++ remove_clients_for_connection (manager, NULL); ++ /* let other filters get this disconnected signal, so that they ++ * can handle it too */ ++ } ++ ++ return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; ++} + static gboolean + register_manager (GsmManager *manager) + { + GError *error = NULL; ++ DBusConnection *connection; + + error = NULL; + manager->priv->connection = dbus_g_bus_get (DBUS_BUS_SESSION, &error); +@@ -1983,6 +2026,12 @@ register_manager (GsmManager *manager) + exit (1); + } + ++ connection = dbus_g_connection_get_connection (manager->priv->connection); ++ dbus_connection_add_filter (connection, ++ gsm_manager_bus_filter, ++ manager, NULL); ++ manager->priv->dbus_disconnected = FALSE; ++ + manager->priv->bus_proxy = dbus_g_proxy_new_for_name (manager->priv->connection, + DBUS_SERVICE_DBUS, + DBUS_PATH_DBUS, +diff --git a/gnome-session/gsm-shell.c b/gnome-session/gsm-shell.c +index 0b26f09..9785160 100644 +--- a/gnome-session/gsm-shell.c ++++ b/gnome-session/gsm-shell.c +@@ -228,7 +228,8 @@ gsm_shell_bus_filter (DBusConnection *connection, + DBUS_INTERFACE_LOCAL, "Disconnected") && + strcmp (dbus_message_get_path (message), DBUS_PATH_LOCAL) == 0) { + gsm_shell_disconnect_from_bus (shell); +- return DBUS_HANDLER_RESULT_HANDLED; ++ /* let other filters get this disconnected signal, so that they ++ * can handle it too */ + } + + return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; diff --git a/gnome-session.changes b/gnome-session.changes index a817d51..6610a9e 100644 --- a/gnome-session.changes +++ b/gnome-session.changes @@ -1,3 +1,10 @@ +------------------------------------------------------------------- +Fri Sep 9 08:00:56 UTC 2011 - vuntz@opensuse.org + +- Add gnome-session-dbus-disconnected.patch: this fixes the case + where the session bus quits before gnome-session, so we can + properly terminate the session. Helps make the new gdm work. + ------------------------------------------------------------------- Mon Sep 5 07:33:53 UTC 2011 - vuntz@opensuse.org diff --git a/gnome-session.spec b/gnome-session.spec index 5cebb10..82bdeb3 100644 --- a/gnome-session.spec +++ b/gnome-session.spec @@ -37,6 +37,8 @@ Patch1: gnome-session-kdm-support.patch Patch2: gnome-session-wm-switch.patch # PATCH-NEEDS-REBASE gnome-session-bgo507101-tile-ui.patch bgo507101 vuntz@novell.com -- Tile UI for logout dialog. (Was: PATCH-FIX-UPSTREAM) Patch3: gnome-session-bgo507101-tile-ui.patch +# PATCH-FIX-UPSTREAM gnome-session-dbus-disconnected.patch vuntz@opensuse.org -- Various fixes for the case where dbus quits early; helps with the new gdm. Taken from git. +Patch4: gnome-session-dbus-disconnected.patch BuildRequires: fdupes BuildRequires: gnome-common BuildRequires: gnome-patch-translation @@ -125,6 +127,7 @@ translation-update-upstream #%patch2 -p1 # needs-rebase #%patch3 -p0 +%patch4 -p1 # gnome-patch-translation-update %build