gdm r5820 - in trunk: . common daemon gui/simple-greeter



Author: mccann
Date: Wed Feb 20 18:41:49 2008
New Revision: 5820
URL: http://svn.gnome.org/viewvc/gdm?rev=5820&view=rev

Log:
2008-02-20  William Jon McCann  <jmccann redhat com>

	* common/gdm-settings-client.c: (gdm_settings_client_get_string):
	* common/gdm-settings-keys.h:
	* daemon/gdm-factory-slave.c: (on_greeter_begin_verification),
	(on_greeter_begin_verification_for_user):
	* daemon/gdm-greeter-server.c: (handle_begin_timed_login),
	(greeter_handle_child_message), (do_introspect),
	(gdm_greeter_server_class_init):
	* daemon/gdm-greeter-server.h:
	* daemon/gdm-product-slave.c: (on_relay_setup),
	(on_relay_setup_for_user):
	* daemon/gdm-session-direct.c: (gdm_session_direct_init),
	(send_setup), (send_setup_for_user), (gdm_session_direct_setup),
	(gdm_session_direct_setup_for_user),
	(gdm_session_direct_set_property),
	(gdm_session_direct_get_property), (gdm_session_direct_dispose),
	(gdm_session_direct_class_init):
	* daemon/gdm-session-relay.c: (send_dbus_string_string_signal),
	(gdm_session_relay_setup), (gdm_session_relay_setup_for_user),
	(do_introspect):
	* daemon/gdm-session.c: (gdm_session_setup),
	(gdm_session_setup_for_user):
	* daemon/gdm-session.h:
	* daemon/gdm-simple-slave.c: (on_greeter_begin_verification),
	(on_greeter_begin_timed_login),
	(on_greeter_begin_verification_for_user), (run_greeter):
	* daemon/simple-slave-main.c: (main):
	* daemon/test-session.c: (on_open):
	* gui/simple-greeter/gdm-greeter-client.c:
	(emit_string_signal_for_message),
	(gdm_greeter_client_call_begin_timed_login):
	* gui/simple-greeter/gdm-greeter-client.h:
	* gui/simple-greeter/gdm-greeter-login-window.c:
	(remove_timed_login_timeout), (timed_login_timer),
	(restart_timed_login_timeout),
	(on_login_button_clicked_answer_query),
	(on_login_button_clicked_timed_login), (set_log_in_button_mode),
	(switch_mode), (do_cancel), (reset_dialog),
	(gdm_greeter_login_window_info_query),
	(gdm_greeter_login_window_secret_info_query), (on_user_chosen),
	(load_theme), (read_configuration),
	(gdm_greeter_login_window_constructor),
	(gdm_greeter_login_window_class_init),
	(gdm_greeter_login_window_init):
	* gui/simple-greeter/gdm-greeter-login-window.h:
	* gui/simple-greeter/gdm-greeter-session.c: (on_begin_timed_login),
	(toggle_login_window):
	* gui/simple-greeter/gdm-user-chooser-dialog.c:
	(gdm_user_chooser_dialog_set_show_other_user),
	(gdm_user_chooser_dialog_set_show_guest_user),
	(gdm_user_chooser_dialog_set_show_auto_user),
	(gdm_user_chooser_dialog_init):
	* gui/simple-greeter/gdm-user-chooser-dialog.h:
	* gui/simple-greeter/gdm-user-chooser-widget.c: (add_user_other),
	(add_user_guest), (add_user_auto), (remove_user_other),
	(remove_user_guest), (remove_user_auto),
	(gdm_user_chooser_widget_set_show_other_user),
	(gdm_user_chooser_widget_set_show_guest_user),
	(gdm_user_chooser_widget_set_show_auto_user),
	(gdm_user_chooser_widget_constructor),
	(gdm_user_chooser_widget_init):
	* gui/simple-greeter/gdm-user-chooser-widget.h:
	* gui/simple-greeter/greeter-main.c: (main):
	* gui/simple-greeter/test-greeter-login-window.c: (main):
	* gui/simple-greeter/test-user-chooser.c: (main):
	Add initial support for timed login.



Modified:
   trunk/ChangeLog
   trunk/common/gdm-settings-client.c
   trunk/common/gdm-settings-keys.h
   trunk/daemon/gdm-factory-slave.c
   trunk/daemon/gdm-greeter-server.c
   trunk/daemon/gdm-greeter-server.h
   trunk/daemon/gdm-product-slave.c
   trunk/daemon/gdm-session-direct.c
   trunk/daemon/gdm-session-relay.c
   trunk/daemon/gdm-session.c
   trunk/daemon/gdm-session.h
   trunk/daemon/gdm-simple-slave.c
   trunk/daemon/simple-slave-main.c
   trunk/daemon/test-session.c
   trunk/gui/simple-greeter/gdm-greeter-client.c
   trunk/gui/simple-greeter/gdm-greeter-client.h
   trunk/gui/simple-greeter/gdm-greeter-login-window.c
   trunk/gui/simple-greeter/gdm-greeter-login-window.h
   trunk/gui/simple-greeter/gdm-greeter-session.c
   trunk/gui/simple-greeter/gdm-user-chooser-dialog.c
   trunk/gui/simple-greeter/gdm-user-chooser-dialog.h
   trunk/gui/simple-greeter/gdm-user-chooser-widget.c
   trunk/gui/simple-greeter/gdm-user-chooser-widget.h
   trunk/gui/simple-greeter/greeter-main.c
   trunk/gui/simple-greeter/test-greeter-login-window.c
   trunk/gui/simple-greeter/test-user-chooser.c

Modified: trunk/common/gdm-settings-client.c
==============================================================================
--- trunk/common/gdm-settings-client.c	(original)
+++ trunk/common/gdm-settings-client.c	Wed Feb 20 18:41:49 2008
@@ -236,6 +236,8 @@
                 *value = g_strdup (str);
         }
 
+        ret = TRUE;
+
         g_free (str);
 
         return ret;

Modified: trunk/common/gdm-settings-keys.h
==============================================================================
--- trunk/common/gdm-settings-keys.h	(original)
+++ trunk/common/gdm-settings-keys.h	Wed Feb 20 18:41:49 2008
@@ -27,6 +27,9 @@
 
 #define GDM_KEY_USER "daemon/User"
 #define GDM_KEY_GROUP "daemon/Group"
+#define GDM_KEY_TIMED_LOGIN_ENABLE "daemon/TimedLoginEnable"
+#define GDM_KEY_TIMED_LOGIN_USER "daemon/TimedLogin"
+#define GDM_KEY_TIMED_LOGIN_DELAY "daemon/TimedLoginDelay"
 
 #define GDM_KEY_XDMCP "xdmcp/Enable"
 #define GDM_KEY_MAX_PENDING "xdmcp/MaxPending"

Modified: trunk/daemon/gdm-factory-slave.c
==============================================================================
--- trunk/daemon/gdm-factory-slave.c	(original)
+++ trunk/daemon/gdm-factory-slave.c	Wed Feb 20 18:41:49 2008
@@ -375,7 +375,8 @@
                                GdmFactorySlave  *slave)
 {
         g_debug ("GdmFactorySlave: begin verification");
-        gdm_session_setup (GDM_SESSION (slave->priv->session));
+        gdm_session_setup (GDM_SESSION (slave->priv->session),
+                           "gdm");
 }
 
 static void
@@ -385,6 +386,7 @@
 {
         g_debug ("GdmFactorySlave: begin verification for user");
         gdm_session_setup_for_user (GDM_SESSION (slave->priv->session),
+                                    "gdm",
                                     username);
 }
 

Modified: trunk/daemon/gdm-greeter-server.c
==============================================================================
--- trunk/daemon/gdm-greeter-server.c	(original)
+++ trunk/daemon/gdm-greeter-server.c	Wed Feb 20 18:41:49 2008
@@ -69,6 +69,7 @@
 };
 
 enum {
+        BEGIN_TIMED_LOGIN,
         BEGIN_VERIFICATION,
         BEGIN_VERIFICATION_FOR_USER,
         QUERY_ANSWER,
@@ -281,6 +282,23 @@
         return DBUS_HANDLER_RESULT_HANDLED;
 }
 
+static DBusHandlerResult
+handle_begin_timed_login (GdmGreeterServer *greeter_server,
+                        DBusConnection   *connection,
+                        DBusMessage      *message)
+{
+        DBusMessage *reply;
+
+        g_debug ("GreeterServer: BeginTimedLogin");
+
+        reply = dbus_message_new_method_return (message);
+        dbus_connection_send (connection, reply, NULL);
+        dbus_message_unref (reply);
+
+        g_signal_emit (greeter_server, signals [BEGIN_TIMED_LOGIN], 0);
+
+        return DBUS_HANDLER_RESULT_HANDLED;
+}
 
 static DBusHandlerResult
 handle_begin_verification_for_user (GdmGreeterServer *greeter_server,
@@ -504,6 +522,8 @@
                 return handle_begin_verification (greeter_server, connection, message);
         } else if (dbus_message_is_method_call (message, GDM_GREETER_SERVER_DBUS_INTERFACE, "BeginVerificationForUser")) {
                 return handle_begin_verification_for_user (greeter_server, connection, message);
+        } else if (dbus_message_is_method_call (message, GDM_GREETER_SERVER_DBUS_INTERFACE, "BeginTimedLogin")) {
+                return handle_begin_timed_login (greeter_server, connection, message);
         } else if (dbus_message_is_method_call (message, GDM_GREETER_SERVER_DBUS_INTERFACE, "AnswerQuery")) {
                 return handle_answer_query (greeter_server, connection, message);
         } else if (dbus_message_is_method_call (message, GDM_GREETER_SERVER_DBUS_INTERFACE, "SelectSession")) {
@@ -549,6 +569,7 @@
         xml = g_string_append (xml,
                                "  <interface name=\"org.gnome.DisplayManager.GreeterServer\">\n"
                                "    <method name=\"BeginVerification\">\n"
+                               "    <method name=\"BeginTimedLogin\">\n"
                                "    </method>\n"
                                "    <method name=\"BeginVerificationForUser\">\n"
                                "      <arg name=\"username\" direction=\"in\" type=\"s\"/>\n"
@@ -967,6 +988,16 @@
                               g_cclosure_marshal_VOID__VOID,
                               G_TYPE_NONE,
                               0);
+        signals [BEGIN_TIMED_LOGIN] =
+                g_signal_new ("begin-timed-login",
+                              G_OBJECT_CLASS_TYPE (object_class),
+                              G_SIGNAL_RUN_FIRST,
+                              G_STRUCT_OFFSET (GdmGreeterServerClass, begin_timed_login),
+                              NULL,
+                              NULL,
+                              g_cclosure_marshal_VOID__VOID,
+                              G_TYPE_NONE,
+                              0);
         signals [BEGIN_VERIFICATION_FOR_USER] =
                 g_signal_new ("begin-verification-for-user",
                               G_OBJECT_CLASS_TYPE (object_class),

Modified: trunk/daemon/gdm-greeter-server.h
==============================================================================
--- trunk/daemon/gdm-greeter-server.h	(original)
+++ trunk/daemon/gdm-greeter-server.h	Wed Feb 20 18:41:49 2008
@@ -45,9 +45,10 @@
 {
         GObjectClass   parent_class;
 
+        void (* begin_timed_login)          (GdmGreeterServer  *greeter_server);
+        void (* begin_verification)         (GdmGreeterServer  *greeter_server);
         void (* begin_verification_for_user)(GdmGreeterServer  *greeter_server,
                                              const char        *username);
-        void (* begin_verification)         (GdmGreeterServer  *greeter_server);
         void (* query_answer)               (GdmGreeterServer  *greeter_server,
                                              const char        *text);
         void (* session_selected)           (GdmGreeterServer  *greeter_server,

Modified: trunk/daemon/gdm-product-slave.c
==============================================================================
--- trunk/daemon/gdm-product-slave.c	(original)
+++ trunk/daemon/gdm-product-slave.c	Wed Feb 20 18:41:49 2008
@@ -547,9 +547,25 @@
 on_relay_setup (GdmProductSlave *slave,
                 DBusMessage     *message)
 {
-        g_debug ("GdmProductSlave: Relay Setup");
+        DBusError   error;
+        const char *service_name;
+        dbus_bool_t res;
 
-        gdm_session_setup (GDM_SESSION (slave->priv->session));
+        service_name = NULL;
+
+        dbus_error_init (&error);
+        res = dbus_message_get_args (message,
+                                     &error,
+                                     DBUS_TYPE_STRING, &service_name,
+                                     DBUS_TYPE_INVALID);
+        if (res) {
+                g_debug ("GdmProductSlave: Relay Setup");
+                gdm_session_setup (GDM_SESSION (slave->priv->session),
+                                   service_name);
+        } else {
+                g_warning ("Unable to get arguments: %s", error.message);
+                dbus_error_free (&error);
+        }
 }
 
 static void
@@ -557,17 +573,24 @@
                          DBusMessage     *message)
 {
         DBusError   error;
-        const char *text;
+        const char *service_name;
+        const char *username;
         dbus_bool_t res;
 
+        username = NULL;
+        service_name = NULL;
+
         dbus_error_init (&error);
         res = dbus_message_get_args (message,
                                      &error,
-                                     DBUS_TYPE_STRING, &text,
+                                     DBUS_TYPE_STRING, &service_name,
+                                     DBUS_TYPE_STRING, &username,
                                      DBUS_TYPE_INVALID);
         if (res) {
                 g_debug ("GdmProductSlave: Relay SetupForUser");
-                gdm_session_setup_for_user (GDM_SESSION (slave->priv->session), text);
+                gdm_session_setup_for_user (GDM_SESSION (slave->priv->session),
+                                            service_name,
+                                            username);
         } else {
                 g_warning ("Unable to get arguments: %s", error.message);
                 dbus_error_free (&error);

Modified: trunk/daemon/gdm-session-direct.c
==============================================================================
--- trunk/daemon/gdm-session-direct.c	(original)
+++ trunk/daemon/gdm-session-direct.c	Wed Feb 20 18:41:49 2008
@@ -78,7 +78,6 @@
         guint32              is_running : 1;
 
         /* object lifetime scope */
-        char                *service_name;
         char                *display_name;
         char                *display_hostname;
         char                *display_device;
@@ -92,7 +91,6 @@
 
 enum {
         PROP_0,
-        PROP_SERVICE_NAME,
         PROP_DISPLAY_NAME,
         PROP_DISPLAY_HOSTNAME,
         PROP_DISPLAY_IS_LOCAL,
@@ -1227,7 +1225,6 @@
 
         session->priv->session_pid = -1;
         session->priv->selected_session = g_strdup ("gnome.desktop");
-        session->priv->service_name = g_strdup ("gdm");
 
         session->priv->environment = g_hash_table_new_full (g_str_hash,
                                                             g_str_equal,
@@ -1343,7 +1340,8 @@
 }
 
 static void
-send_setup (GdmSessionDirect *session)
+send_setup (GdmSessionDirect *session,
+            const char       *service_name)
 {
         DBusMessage    *message;
         DBusMessageIter iter;
@@ -1352,6 +1350,8 @@
         const char     *display_hostname;
         const char     *display_x11_authority_file;
 
+        g_assert (service_name != NULL);
+
         if (session->priv->display_name != NULL) {
                 display_name = session->priv->display_name;
         } else {
@@ -1380,7 +1380,7 @@
                                            "Setup");
 
         dbus_message_iter_init_append (message, &iter);
-        dbus_message_iter_append_basic (&iter, DBUS_TYPE_STRING, &session->priv->service_name);
+        dbus_message_iter_append_basic (&iter, DBUS_TYPE_STRING, &service_name);
         dbus_message_iter_append_basic (&iter, DBUS_TYPE_STRING, &display_name);
         dbus_message_iter_append_basic (&iter, DBUS_TYPE_STRING, &display_device);
         dbus_message_iter_append_basic (&iter, DBUS_TYPE_STRING, &display_hostname);
@@ -1394,7 +1394,8 @@
 }
 
 static void
-send_setup_for_user (GdmSessionDirect *session)
+send_setup_for_user (GdmSessionDirect *session,
+                     const char       *service_name)
 {
         DBusMessage    *message;
         DBusMessageIter iter;
@@ -1404,6 +1405,8 @@
         const char     *display_x11_authority_file;
         const char     *selected_user;
 
+        g_assert (service_name != NULL);
+
         if (session->priv->display_name != NULL) {
                 display_name = session->priv->display_name;
         } else {
@@ -1437,7 +1440,7 @@
                                            "SetupForUser");
 
         dbus_message_iter_init_append (message, &iter);
-        dbus_message_iter_append_basic (&iter, DBUS_TYPE_STRING, &session->priv->service_name);
+        dbus_message_iter_append_basic (&iter, DBUS_TYPE_STRING, &service_name);
         dbus_message_iter_append_basic (&iter, DBUS_TYPE_STRING, &display_name);
         dbus_message_iter_append_basic (&iter, DBUS_TYPE_STRING, &display_device);
         dbus_message_iter_append_basic (&iter, DBUS_TYPE_STRING, &display_hostname);
@@ -1452,19 +1455,21 @@
 }
 
 static void
-gdm_session_direct_setup (GdmSession *session)
+gdm_session_direct_setup (GdmSession *session,
+                          const char *service_name)
 {
         GdmSessionDirect *impl = GDM_SESSION_DIRECT (session);
 
         g_return_if_fail (session != NULL);
         g_return_if_fail (dbus_connection_get_is_connected (impl->priv->worker_connection));
 
-        send_setup (impl);
+        send_setup (impl, service_name);
 }
 
 static void
-gdm_session_direct_setup_for_user (GdmSession  *session,
-                                   const char  *username)
+gdm_session_direct_setup_for_user (GdmSession *session,
+                                   const char *service_name,
+                                   const char *username)
 {
         GdmSessionDirect *impl = GDM_SESSION_DIRECT (session);
 
@@ -1474,7 +1479,7 @@
 
         gdm_session_direct_select_user (session, username);
 
-        send_setup_for_user (impl);
+        send_setup_for_user (impl, service_name);
 }
 
 static void
@@ -1921,14 +1926,6 @@
         impl->priv->selected_language = g_strdup (text);
 }
 
-static void
-_gdm_session_direct_set_service_name (GdmSessionDirect *session,
-                                      const char       *name)
-{
-        g_free (session->priv->service_name);
-        session->priv->service_name = g_strdup (name);
-}
-
 /* At some point we may want to read these right from
  * the slave but for now I don't want the dependency */
 static void
@@ -1990,9 +1987,6 @@
         self = GDM_SESSION_DIRECT (object);
 
         switch (prop_id) {
-        case PROP_SERVICE_NAME:
-                _gdm_session_direct_set_service_name (self, g_value_get_string (value));
-                break;
         case PROP_DISPLAY_NAME:
                 _gdm_session_direct_set_display_name (self, g_value_get_string (value));
                 break;
@@ -2028,9 +2022,6 @@
         self = GDM_SESSION_DIRECT (object);
 
         switch (prop_id) {
-        case PROP_SERVICE_NAME:
-                g_value_set_string (value, self->priv->service_name);
-                break;
         case PROP_DISPLAY_NAME:
                 g_value_set_string (value, self->priv->display_name);
                 break;
@@ -2066,9 +2057,6 @@
 
         gdm_session_direct_close (GDM_SESSION (session));
 
-        g_free (session->priv->service_name);
-        session->priv->service_name = NULL;
-
         g_free (session->priv->display_name);
         session->priv->display_name = NULL;
 
@@ -2148,13 +2136,6 @@
         g_type_class_add_private (session_class, sizeof (GdmSessionDirectPrivate));
 
         g_object_class_install_property (object_class,
-                                         PROP_SERVICE_NAME,
-                                         g_param_spec_string ("service-name",
-                                                              "service name",
-                                                              "service name",
-                                                              "gdm",
-                                                              G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
-        g_object_class_install_property (object_class,
                                          PROP_DISPLAY_NAME,
                                          g_param_spec_string ("display-name",
                                                               "display name",

Modified: trunk/daemon/gdm-session-relay.c
==============================================================================
--- trunk/daemon/gdm-session-relay.c	(original)
+++ trunk/daemon/gdm-session-relay.c	Wed Feb 20 18:41:49 2008
@@ -132,8 +132,36 @@
 }
 
 static void
+send_dbus_string_string_signal (GdmSessionRelay *session_relay,
+                                const char      *name,
+                                const char      *text1,
+                                const char      *text2)
+{
+        DBusMessage    *message;
+        DBusMessageIter iter;
+
+        g_return_if_fail (session_relay != NULL);
+
+        g_debug ("GdmSessionRelay: sending signal %s", name);
+        message = dbus_message_new_signal (GDM_SESSION_RELAY_DBUS_PATH,
+                                           GDM_SESSION_RELAY_DBUS_INTERFACE,
+                                           name);
+
+        dbus_message_iter_init_append (message, &iter);
+        dbus_message_iter_append_basic (&iter, DBUS_TYPE_STRING, &text1);
+        dbus_message_iter_init_append (message, &iter);
+        dbus_message_iter_append_basic (&iter, DBUS_TYPE_STRING, &text2);
+
+        if (! send_dbus_message (session_relay->priv->session_connection, message)) {
+                g_debug ("GdmSessionRelay: Could not send %s signal", name);
+        }
+
+        dbus_message_unref (message);
+}
+
+static void
 send_dbus_void_signal (GdmSessionRelay *session_relay,
-                       const char        *name)
+                       const char      *name)
 {
         DBusMessage    *message;
 
@@ -166,18 +194,20 @@
 }
 
 static void
-gdm_session_relay_setup (GdmSession *session)
+gdm_session_relay_setup (GdmSession *session,
+                         const char *service_name)
 {
         GdmSessionRelay *impl = GDM_SESSION_RELAY (session);
-        send_dbus_void_signal (impl, "Setup");
+        send_dbus_string_signal (impl, "Setup", service_name);
 }
 
 static void
 gdm_session_relay_setup_for_user (GdmSession *session,
+                                  const char *service_name,
                                   const char *username)
 {
         GdmSessionRelay *impl = GDM_SESSION_RELAY (session);
-        send_dbus_string_signal (impl, "SetupForUser", username);
+        send_dbus_string_string_signal (impl, "SetupForUser", service_name, username);
 }
 
 static void
@@ -742,15 +772,9 @@
                                "    </signal>\n"
                                "    <signal name=\"Setup\">\n"
                                "      <arg name=\"service_name\" type=\"s\"/>\n"
-                               "      <arg name=\"x11_display_name\" type=\"s\"/>\n"
-                               "      <arg name=\"display_device\" type=\"s\"/>\n"
-                               "      <arg name=\"hostname\" type=\"s\"/>\n"
                                "    </signal>\n"
                                "    <signal name=\"SetupForUser\">\n"
                                "      <arg name=\"service_name\" type=\"s\"/>\n"
-                               "      <arg name=\"x11_display_name\" type=\"s\"/>\n"
-                               "      <arg name=\"display_device\" type=\"s\"/>\n"
-                               "      <arg name=\"hostname\" type=\"s\"/>\n"
                                "      <arg name=\"username\" type=\"s\"/>\n"
                                "    </signal>\n"
                                "    <signal name=\"Authenticate\">\n"

Modified: trunk/daemon/gdm-session.c
==============================================================================
--- trunk/daemon/gdm-session.c	(original)
+++ trunk/daemon/gdm-session.c	Wed Feb 20 18:41:49 2008
@@ -93,20 +93,22 @@
 }
 
 void
-gdm_session_setup (GdmSession *session)
+gdm_session_setup (GdmSession *session,
+                   const char *service_name)
 {
         g_return_if_fail (GDM_IS_SESSION (session));
 
-        GDM_SESSION_GET_IFACE (session)->setup (session);
+        GDM_SESSION_GET_IFACE (session)->setup (session, service_name);
 }
 
 void
 gdm_session_setup_for_user (GdmSession *session,
+                            const char *service_name,
                             const char *username)
 {
         g_return_if_fail (GDM_IS_SESSION (session));
 
-        GDM_SESSION_GET_IFACE (session)->setup_for_user (session, username);
+        GDM_SESSION_GET_IFACE (session)->setup_for_user (session, service_name, username);
 }
 
 void

Modified: trunk/daemon/gdm-session.h
==============================================================================
--- trunk/daemon/gdm-session.h	(original)
+++ trunk/daemon/gdm-session.h	Wed Feb 20 18:41:49 2008
@@ -46,8 +46,10 @@
 
         /* Methods */
         void (* open)                        (GdmSession   *session);
-        void (* setup)                       (GdmSession   *session);
+        void (* setup)                       (GdmSession   *session,
+                                              const char   *service_name);
         void (* setup_for_user)              (GdmSession   *session,
+                                              const char   *service_name,
                                               const char   *username);
         void (* reset)                       (GdmSession   *session);
         void (* authenticate)                (GdmSession   *session);
@@ -111,8 +113,10 @@
 GType    gdm_session_get_type                    (void) G_GNUC_CONST;
 
 void     gdm_session_open                        (GdmSession *session);
-void     gdm_session_setup                       (GdmSession *session);
+void     gdm_session_setup                       (GdmSession *session,
+                                                  const char *service_name);
 void     gdm_session_setup_for_user              (GdmSession *session,
+                                                  const char *service_name,
                                                   const char *username);
 void     gdm_session_reset                       (GdmSession *session);
 void     gdm_session_authenticate                (GdmSession *session);

Modified: trunk/daemon/gdm-simple-slave.c
==============================================================================
--- trunk/daemon/gdm-simple-slave.c	(original)
+++ trunk/daemon/gdm-simple-slave.c	Wed Feb 20 18:41:49 2008
@@ -42,6 +42,9 @@
 
 #include "gdm-common.h"
 
+#include "gdm-settings-client.h"
+#include "gdm-settings-keys.h"
+
 #include "gdm-simple-slave.h"
 #include "gdm-simple-slave-glue.h"
 
@@ -557,7 +560,37 @@
                                GdmSimpleSlave   *slave)
 {
         g_debug ("GdmSimpleSlave: begin verification");
-        gdm_session_setup (GDM_SESSION (slave->priv->session));
+        gdm_session_setup (GDM_SESSION (slave->priv->session),
+                           "gdm");
+}
+
+static void
+on_greeter_begin_timed_login (GdmGreeterServer *greeter_server,
+                              GdmSimpleSlave   *slave)
+{
+        char    *username;
+        gboolean enabled;
+        gboolean res;
+
+        g_debug ("GdmSimpleSlave: begin timed login");
+
+        enabled = FALSE;
+        res = gdm_settings_client_get_boolean (GDM_KEY_TIMED_LOGIN_ENABLE, &enabled);
+        if (! enabled) {
+                g_warning ("GdmSimpleSlave: timed login requested but disabled in configuration");
+                return;
+        }
+
+        username = NULL;
+        res = gdm_settings_client_get_string (GDM_KEY_TIMED_LOGIN_USER, &username);
+        if (username == NULL) {
+                g_warning ("GdmSimpleSlave: timed login requested but username not specified in configuration");
+                return;
+        }
+
+        gdm_session_setup_for_user (GDM_SESSION (slave->priv->session),
+                                    "gdm-autologin",
+                                    username);
 }
 
 static void
@@ -567,6 +600,7 @@
 {
         g_debug ("GdmSimpleSlave: begin verification");
         gdm_session_setup_for_user (GDM_SESSION (slave->priv->session),
+                                    "gdm",
                                     username);
 }
 
@@ -693,6 +727,10 @@
 
         slave->priv->greeter_server = gdm_greeter_server_new (display_id);
         g_signal_connect (slave->priv->greeter_server,
+                          "begin-timed-login",
+                          G_CALLBACK (on_greeter_begin_timed_login),
+                          slave);
+        g_signal_connect (slave->priv->greeter_server,
                           "begin-verification",
                           G_CALLBACK (on_greeter_begin_verification),
                           slave);

Modified: trunk/daemon/simple-slave-main.c
==============================================================================
--- trunk/daemon/simple-slave-main.c	(original)
+++ trunk/daemon/simple-slave-main.c	Wed Feb 20 18:41:49 2008
@@ -44,6 +44,8 @@
 #include "gdm-common.h"
 #include "gdm-simple-slave.h"
 
+#include "gdm-settings-client.h"
+
 static int gdm_return_code = 0;
 
 static DBusGConnection *
@@ -188,6 +190,11 @@
                 exit (1);
         }
 
+        if (! gdm_settings_client_init (GDMCONFDIR "/gdm.schemas", "/")) {
+                g_critical ("Unable to initialize settings client");
+                exit (1);
+        }
+
         main_loop = g_main_loop_new (NULL, FALSE);
 
         signal_handler = gdm_signal_handler_new ();

Modified: trunk/daemon/test-session.c
==============================================================================
--- trunk/daemon/test-session.c	(original)
+++ trunk/daemon/test-session.c	Wed Feb 20 18:41:49 2008
@@ -38,7 +38,7 @@
 {
         g_debug ("Got opened: calling setup...");
 
-        gdm_session_setup (session);
+        gdm_session_setup (session, "gdm");
 }
 
 static void

Modified: trunk/gui/simple-greeter/gdm-greeter-client.c
==============================================================================
--- trunk/gui/simple-greeter/gdm-greeter-client.c	(original)
+++ trunk/gui/simple-greeter/gdm-greeter-client.c	Wed Feb 20 18:41:49 2008
@@ -115,7 +115,7 @@
                                      DBUS_TYPE_INVALID);
         if (res) {
 
-                g_debug ("GdmGreeterClient: Recieved %s (%s)", name, text);
+                g_debug ("GdmGreeterClient: Received %s (%s)", name, text);
 
                 g_signal_emit (client,
                                gdm_greeter_client_signals[signal],
@@ -291,6 +291,13 @@
 }
 
 void
+gdm_greeter_client_call_begin_timed_login (GdmGreeterClient *client)
+{
+        send_dbus_void_method (client->priv->connection,
+                               "BeginTimedLogin");
+}
+
+void
 gdm_greeter_client_call_begin_verification (GdmGreeterClient *client)
 {
         send_dbus_void_method (client->priv->connection,

Modified: trunk/gui/simple-greeter/gdm-greeter-client.h
==============================================================================
--- trunk/gui/simple-greeter/gdm-greeter-client.h	(original)
+++ trunk/gui/simple-greeter/gdm-greeter-client.h	Wed Feb 20 18:41:49 2008
@@ -86,6 +86,7 @@
 
 char *             gdm_greeter_client_call_get_display_id            (GdmGreeterClient *client);
 
+void               gdm_greeter_client_call_begin_timed_login         (GdmGreeterClient *client);
 void               gdm_greeter_client_call_begin_verification        (GdmGreeterClient *client);
 void               gdm_greeter_client_call_begin_verification_for_user (GdmGreeterClient *client,
                                                                         const char       *username);

Modified: trunk/gui/simple-greeter/gdm-greeter-login-window.c
==============================================================================
--- trunk/gui/simple-greeter/gdm-greeter-login-window.c	(original)
+++ trunk/gui/simple-greeter/gdm-greeter-login-window.c	Wed Feb 20 18:41:49 2008
@@ -60,6 +60,9 @@
 #include <polkit-gnome/polkit-gnome.h>
 #endif
 
+#include "gdm-settings-client.h"
+#include "gdm-settings-keys.h"
+
 #include "gdm-greeter-login-window.h"
 #include "gdm-user-chooser-widget.h"
 
@@ -86,6 +89,7 @@
 #define GLADE_XML_FILE       "gdm-greeter-login-window.glade"
 
 #define LOGO_KEY             "/apps/gdm/simple-greeter/logo-icon-name"
+#define TIMED_LOGIN_TIMEOUT_SEC  60
 
 #define GDM_GREETER_LOGIN_WINDOW_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), GDM_TYPE_GREETER_LOGIN_WINDOW, GdmGreeterLoginWindowPrivate))
 
@@ -94,6 +98,12 @@
         MODE_AUTHENTICATION
 };
 
+enum {
+        LOGIN_BUTTON_HIDDEN = 0,
+        LOGIN_BUTTON_ANSWER_QUERY,
+        LOGIN_BUTTON_TIMED_LOGIN
+};
+
 struct GdmGreeterLoginWindowPrivate
 {
         GladeXML        *xml;
@@ -101,7 +111,13 @@
         gboolean         display_is_local;
         char            *timeformat;
 
+        gboolean         timed_login_enabled;
+        guint            timed_login_delay;
+        guint            timed_login_timeout_id;
+
         guint            animation_timeout_id;
+
+        guint            login_button_handler_id;
 };
 
 enum {
@@ -110,6 +126,7 @@
 };
 
 enum {
+        BEGIN_TIMED_LOGIN,
         BEGIN_VERIFICATION,
         BEGIN_VERIFICATION_FOR_USER,
         QUERY_ANSWER,
@@ -174,7 +191,6 @@
         }
 }
 
-
 static void
 set_message (GdmGreeterLoginWindow *login_window,
              const char            *text)
@@ -186,6 +202,40 @@
 }
 
 static void
+remove_timed_login_timeout (GdmGreeterLoginWindow *login_window)
+{
+        if (login_window->priv->timed_login_timeout_id > 0) {
+                g_source_remove (login_window->priv->timed_login_timeout_id);
+                login_window->priv->timed_login_timeout_id = 0;
+        }
+}
+
+static gboolean
+timed_login_timer (GdmGreeterLoginWindow *login_window)
+{
+        set_sensitive (login_window, FALSE);
+        set_message (login_window, _("Automatically logging in..."));
+
+        g_debug ("GdmGreeterLoginWindow: emitting begin-timed_login");
+        g_signal_emit (login_window, signals[BEGIN_TIMED_LOGIN], 0);
+        login_window->priv->timed_login_timeout_id = 0;
+
+        return FALSE;
+}
+
+static void
+restart_timed_login_timeout (GdmGreeterLoginWindow *login_window)
+{
+        remove_timed_login_timeout (login_window);
+
+        if (login_window->priv->timed_login_enabled) {
+                login_window->priv->timed_login_timeout_id = g_timeout_add_seconds (login_window->priv->timed_login_delay,
+                                                                                    (GSourceFunc)timed_login_timer,
+                                                                                    login_window);
+        }
+}
+
+static void
 show_widget (GdmGreeterLoginWindow *login_window,
              const char            *name,
              gboolean               visible)
@@ -228,6 +278,65 @@
 }
 
 static void
+on_login_button_clicked_answer_query (GtkButton             *button,
+                                      GdmGreeterLoginWindow *login_window)
+{
+        GtkWidget  *entry;
+        const char *text;
+
+        set_busy (login_window);
+        set_sensitive (login_window, FALSE);
+
+        entry = glade_xml_get_widget (login_window->priv->xml, "auth-prompt-entry");
+        text = gtk_entry_get_text (GTK_ENTRY (entry));
+
+        g_signal_emit (login_window, signals[QUERY_ANSWER], 0, text);
+}
+
+static void
+on_login_button_clicked_timed_login (GtkButton             *button,
+                                   GdmGreeterLoginWindow *login_window)
+{
+        set_busy (login_window);
+        set_sensitive (login_window, FALSE);
+
+        g_signal_emit (login_window, signals[BEGIN_TIMED_LOGIN], 0);
+}
+
+static void
+set_log_in_button_mode (GdmGreeterLoginWindow *login_window,
+                        int                    mode)
+{
+        GtkWidget *button;
+
+        button = glade_xml_get_widget (login_window->priv->xml, "log-in-button");
+        gtk_widget_grab_default (button);
+
+        /* disconnect any signals */
+        if (login_window->priv->login_button_handler_id > 0) {
+                g_signal_handler_disconnect (button, login_window->priv->login_button_handler_id);
+                login_window->priv->login_button_handler_id = 0;
+       }
+
+        switch (mode) {
+        case LOGIN_BUTTON_HIDDEN:
+                gtk_widget_hide (button);
+                break;
+        case LOGIN_BUTTON_ANSWER_QUERY:
+                login_window->priv->login_button_handler_id = g_signal_connect (button, "clicked", G_CALLBACK (on_login_button_clicked_answer_query), login_window);
+                gtk_widget_show (button);
+                break;
+        case LOGIN_BUTTON_TIMED_LOGIN:
+                login_window->priv->login_button_handler_id = g_signal_connect (button, "clicked", G_CALLBACK (on_login_button_clicked_timed_login), login_window);
+                gtk_widget_show (button);
+                break;
+        default:
+                g_assert_not_reached ();
+                break;
+        }
+}
+
+static void
 switch_mode (GdmGreeterLoginWindow *login_window,
              int                    number)
 {
@@ -239,11 +348,14 @@
         /* FIXME: do animation */
         default_name = NULL;
 
+        restart_timed_login_timeout (login_window);
+
         show_restart_shutdown = get_show_restart_buttons (login_window);
 
         switch (number) {
         case MODE_SELECTION:
-                show_widget (login_window, "log-in-button", FALSE);
+                set_log_in_button_mode (login_window, LOGIN_BUTTON_HIDDEN);
+
                 show_widget (login_window, "cancel-button", FALSE);
                 show_widget (login_window, "shutdown-button",
                              login_window->priv->display_is_local && show_restart_shutdown);
@@ -255,7 +367,6 @@
                 default_name = NULL;
                 break;
         case MODE_AUTHENTICATION:
-                show_widget (login_window, "log-in-button", TRUE);
                 show_widget (login_window, "cancel-button", TRUE);
                 show_widget (login_window, "shutdown-button", FALSE);
                 show_widget (login_window, "restart-button", FALSE);
@@ -349,6 +460,7 @@
         switch_mode (login_window, MODE_SELECTION);
         set_busy (login_window);
         set_sensitive (login_window, FALSE);
+        set_message (login_window, "");
 
         g_signal_emit (login_window, signals[CANCELLED], 0);
 
@@ -366,6 +478,7 @@
         entry = glade_xml_get_widget (GDM_GREETER_LOGIN_WINDOW (login_window)->priv->xml, "auth-prompt-entry");
         gtk_entry_set_text (GTK_ENTRY (entry), "");
         gtk_entry_set_visibility (GTK_ENTRY (entry), TRUE);
+        set_message (login_window, "");
 
         label = glade_xml_get_widget (GDM_GREETER_LOGIN_WINDOW (login_window)->priv->xml, "auth-prompt-label");
         gtk_label_set_text (GTK_LABEL (label), "");
@@ -379,6 +492,8 @@
         set_sensitive (login_window, TRUE);
         set_ready (login_window);
         set_focus (GDM_GREETER_LOGIN_WINDOW (login_window));
+
+        restart_timed_login_timeout (login_window);
 }
 
 gboolean
@@ -443,6 +558,7 @@
         entry = glade_xml_get_widget (GDM_GREETER_LOGIN_WINDOW (login_window)->priv->xml, "auth-prompt-entry");
         gtk_entry_set_text (GTK_ENTRY (entry), "");
         gtk_entry_set_visibility (GTK_ENTRY (entry), TRUE);
+        set_log_in_button_mode (login_window, LOGIN_BUTTON_ANSWER_QUERY);
 
         label = glade_xml_get_widget (GDM_GREETER_LOGIN_WINDOW (login_window)->priv->xml, "auth-prompt-label");
         gtk_label_set_text (GTK_LABEL (label), text);
@@ -467,6 +583,7 @@
         entry = glade_xml_get_widget (GDM_GREETER_LOGIN_WINDOW (login_window)->priv->xml, "auth-prompt-entry");
         gtk_entry_set_text (GTK_ENTRY (entry), "");
         gtk_entry_set_visibility (GTK_ENTRY (entry), FALSE);
+        set_log_in_button_mode (login_window, LOGIN_BUTTON_ANSWER_QUERY);
 
         label = glade_xml_get_widget (GDM_GREETER_LOGIN_WINDOW (login_window)->priv->xml, "auth-prompt-label");
         gtk_label_set_text (GTK_LABEL (label), text);
@@ -527,22 +644,6 @@
 }
 
 static void
-log_in_button_clicked (GtkButton             *button,
-                       GdmGreeterLoginWindow *login_window)
-{
-        GtkWidget  *entry;
-        const char *text;
-
-        set_busy (login_window);
-        set_sensitive (login_window, FALSE);
-
-        entry = glade_xml_get_widget (login_window->priv->xml, "auth-prompt-entry");
-        text = gtk_entry_get_text (GTK_ENTRY (entry));
-
-        g_signal_emit (login_window, signals[QUERY_ANSWER], 0, text);
-}
-
-static void
 suspend_button_clicked (GtkButton             *button,
                         GdmGreeterLoginWindow *login_window)
 {
@@ -841,6 +942,10 @@
                 g_signal_emit (login_window, signals[BEGIN_VERIFICATION], 0);
         } else if (strcmp (user_name, GDM_USER_CHOOSER_USER_GUEST) == 0) {
                 /* FIXME: handle guest account stuff */
+        } else if (strcmp (user_name, GDM_USER_CHOOSER_USER_AUTO) == 0) {
+                /* just wait for the user to select language and stuff */
+                set_log_in_button_mode (login_window, LOGIN_BUTTON_TIMED_LOGIN);
+                set_message (login_window, _("Select language and click Log In"));
         } else {
                 g_signal_emit (login_window, signals[BEGIN_VERIFICATION_FOR_USER], 0, user_name);
         }
@@ -1058,9 +1163,9 @@
 
         gdm_user_chooser_widget_set_show_only_chosen (GDM_USER_CHOOSER_WIDGET (login_window->priv->user_chooser), TRUE);
 
-        /* FIXME: set from gconf */
-        gdm_user_chooser_widget_set_show_other_user (GDM_USER_CHOOSER_WIDGET (login_window->priv->user_chooser), TRUE);
-        gdm_user_chooser_widget_set_show_guest_user (GDM_USER_CHOOSER_WIDGET (login_window->priv->user_chooser), TRUE);
+        if (login_window->priv->timed_login_enabled) {
+                gdm_user_chooser_widget_set_show_auto_user (GDM_USER_CHOOSER_WIDGET (login_window->priv->user_chooser), TRUE);
+        }
 
         g_signal_connect (login_window->priv->user_chooser,
                           "activated",
@@ -1076,10 +1181,6 @@
         button = glade_xml_get_widget (login_window->priv->xml, "suspend-button");
         g_signal_connect (button, "clicked", G_CALLBACK (suspend_button_clicked), login_window);
 
-        button = glade_xml_get_widget (login_window->priv->xml, "log-in-button");
-        gtk_widget_grab_default (button);
-        g_signal_connect (button, "clicked", G_CALLBACK (log_in_button_clicked), login_window);
-
         button = glade_xml_get_widget (login_window->priv->xml, "cancel-button");
         g_signal_connect (button, "clicked", G_CALLBACK (cancel_button_clicked), login_window);
 
@@ -1215,6 +1316,49 @@
         GTK_WIDGET_CLASS (gdm_greeter_login_window_parent_class)->size_allocate (widget, allocation);
 }
 
+static void
+read_configuration (GdmGreeterLoginWindow *login_window)
+{
+        gboolean res;
+        int      delay;
+        char    *username;
+
+        g_debug ("GdmGreeterLoginWindow: reading system configuration");
+
+        res = gdm_settings_client_get_boolean (GDM_KEY_TIMED_LOGIN_ENABLE,
+                                               &login_window->priv->timed_login_enabled);
+        if (! res) {
+                g_warning ("Unable to read configuration for %s", GDM_KEY_TIMED_LOGIN_ENABLE);
+        }
+        g_debug ("GdmGreeterLoginWindow: TimedLoginEnable=%s",
+                 login_window->priv->timed_login_enabled ? "true" : "false");
+
+        /* treat failures here as disabling */
+        username = NULL;
+        res = gdm_settings_client_get_string (GDM_KEY_TIMED_LOGIN_USER, &username);
+        if (! res) {
+                g_warning ("Unable to read configuration for %s", GDM_KEY_TIMED_LOGIN_USER);
+                login_window->priv->timed_login_enabled = FALSE;
+        } else {
+                if (username == NULL) {
+                        login_window->priv->timed_login_enabled = FALSE;
+                }
+        }
+        g_debug ("GdmGreeterLoginWindow: TimedLogin=%s", username);
+        g_free (username);
+
+        delay = -1;
+        res = gdm_settings_client_get_int (GDM_KEY_TIMED_LOGIN_DELAY, &delay);
+        if (! res) {
+                g_warning ("Unable to read configuration for %s", GDM_KEY_TIMED_LOGIN_DELAY);
+        } else {
+                if (delay >= 0) {
+                        login_window->priv->timed_login_delay = delay;
+                }
+        }
+        g_debug ("GdmGreeterLoginWindow: TimedLoginDelay=%d", delay);
+}
+
 static GObject *
 gdm_greeter_login_window_constructor (GType                  type,
                                       guint                  n_construct_properties,
@@ -1227,6 +1371,7 @@
                                                                                                                       construct_properties));
 
 
+        read_configuration (login_window);
         load_theme (login_window);
 
         return G_OBJECT (login_window);
@@ -1247,6 +1392,16 @@
         widget_class->size_request = gdm_greeter_login_window_size_request;
         widget_class->size_allocate = gdm_greeter_login_window_size_allocate;
 
+        signals [BEGIN_TIMED_LOGIN] =
+                g_signal_new ("begin-timed_login",
+                              G_TYPE_FROM_CLASS (object_class),
+                              G_SIGNAL_RUN_LAST,
+                              G_STRUCT_OFFSET (GdmGreeterLoginWindowClass, begin_timed_login),
+                              NULL,
+                              NULL,
+                              g_cclosure_marshal_VOID__VOID,
+                              G_TYPE_NONE,
+                              0);
         signals [BEGIN_VERIFICATION] =
                 g_signal_new ("begin-verification",
                               G_TYPE_FROM_CLASS (object_class),
@@ -1323,6 +1478,9 @@
 {
         login_window->priv = GDM_GREETER_LOGIN_WINDOW_GET_PRIVATE (login_window);
 
+        login_window->priv->timed_login_enabled = FALSE;
+        login_window->priv->timed_login_delay = TIMED_LOGIN_TIMEOUT_SEC;
+
         gtk_window_set_title (GTK_WINDOW (login_window), _("Login Window"));
         gtk_window_set_opacity (GTK_WINDOW (login_window), 0.85);
         gtk_window_set_position (GTK_WINDOW (login_window), GTK_WIN_POS_CENTER_ALWAYS);

Modified: trunk/gui/simple-greeter/gdm-greeter-login-window.h
==============================================================================
--- trunk/gui/simple-greeter/gdm-greeter-login-window.h	(original)
+++ trunk/gui/simple-greeter/gdm-greeter-login-window.h	Wed Feb 20 18:41:49 2008
@@ -1,6 +1,7 @@
 /* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*-
  *
  * Copyright (C) 2007 William Jon McCann <mccann jhu edu>
+ * Copyright (C) 2008 Red Hat, Inc.
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -45,6 +46,7 @@
         GtkWindowClass   parent_class;
 
         /* signals */
+        void (* begin_timed_login)           (GdmGreeterLoginWindow *login_window);
         void (* begin_verification)          (GdmGreeterLoginWindow *login_window);
         void (* begin_verification_for_user) (GdmGreeterLoginWindow *login_window,
                                               const char            *username);

Modified: trunk/gui/simple-greeter/gdm-greeter-session.c
==============================================================================
--- trunk/gui/simple-greeter/gdm-greeter-session.c	(original)
+++ trunk/gui/simple-greeter/gdm-greeter-session.c	Wed Feb 20 18:41:49 2008
@@ -158,6 +158,13 @@
 }
 
 static void
+on_begin_timed_login (GdmGreeterLoginWindow *login_window,
+                    GdmGreeterSession     *session)
+{
+        gdm_greeter_client_call_begin_timed_login (session->priv->client);
+}
+
+static void
 on_begin_verification (GdmGreeterLoginWindow *login_window,
                        GdmGreeterSession     *session)
 {
@@ -261,6 +268,10 @@
                 session->priv->login_window = gdm_greeter_login_window_new (is_local);
 
                 g_signal_connect (session->priv->login_window,
+                                  "begin-timed-login",
+                                  G_CALLBACK (on_begin_timed_login),
+                                  session);
+                g_signal_connect (session->priv->login_window,
                                   "begin-verification",
                                   G_CALLBACK (on_begin_verification),
                                   session);

Modified: trunk/gui/simple-greeter/gdm-user-chooser-dialog.c
==============================================================================
--- trunk/gui/simple-greeter/gdm-user-chooser-dialog.c	(original)
+++ trunk/gui/simple-greeter/gdm-user-chooser-dialog.c	Wed Feb 20 18:41:49 2008
@@ -62,6 +62,33 @@
         return user_name;
 }
 
+void
+gdm_user_chooser_dialog_set_show_other_user (GdmUserChooserDialog *dialog,
+                                             gboolean              show_user)
+{
+        g_return_if_fail (GDM_IS_USER_CHOOSER_DIALOG (dialog));
+
+        gdm_user_chooser_widget_set_show_other_user (GDM_USER_CHOOSER_WIDGET (dialog->priv->chooser_widget), show_user);
+}
+
+void
+gdm_user_chooser_dialog_set_show_guest_user (GdmUserChooserDialog *dialog,
+                                             gboolean              show_user)
+{
+        g_return_if_fail (GDM_IS_USER_CHOOSER_DIALOG (dialog));
+
+        gdm_user_chooser_widget_set_show_guest_user (GDM_USER_CHOOSER_WIDGET (dialog->priv->chooser_widget), show_user);
+}
+
+void
+gdm_user_chooser_dialog_set_show_auto_user (GdmUserChooserDialog *dialog,
+                                            gboolean              show_user)
+{
+        g_return_if_fail (GDM_IS_USER_CHOOSER_DIALOG (dialog));
+
+        gdm_user_chooser_widget_set_show_auto_user (GDM_USER_CHOOSER_WIDGET (dialog->priv->chooser_widget), show_user);
+}
+
 static void
 gdm_user_chooser_dialog_set_property (GObject        *object,
                                       guint           prop_id,
@@ -139,8 +166,7 @@
         dialog->priv = GDM_USER_CHOOSER_DIALOG_GET_PRIVATE (dialog);
 
         dialog->priv->chooser_widget = gdm_user_chooser_widget_new ();
-        gdm_user_chooser_widget_set_show_other_user (GDM_USER_CHOOSER_WIDGET (dialog->priv->chooser_widget), TRUE);
-        gdm_user_chooser_widget_set_show_guest_user (GDM_USER_CHOOSER_WIDGET (dialog->priv->chooser_widget), TRUE);
+
         gtk_container_add (GTK_CONTAINER (GTK_DIALOG (dialog)->vbox), dialog->priv->chooser_widget);
 
         gtk_dialog_add_buttons (GTK_DIALOG (dialog),

Modified: trunk/gui/simple-greeter/gdm-user-chooser-dialog.h
==============================================================================
--- trunk/gui/simple-greeter/gdm-user-chooser-dialog.h	(original)
+++ trunk/gui/simple-greeter/gdm-user-chooser-dialog.h	Wed Feb 20 18:41:49 2008
@@ -37,7 +37,7 @@
 
 typedef struct
 {
-        GtkDialog                        parent;
+        GtkDialog                    parent;
         GdmUserChooserDialogPrivate *priv;
 } GdmUserChooserDialog;
 
@@ -51,7 +51,12 @@
 GtkWidget            * gdm_user_chooser_dialog_new                        (void);
 
 char *                 gdm_user_chooser_dialog_get_chosen_user_name       (GdmUserChooserDialog *dialog);
-
+void                   gdm_user_chooser_dialog_set_show_other_user        (GdmUserChooserDialog *dialog,
+                                                                           gboolean              show);
+void                   gdm_user_chooser_dialog_set_show_guest_user        (GdmUserChooserDialog *dialog,
+                                                                           gboolean              show);
+void                   gdm_user_chooser_dialog_set_show_auto_user         (GdmUserChooserDialog *dialog,
+                                                                           gboolean              show);
 G_END_DECLS
 
 #endif /* __GDM_USER_CHOOSER_DIALOG_H */

Modified: trunk/gui/simple-greeter/gdm-user-chooser-widget.c
==============================================================================
--- trunk/gui/simple-greeter/gdm-user-chooser-widget.c	(original)
+++ trunk/gui/simple-greeter/gdm-user-chooser-widget.c	Wed Feb 20 18:41:49 2008
@@ -58,6 +58,7 @@
 
         guint           show_other_user : 1;
         guint           show_guest_user : 1;
+        guint           show_auto_user : 1;
 };
 
 enum {
@@ -70,6 +71,66 @@
 
 G_DEFINE_TYPE (GdmUserChooserWidget, gdm_user_chooser_widget, GDM_TYPE_CHOOSER_WIDGET)
 
+static void
+add_user_other (GdmUserChooserWidget *widget)
+{
+        gdm_chooser_widget_add_item (GDM_CHOOSER_WIDGET (widget),
+                                     GDM_USER_CHOOSER_USER_OTHER,
+                                     widget->priv->stock_person_pixbuf,
+                                     _("Other..."),
+                                     _("Choose a different account"),
+                                     0,
+                                     FALSE,
+                                     TRUE);
+}
+
+static void
+add_user_guest (GdmUserChooserWidget *widget)
+{
+        gdm_chooser_widget_add_item (GDM_CHOOSER_WIDGET (widget),
+                                     GDM_USER_CHOOSER_USER_GUEST,
+                                     widget->priv->stock_person_pixbuf,
+                                     _("Guest"),
+                                     _("Login as a temporary guest"),
+                                     0,
+                                     FALSE,
+                                     TRUE);
+}
+
+static void
+add_user_auto (GdmUserChooserWidget *widget)
+{
+        gdm_chooser_widget_add_item (GDM_CHOOSER_WIDGET (widget),
+                                     GDM_USER_CHOOSER_USER_AUTO,
+                                     widget->priv->stock_person_pixbuf,
+                                     _("Automatic Login"),
+                                     _("Automatically login to the system after selecting options"),
+                                     0,
+                                     FALSE,
+                                     TRUE);
+}
+
+static void
+remove_user_other (GdmUserChooserWidget *widget)
+{
+        gdm_chooser_widget_remove_item (GDM_CHOOSER_WIDGET (widget),
+                                        GDM_USER_CHOOSER_USER_OTHER);
+}
+
+static void
+remove_user_guest (GdmUserChooserWidget *widget)
+{
+        gdm_chooser_widget_remove_item (GDM_CHOOSER_WIDGET (widget),
+                                        GDM_USER_CHOOSER_USER_GUEST);
+}
+
+static void
+remove_user_auto (GdmUserChooserWidget *widget)
+{
+        gdm_chooser_widget_remove_item (GDM_CHOOSER_WIDGET (widget),
+                                        GDM_USER_CHOOSER_USER_AUTO);
+}
+
 void
 gdm_user_chooser_widget_set_show_other_user (GdmUserChooserWidget *widget,
                                              gboolean              show_user)
@@ -78,6 +139,11 @@
 
         if (widget->priv->show_other_user != show_user) {
                 widget->priv->show_other_user = show_user;
+                if (show_user) {
+                        add_user_other (widget);
+                } else {
+                        remove_user_other (widget);
+                }
         }
 }
 
@@ -89,6 +155,27 @@
 
         if (widget->priv->show_guest_user != show_user) {
                 widget->priv->show_guest_user = show_user;
+                if (show_user) {
+                        add_user_guest (widget);
+                } else {
+                        remove_user_guest (widget);
+                }
+        }
+}
+
+void
+gdm_user_chooser_widget_set_show_auto_user (GdmUserChooserWidget *widget,
+                                            gboolean              show_user)
+{
+        g_return_if_fail (GDM_IS_USER_CHOOSER_WIDGET (widget));
+
+        if (widget->priv->show_auto_user != show_user) {
+                widget->priv->show_auto_user = show_user;
+                if (show_user) {
+                        add_user_auto (widget);
+                } else {
+                        remove_user_auto (widget);
+                }
         }
 }
 
@@ -155,6 +242,11 @@
                                                                                                                            n_construct_properties,
                                                                                                                            construct_properties));
 
+        /* FIXME: make these construct properties */
+        gdm_user_chooser_widget_set_show_guest_user (user_chooser_widget, FALSE);
+        gdm_user_chooser_widget_set_show_auto_user (user_chooser_widget, FALSE);
+        gdm_user_chooser_widget_set_show_other_user (user_chooser_widget, TRUE);
+
         return G_OBJECT (user_chooser_widget);
 }
 
@@ -294,31 +386,6 @@
         load_icons (widget);
 }
 
-static gboolean
-add_special_users (GdmUserChooserWidget *widget)
-{
-
-        gdm_chooser_widget_add_item (GDM_CHOOSER_WIDGET (widget),
-                                     GDM_USER_CHOOSER_USER_OTHER,
-                                     widget->priv->stock_person_pixbuf,
-                                     _("Other..."),
-                                     _("Choose a different account"),
-                                     0,
-                                     FALSE,
-                                     TRUE);
-#if 0
-        gdm_chooser_widget_add_item (GDM_CHOOSER_WIDGET (widget),
-                                     GDM_USER_CHOOSER_USER_GUEST,
-                                     widget->priv->stock_person_pixbuf,
-                                     _("Guest"),
-                                     _("Login as a temporary guest"),
-                                     0,
-                                     FALSE,
-                                     TRUE);
-#endif
-        return FALSE;
-}
-
 static void
 on_user_added (GdmUserManager       *manager,
                GdmUser              *user,
@@ -438,7 +505,6 @@
                           widget);
 
         setup_icons (widget);
-        add_special_users (widget);
 }
 
 static void

Modified: trunk/gui/simple-greeter/gdm-user-chooser-widget.h
==============================================================================
--- trunk/gui/simple-greeter/gdm-user-chooser-widget.h	(original)
+++ trunk/gui/simple-greeter/gdm-user-chooser-widget.h	Wed Feb 20 18:41:49 2008
@@ -49,6 +49,7 @@
 
 #define GDM_USER_CHOOSER_USER_OTHER "__other"
 #define GDM_USER_CHOOSER_USER_GUEST "__guest"
+#define GDM_USER_CHOOSER_USER_AUTO  "__auto"
 
 GType                  gdm_user_chooser_widget_get_type                   (void);
 GtkWidget *            gdm_user_chooser_widget_new                        (void);
@@ -59,9 +60,11 @@
 void                   gdm_user_chooser_widget_set_show_only_chosen       (GdmUserChooserWidget *widget,
                                                                            gboolean              show_only);
 void                   gdm_user_chooser_widget_set_show_other_user        (GdmUserChooserWidget *widget,
-                                                                           gboolean              show_other);
+                                                                           gboolean              show);
 void                   gdm_user_chooser_widget_set_show_guest_user        (GdmUserChooserWidget *widget,
-                                                                           gboolean              show_other);
+                                                                           gboolean              show);
+void                   gdm_user_chooser_widget_set_show_auto_user         (GdmUserChooserWidget *widget,
+                                                                           gboolean              show);
 G_END_DECLS
 
 #endif /* __GDM_USER_CHOOSER_WIDGET_H */

Modified: trunk/gui/simple-greeter/greeter-main.c
==============================================================================
--- trunk/gui/simple-greeter/greeter-main.c	(original)
+++ trunk/gui/simple-greeter/greeter-main.c	Wed Feb 20 18:41:49 2008
@@ -236,6 +236,7 @@
         g_type_init ();
 
         if (! gdm_settings_client_init (GDMCONFDIR "/gdm.schemas", "/")) {
+                g_critical ("Unable to initialize settings client");
                 exit (1);
         }
 

Modified: trunk/gui/simple-greeter/test-greeter-login-window.c
==============================================================================
--- trunk/gui/simple-greeter/test-greeter-login-window.c	(original)
+++ trunk/gui/simple-greeter/test-greeter-login-window.c	Wed Feb 20 18:41:49 2008
@@ -45,6 +45,11 @@
 
         gtk_init (&argc, &argv);
 
+        if (! gdm_settings_client_init (GDMCONFDIR "/gdm.schemas", "/")) {
+                g_critical ("Unable to initialize settings client");
+                exit (1);
+        }
+
         login_window = gdm_greeter_login_window_new (TRUE);
         gtk_widget_show (login_window);
 

Modified: trunk/gui/simple-greeter/test-user-chooser.c
==============================================================================
--- trunk/gui/simple-greeter/test-user-chooser.c	(original)
+++ trunk/gui/simple-greeter/test-user-chooser.c	Wed Feb 20 18:41:49 2008
@@ -47,6 +47,8 @@
 
         dialog = gdm_user_chooser_dialog_new ();
         /*gtk_widget_set_size_request (dialog, 480, 128);*/
+        gdm_user_chooser_dialog_set_show_guest_user (GDM_USER_CHOOSER_DIALOG (dialog), TRUE);
+        gdm_user_chooser_dialog_set_show_auto_user (GDM_USER_CHOOSER_DIALOG (dialog), TRUE);
 
         if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_OK) {
                 char *name;



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