File gdm-xdmcp-disconnect.patch of Package gdm.import4636

From 650465cb691a0eb52a84b0ff3eea64ac82168a43 Mon Sep 17 00:00:00 2001
From: Vincent Untz <vuntz@gnome.org>
Date: Thu, 03 Feb 2011 20:52:49 +0000
Subject: greeter: inform daemon when user disconnects

This is so the daemon knows the user is intentionally
disconnecting and it's not just the greeter tanking.
---
Index: gdm-2.32.0/gui/simple-greeter/gdm-greeter-login-window.c
===================================================================
--- gdm-2.32.0.orig/gui/simple-greeter/gdm-greeter-login-window.c
+++ gdm-2.32.0/gui/simple-greeter/gdm-greeter-login-window.c
@@ -143,7 +143,6 @@ enum {
         QUERY_ANSWER,
         START_SESSION,
         USER_SELECTED,
-        DISCONNECTED,
         CANCELLED,
         LAST_SIGNAL
 };
@@ -1519,16 +1518,6 @@ gdm_greeter_login_window_class_init (Gdm
                               NULL,
                               NULL,
                               g_cclosure_marshal_VOID__VOID,
-                              G_TYPE_NONE,
-                              0);
-        signals [DISCONNECTED] =
-                g_signal_new ("disconnected",
-                              G_TYPE_FROM_CLASS (object_class),
-                              G_SIGNAL_RUN_LAST,
-                              G_STRUCT_OFFSET (GdmGreeterLoginWindowClass, disconnected),
-                              NULL,
-                              NULL,
-                              g_cclosure_marshal_VOID__VOID,
                               G_TYPE_NONE,
                               0);
         signals [START_SESSION] =
Index: gdm-2.32.0/gui/simple-greeter/gdm-greeter-login-window.h
===================================================================
--- gdm-2.32.0.orig/gui/simple-greeter/gdm-greeter-login-window.h
+++ gdm-2.32.0/gui/simple-greeter/gdm-greeter-login-window.h
@@ -56,7 +56,6 @@ typedef struct
         void (* user_selected)               (GdmGreeterLoginWindow *login_window,
                                               const char            *text);
         void (* cancelled)                   (GdmGreeterLoginWindow *login_window);
-        void (* disconnected)                (GdmGreeterLoginWindow *login_window);
         void (* start_session)               (GdmGreeterLoginWindow *login_window);
 
 } GdmGreeterLoginWindowClass;
Index: gdm-2.32.0/gui/simple-greeter/gdm-greeter-panel.c
===================================================================
--- gdm-2.32.0.orig/gui/simple-greeter/gdm-greeter-panel.c
+++ gdm-2.32.0/gui/simple-greeter/gdm-greeter-panel.c
@@ -105,6 +105,7 @@ enum {
         LANGUAGE_SELECTED,
         LAYOUT_SELECTED,
         SESSION_SELECTED,
+        DISCONNECTED,
         NUMBER_OF_SIGNALS
 };
 
@@ -633,9 +634,10 @@ do_system_stop (void)
 }
 
 static void
-do_disconnect (void)
+do_disconnect (GtkWidget       *widget,
+               GdmGreeterPanel *panel)
 {
-        gtk_main_quit ();
+        g_signal_emit (panel, signals[DISCONNECTED], 0);
 }
 
 static gboolean
@@ -818,7 +820,7 @@ setup_panel (GdmGreeterPanel *panel)
 
                 if (! panel->priv->display_is_local) {
                         menu_item = gtk_menu_item_new_with_label ("Disconnect");
-                        g_signal_connect (G_OBJECT (menu_item), "activate", G_CALLBACK (do_disconnect), NULL);
+                        g_signal_connect (G_OBJECT (menu_item), "activate", G_CALLBACK (do_disconnect), panel);
                         gtk_menu_shell_append (GTK_MENU_SHELL (panel->priv->shutdown_menu), menu_item);
                 } else if (get_show_restart_buttons (panel)) {
                         if (can_suspend ()) {
@@ -982,6 +984,17 @@ gdm_greeter_panel_class_init (GdmGreeter
                                                                FALSE,
                                                                G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
 
+        signals [DISCONNECTED] =
+                g_signal_new ("disconnected",
+                              G_TYPE_FROM_CLASS (object_class),
+                              G_SIGNAL_RUN_LAST,
+                              G_STRUCT_OFFSET (GdmGreeterPanelClass, disconnected),
+                              NULL,
+                              NULL,
+                              g_cclosure_marshal_VOID__VOID,
+                              G_TYPE_NONE,
+                              0);
+
         g_type_class_add_private (klass, sizeof (GdmGreeterPanelPrivate));
 }
 
Index: gdm-2.32.0/gui/simple-greeter/gdm-greeter-panel.h
===================================================================
--- gdm-2.32.0.orig/gui/simple-greeter/gdm-greeter-panel.h
+++ gdm-2.32.0/gui/simple-greeter/gdm-greeter-panel.h
@@ -53,6 +53,7 @@ typedef struct
 
         void (* session_selected)            (GdmGreeterPanel *panel,
                                               const char      *text);
+        void (* disconnected)                (GdmGreeterPanel *panel);
 } GdmGreeterPanelClass;
 
 GType                  gdm_greeter_panel_get_type                       (void);
Index: gdm-2.32.0/gui/simple-greeter/gdm-greeter-session.c
===================================================================
--- gdm-2.32.0.orig/gui/simple-greeter/gdm-greeter-session.c
+++ gdm-2.32.0/gui/simple-greeter/gdm-greeter-session.c
@@ -296,8 +296,7 @@ on_cancelled (GdmGreeterLoginWindow *log
 }
 
 static void
-on_disconnected (GdmGreeterLoginWindow *login_window,
-                 GdmGreeterSession     *session)
+on_disconnected (GdmGreeterSession     *session)
 {
         gdm_greeter_client_call_disconnect (session->priv->client);
 }
@@ -380,6 +379,11 @@ toggle_panel (GdmGreeterSession *session
                                           G_CALLBACK (on_select_session),
                                           session);
 
+                g_signal_connect_swapped (session->priv->panel,
+                                          "disconnected",
+                                          G_CALLBACK (on_disconnected),
+                                          session);
+
                 gtk_widget_show (session->priv->panel);
         } else {
                 gtk_widget_destroy (session->priv->panel);
@@ -427,10 +431,6 @@ toggle_login_window (GdmGreeterSession *
                                   G_CALLBACK (on_cancelled),
                                   session);
                 g_signal_connect (session->priv->login_window,
-                                  "disconnected",
-                                  G_CALLBACK (on_disconnected),
-                                  session);
-                g_signal_connect (session->priv->login_window,
                                   "start-session",
                                   G_CALLBACK (on_start_session),
                                   session);
Index: gdm-2.32.0/daemon/gdm-simple-slave.c
===================================================================
--- gdm-2.32.0.orig/daemon/gdm-simple-slave.c
+++ gdm-2.32.0/daemon/gdm-simple-slave.c
@@ -921,6 +921,23 @@ on_greeter_connected (GdmGreeterServer *
 }
 
 static void
+on_greeter_disconnected (GdmGreeterServer *greeter_server,
+                         GdmSimpleSlave   *slave)
+{
+        gboolean display_is_local;
+
+        g_debug ("GdmSimpleSlave: Greeter disconnected");
+
+        g_object_get (slave,
+                      "display-is-local", &display_is_local,
+                      NULL);
+
+        if ( ! display_is_local) {
+                gdm_slave_stopped (GDM_SLAVE (slave));
+        }
+}
+
+static void
 on_start_session_when_ready (GdmGreeterServer *session,
                              GdmSimpleSlave   *slave)
 {
@@ -1116,6 +1133,10 @@ start_greeter (GdmSimpleSlave *slave)
                           G_CALLBACK (on_greeter_connected),
                           slave);
         g_signal_connect (slave->priv->greeter_server,
+                          "disconnected",
+                          G_CALLBACK (on_greeter_disconnected),
+                          slave);
+        g_signal_connect (slave->priv->greeter_server,
                           "cancelled",
                           G_CALLBACK (on_greeter_cancel),
                           slave);
openSUSE Build Service is sponsored by