[gdm] greeter: inform daemon when user disconnects



commit 650465cb691a0eb52a84b0ff3eea64ac82168a43
Author: Vincent Untz <vuntz gnome org>
Date:   Thu Feb 3 15:52:49 2011 -0500

    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.

 gui/simple-greeter/gdm-greeter-login-window.c |   11 -----------
 gui/simple-greeter/gdm-greeter-login-window.h |    1 -
 gui/simple-greeter/gdm-greeter-panel.c        |   25 ++++++++++++++++++++++---
 gui/simple-greeter/gdm-greeter-panel.h        |    1 +
 gui/simple-greeter/gdm-greeter-session.c      |   12 ++++++------
 5 files changed, 29 insertions(+), 21 deletions(-)
---
diff --git a/gui/simple-greeter/gdm-greeter-login-window.c b/gui/simple-greeter/gdm-greeter-login-window.c
index 9a21edd..6dc201a 100644
--- a/gui/simple-greeter/gdm-greeter-login-window.c
+++ b/gui/simple-greeter/gdm-greeter-login-window.c
@@ -143,7 +143,6 @@ enum {
         QUERY_ANSWER,
         START_SESSION,
         USER_SELECTED,
-        DISCONNECTED,
         CANCELLED,
         LAST_SIGNAL
 };
@@ -1571,16 +1570,6 @@ gdm_greeter_login_window_class_init (GdmGreeterLoginWindowClass *klass)
                               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] =
                 g_signal_new ("start-session",
                               G_TYPE_FROM_CLASS (object_class),
diff --git a/gui/simple-greeter/gdm-greeter-login-window.h b/gui/simple-greeter/gdm-greeter-login-window.h
index 504b075..a5e68ae 100644
--- a/gui/simple-greeter/gdm-greeter-login-window.h
+++ b/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;
diff --git a/gui/simple-greeter/gdm-greeter-panel.c b/gui/simple-greeter/gdm-greeter-panel.c
index 027c3e1..884102c 100644
--- a/gui/simple-greeter/gdm-greeter-panel.c
+++ b/gui/simple-greeter/gdm-greeter-panel.c
@@ -98,6 +98,13 @@ enum {
         PROP_DISPLAY_IS_LOCAL
 };
 
+enum {
+        DISCONNECTED,
+        NUMBER_OF_SIGNALS
+};
+
+static guint signals [NUMBER_OF_SIGNALS] = { 0, };
+
 static void     gdm_greeter_panel_class_init  (GdmGreeterPanelClass *klass);
 static void     gdm_greeter_panel_init        (GdmGreeterPanel      *greeter_panel);
 static void     gdm_greeter_panel_finalize    (GObject              *object);
@@ -746,9 +753,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
@@ -892,7 +900,7 @@ add_shutdown_menu (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 ()) {
@@ -1120,6 +1128,17 @@ gdm_greeter_panel_class_init (GdmGreeterPanelClass *klass)
                                                                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));
 }
 
diff --git a/gui/simple-greeter/gdm-greeter-panel.h b/gui/simple-greeter/gdm-greeter-panel.h
index 1354371..d383b18 100644
--- a/gui/simple-greeter/gdm-greeter-panel.h
+++ b/gui/simple-greeter/gdm-greeter-panel.h
@@ -50,6 +50,7 @@ typedef struct
 
         void (* session_selected)            (GdmGreeterPanel *panel,
                                               const char      *text);
+        void (* disconnected)                (GdmGreeterPanel *panel);
 } GdmGreeterPanelClass;
 
 GType                  gdm_greeter_panel_get_type                       (void);
diff --git a/gui/simple-greeter/gdm-greeter-session.c b/gui/simple-greeter/gdm-greeter-session.c
index 3225105..3d2a067 100644
--- a/gui/simple-greeter/gdm-greeter-session.c
+++ b/gui/simple-greeter/gdm-greeter-session.c
@@ -271,8 +271,7 @@ on_cancelled (GdmGreeterLoginWindow *login_window,
 }
 
 static void
-on_disconnected (GdmGreeterLoginWindow *login_window,
-                 GdmGreeterSession     *session)
+on_disconnected (GdmGreeterSession     *session)
 {
         gdm_greeter_client_call_disconnect (session->priv->client);
 }
@@ -350,6 +349,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);
@@ -397,10 +401,6 @@ toggle_login_window (GdmGreeterSession *session,
                                   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);



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]