ce6ce5c
--- gdm-2.26.1/gui/simple-greeter/greeter-main.c	2009-02-19 21:45:09.000000000 -0500
ce6ce5c
+++ hacked/gui/simple-greeter/greeter-main.c	2009-04-24 20:21:43.560229712 -0400
ce6ce5c
@@ -155,6 +155,46 @@
ce6ce5c
         return (sm_proxy != NULL);
ce6ce5c
 }
ce6ce5c
 
ce6ce5c
+static void
ce6ce5c
+stop_cb (gpointer data)
ce6ce5c
+{
ce6ce5c
+        gtk_main_quit ();
ce6ce5c
+}
ce6ce5c
+
ce6ce5c
+static gboolean
ce6ce5c
+end_session_response (gboolean is_okay, const gchar *reason)
ce6ce5c
+{
ce6ce5c
+        gboolean ret;
ce6ce5c
+        GError *error = NULL;
ce6ce5c
+
ce6ce5c
+        ret = dbus_g_proxy_call (client_proxy, "EndSessionResponse",
ce6ce5c
+                                 &error,
ce6ce5c
+                                 G_TYPE_BOOLEAN, is_okay,
ce6ce5c
+                                 G_TYPE_STRING, reason,
ce6ce5c
+                                 G_TYPE_INVALID,
ce6ce5c
+                                 G_TYPE_INVALID);
ce6ce5c
+
ce6ce5c
+        if (!ret) {
ce6ce5c
+                g_warning ("Failed to send session response %s", error->message);
ce6ce5c
+                g_error_free (error);
ce6ce5c
+        }
ce6ce5c
+
ce6ce5c
+        return ret;
ce6ce5c
+}
ce6ce5c
+
ce6ce5c
+static void
ce6ce5c
+query_end_session_cb (guint flags, gpointer data)
ce6ce5c
+{
ce6ce5c
+        end_session_response (TRUE, NULL);
ce6ce5c
+}
ce6ce5c
+
ce6ce5c
+static void
ce6ce5c
+end_session_cb (guint flags, gpointer data)
ce6ce5c
+{
ce6ce5c
+        end_session_response (TRUE, NULL);
ce6ce5c
+        gtk_main_quit ();
ce6ce5c
+}
ce6ce5c
+
ce6ce5c
 static gboolean
ce6ce5c
 register_client (void)
ce6ce5c
 {
ce6ce5c
@@ -186,6 +226,19 @@
ce6ce5c
                                                   SM_DBUS_NAME,
ce6ce5c
                                                   client_id,
ce6ce5c
                                                   SM_CLIENT_DBUS_INTERFACE);
ce6ce5c
+
ce6ce5c
+        dbus_g_proxy_add_signal (client_proxy, "Stop", G_TYPE_INVALID);
ce6ce5c
+        dbus_g_proxy_connect_signal (client_proxy, "Stop",
ce6ce5c
+                                     G_CALLBACK (stop_cb), NULL, NULL);
ce6ce5c
+
ce6ce5c
+        dbus_g_proxy_add_signal (client_proxy, "QueryEndSession", G_TYPE_UINT, G_TYPE_INVALID);
ce6ce5c
+        dbus_g_proxy_connect_signal (client_proxy, "QueryEndSession",
ce6ce5c
+                                     G_CALLBACK (query_end_session_cb), NULL, NULL);
ce6ce5c
+
ce6ce5c
+        dbus_g_proxy_add_signal (client_proxy, "EndSession", G_TYPE_UINT, G_TYPE_INVALID);
ce6ce5c
+        dbus_g_proxy_connect_signal (client_proxy, "EndSession",
ce6ce5c
+                                     G_CALLBACK (end_session_cb), NULL, NULL);
ce6ce5c
+
ce6ce5c
         g_unsetenv ("DESKTOP_AUTOSTART_ID");
ce6ce5c
 
ce6ce5c
         return TRUE;