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