diff -ur gdm-2.26.0.orig/gui/simple-greeter/gdm-chooser-widget.c gdm-2.26.0/gui/simple-greeter/gdm-chooser-widget.c
--- gdm-2.26.0.orig/gui/simple-greeter/gdm-chooser-widget.c	2009-02-19 21:45:09.000000000 -0500
+++ gdm-2.26.0/gui/simple-greeter/gdm-chooser-widget.c	2009-04-07 12:18:29.000000000 -0400
@@ -111,6 +111,7 @@
         ACTIVATED = 0,
         DEACTIVATED,
         LOADED,
+        VISIBILITYCHANGED,
         NUMBER_OF_SIGNALS
 };
 
@@ -593,6 +594,17 @@
 }
 
 static void
+update_chooser_visibility (GdmChooserWidget *widget)
+{
+        if (gdm_chooser_widget_get_number_of_items (widget) > 0) {
+                gtk_widget_show (widget->priv->scrollable_widget);
+        } else {
+                gtk_widget_hide (widget->priv->scrollable_widget);
+        }
+        g_signal_emit (widget, signals[VISIBILITYCHANGED], 0);
+}
+
+static void
 set_inactive_items_visible (GdmChooserWidget *widget,
                             gboolean          should_show)
 {
@@ -1280,6 +1292,16 @@
                                          G_TYPE_NONE,
                                          0);
 
+        signals [VISIBILITYCHANGED] = g_signal_new ("visibility-changed",
+                                         G_TYPE_FROM_CLASS (object_class),
+                                         G_SIGNAL_RUN_LAST,
+                                         0,
+                                         NULL,
+                                         NULL,
+                                         g_cclosure_marshal_VOID__VOID,
+                                         G_TYPE_NONE,
+                                         0);
+
         signals [ACTIVATED] = g_signal_new ("activated",
                                             G_TYPE_FROM_CLASS (object_class),
                                             G_SIGNAL_RUN_LAST,
@@ -1771,7 +1793,6 @@
         add_frame (widget);
 
         widget->priv->scrollable_widget = gdm_scrollable_widget_new ();
-        gtk_widget_show (widget->priv->scrollable_widget);
         gtk_container_add (GTK_CONTAINER (widget->priv->frame_alignment),
                            widget->priv->scrollable_widget);
 
@@ -2055,6 +2076,7 @@
                                            -1);
 
         move_cursor_to_top (widget);
+        update_chooser_visibility (widget);
 }
 
 void
@@ -2103,6 +2125,7 @@
         gtk_list_store_remove (widget->priv->list_store, &iter);
 
         move_cursor_to_top (widget);
+        update_chooser_visibility (widget);
 }
 
 gboolean
Only in gdm-2.26.0/gui/simple-greeter: gdm-chooser-widget.c.orig
diff -ur gdm-2.26.0.orig/gui/simple-greeter/gdm-greeter-login-window.c gdm-2.26.0/gui/simple-greeter/gdm-greeter-login-window.c
--- gdm-2.26.0.orig/gui/simple-greeter/gdm-greeter-login-window.c	2009-02-19 21:45:09.000000000 -0500
+++ gdm-2.26.0/gui/simple-greeter/gdm-greeter-login-window.c	2009-04-07 12:18:29.000000000 -0400
@@ -92,6 +92,7 @@
 #define KEY_GREETER_DIR             "/apps/gdm/simple-greeter"
 #define KEY_BANNER_MESSAGE_ENABLED  KEY_GREETER_DIR "/banner_message_enable"
 #define KEY_BANNER_MESSAGE_TEXT     KEY_GREETER_DIR "/banner_message_text"
+#define KEY_BANNER_MESSAGE_TEXT_NOCHOOSER     KEY_GREETER_DIR "/banner_message_text_nochooser"
 #define KEY_LOGO                    KEY_GREETER_DIR "/logo_icon_name"
 #define KEY_DISABLE_RESTART_BUTTONS KEY_GREETER_DIR "/disable_restart_buttons"
 #define GDM_GREETER_LOGIN_WINDOW_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), GDM_TYPE_GREETER_LOGIN_WINDOW, GdmGreeterLoginWindowPrivate))
@@ -103,6 +104,7 @@
 
 enum {
         LOGIN_BUTTON_HIDDEN = 0,
+        LOGIN_BUTTON_START_OTHER,
         LOGIN_BUTTON_ANSWER_QUERY,
         LOGIN_BUTTON_TIMED_LOGIN
 };
@@ -114,6 +116,7 @@
         GtkWidget       *auth_banner_label;
         guint            display_is_local : 1;
         guint            is_interactive : 1;
+        guint            user_chooser_loaded : 1;
         GConfClient     *client;
 
         gboolean         banner_message_enabled;
@@ -160,6 +163,12 @@
 static void     on_user_unchosen            (GdmUserChooserWidget *user_chooser,
                                              GdmGreeterLoginWindow *login_window);
 
+static void
+begin_verification (GdmGreeterLoginWindow *login_window);
+
+static void
+update_banner_message (GdmGreeterLoginWindow *login_window);
+
 G_DEFINE_TYPE (GdmGreeterLoginWindow, gdm_greeter_login_window, GTK_TYPE_WINDOW)
 
 static void
@@ -407,6 +416,16 @@
 
         _gdm_greeter_login_window_set_interactive (login_window, TRUE);
 }
+static void
+on_login_button_clicked_start_other (GtkButton             *button,
+                                     GdmGreeterLoginWindow *login_window)
+{
+        g_debug ("GdmGreeterLoginWindow: starting OTHER login");
+
+        g_signal_emit (G_OBJECT (login_window), signals[USER_SELECTED],
+                       0, GDM_USER_CHOOSER_USER_OTHER);
+        begin_verification (login_window);
+}
 
 static void
 set_log_in_button_mode (GdmGreeterLoginWindow *login_window,
@@ -427,6 +446,10 @@
         case LOGIN_BUTTON_HIDDEN:
                 gtk_widget_hide (button);
                 break;
+        case LOGIN_BUTTON_START_OTHER:
+                login_window->priv->login_button_handler_id = g_signal_connect (button, "clicked", G_CALLBACK (on_login_button_clicked_start_other), login_window);
+                gtk_widget_show (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);
@@ -441,6 +464,18 @@
         }
 }
 
+static void adjust_other_login_visibility(GdmGreeterLoginWindow *login_window) {
+	if (! login_window->priv->user_chooser_loaded)
+                return;
+        if (login_window->priv->dialog_mode != MODE_SELECTION)
+                return;
+
+        if (gdm_chooser_widget_get_number_of_items (GDM_CHOOSER_WIDGET (login_window->priv->user_chooser)) == 0)
+                set_log_in_button_mode(login_window, LOGIN_BUTTON_START_OTHER);
+        else
+                set_log_in_button_mode(login_window, LOGIN_BUTTON_HIDDEN);
+}
+
 static gboolean
 can_suspend (GdmGreeterLoginWindow *login_window)
 {
@@ -708,7 +743,10 @@
         set_sensitive (login_window, TRUE);
         set_ready (login_window);
         set_focus (GDM_GREETER_LOGIN_WINDOW (login_window));
-        gdm_chooser_widget_propagate_pending_key_events (GDM_CHOOSER_WIDGET (login_window->priv->user_chooser));
+        update_banner_message(login_window);
+        adjust_other_login_visibility(login_window);
+        if (gdm_chooser_widget_get_number_of_items (GDM_CHOOSER_WIDGET (login_window->priv->user_chooser)) >= 1)
+                gdm_chooser_widget_propagate_pending_key_events (GDM_CHOOSER_WIDGET (login_window->priv->user_chooser));
 }
 
 static void
@@ -1320,11 +1358,28 @@
 }
 
 static void
+on_user_chooser_visibility_changed (GdmUserChooserWidget  *user_chooser,
+                 GdmGreeterLoginWindow *login_window)
+{
+        update_banner_message(login_window);
+        adjust_other_login_visibility(login_window);
+}
+
+static void
 on_users_loaded (GdmUserChooserWidget  *user_chooser,
                  GdmGreeterLoginWindow *login_window)
 {
-        gdm_chooser_widget_activate_if_one_item (GDM_CHOOSER_WIDGET (login_window->priv->user_chooser));
+        int number_users;
+        g_debug ("GdmGreeterLoginWindow: users loaded");
+        login_window->priv->user_chooser_loaded = TRUE;
+        update_banner_message(login_window);
+        adjust_other_login_visibility(login_window);
+        number_users = gdm_chooser_widget_get_number_of_items (GDM_CHOOSER_WIDGET (user_chooser));
+        if (number_users == 1) {
+                gdm_chooser_widget_activate_if_one_item (GDM_CHOOSER_WIDGET (login_window->priv->user_chooser));
+        }
 }
+       
 
 static void
 on_user_chosen (GdmUserChooserWidget  *user_chooser,
@@ -1586,6 +1641,10 @@
                           G_CALLBACK (on_users_loaded),
                           login_window);
         g_signal_connect (login_window->priv->user_chooser,
+                          "visibility-changed",
+                          G_CALLBACK (on_user_chooser_visibility_changed),
+                          login_window);
+        g_signal_connect (login_window->priv->user_chooser,
                           "activated",
                           G_CALLBACK (on_user_chosen),
                           login_window);
@@ -1711,9 +1770,23 @@
                 g_debug ("GdmGreeterLoginWindow: banner message disabled");
                 gtk_widget_hide (login_window->priv->auth_banner_label);
         } else {
-                char *message;
+                char *message = NULL;
                 error = NULL;
-                message = gconf_client_get_string (login_window->priv->client, KEY_BANNER_MESSAGE_TEXT, &error);
+                if (login_window->priv->user_chooser_loaded && gdm_chooser_widget_get_number_of_items (GDM_CHOOSER_WIDGET (login_window->priv->user_chooser)) == 0) {
+                        message = gconf_client_get_string (login_window->priv->client, KEY_BANNER_MESSAGE_TEXT_NOCHOOSER, &error);
+                        if (error != NULL) {
+                                g_debug("GdmGreeterLoginWindow: unable to get nochooser banner text: %s", error->message);
+                                g_error_free(error);
+                        }
+                }
+                error = NULL;
+                if (message == NULL) {
+                        message = gconf_client_get_string (login_window->priv->client, KEY_BANNER_MESSAGE_TEXT, &error);
+                        if (error != NULL) {
+                                g_debug("GdmGreeterLoginWindow: unable to get banner text: %s", error->message);
+                                g_error_free(error);
+                        }
+                }
                 if (message != NULL) {
                         char *markup;
                         markup = g_markup_printf_escaped ("<small><i>%s</i></small>", message);
@@ -1885,7 +1958,7 @@
                         g_warning ("Error retrieving configuration key '%s': Invalid type",
                                    key);
                 }
-        } else if (strcmp (key, KEY_BANNER_MESSAGE_TEXT) == 0) {
+        } else if (strcmp (key, KEY_BANNER_MESSAGE_TEXT) == 0 || strcmp (key, KEY_BANNER_MESSAGE_TEXT_NOCHOOSER) == 0) {
                 if (login_window->priv->banner_message_enabled) {
                         update_banner_message (login_window);
                 }
Only in gdm-2.26.0/gui/simple-greeter: gdm-greeter-login-window.c.orig
diff -ur gdm-2.26.0.orig/gui/simple-greeter/gdm-greeter-session.c gdm-2.26.0/gui/simple-greeter/gdm-greeter-session.c
--- gdm-2.26.0.orig/gui/simple-greeter/gdm-greeter-session.c	2009-02-19 22:04:10.000000000 -0500
+++ gdm-2.26.0/gui/simple-greeter/gdm-greeter-session.c	2009-04-07 12:18:29.000000000 -0400
@@ -37,6 +37,9 @@
 #include "gdm-greeter-client.h"
 #include "gdm-greeter-panel.h"
 #include "gdm-greeter-login-window.h"
+#include "gdm-user-chooser-widget.h"
+#define KEY_SHOW_USER_OPTIONS_EARLY \
+	"/apps/gdm/simple-greeter/show_user_options_early"
 
 #include "gdm-profile.h"
 
@@ -102,11 +105,29 @@
 }
 
 static void
+show_or_hide_user_options(GdmGreeterSession *session, const char *username)
+{
+	GConfClient	*client;
+	gboolean 	result;
+
+	client = gconf_client_get_default ();
+        result = gconf_client_get_bool(client,KEY_SHOW_USER_OPTIONS_EARLY,NULL);
+	g_object_unref(client);
+
+	if (result || (username != NULL && strcmp(username, GDM_USER_CHOOSER_USER_OTHER) != 0))
+            gdm_greeter_panel_show_user_options (GDM_GREETER_PANEL (session->priv->panel));
+	else
+            gdm_greeter_panel_hide_user_options (GDM_GREETER_PANEL (session->priv->panel));
+		
+}
+
+static void
 on_selected_user_changed (GdmGreeterClient  *client,
                           const char        *text,
                           GdmGreeterSession *session)
 {
         g_debug ("GdmGreeterSession: selected user changed: %s", text);
+        show_or_hide_user_options(session, text);
 }
 
 static void
@@ -240,7 +261,7 @@
                 const char            *text,
                 GdmGreeterSession     *session)
 {
-        gdm_greeter_panel_show_user_options (GDM_GREETER_PANEL (session->priv->panel));
+        show_or_hide_user_options(session, text);
         gdm_greeter_client_call_select_user (session->priv->client,
                                              text);
 }
Only in gdm-2.26.0/gui/simple-greeter: gdm-greeter-session.c.orig
diff -ur gdm-2.26.0.orig/gui/simple-greeter/gdm-simple-greeter.schemas.in gdm-2.26.0/gui/simple-greeter/gdm-simple-greeter.schemas.in
--- gdm-2.26.0.orig/gui/simple-greeter/gdm-simple-greeter.schemas.in	2009-02-19 21:45:09.000000000 -0500
+++ gdm-2.26.0/gui/simple-greeter/gdm-simple-greeter.schemas.in	2009-04-07 12:18:30.000000000 -0400
@@ -1,5 +1,16 @@
 <gconfschemafile>
   <schemalist>
+    <schema>
+      <key>/schemas/apps/gdm/simple-greeter/show_user_options_early</key>
+      <applyto>/apps/gdm/simple-greeter/show_user_options_early</applyto>
+      <owner>gdm-simple-greeter</owner>
+      <type>bool</type>
+      <default>false</default>
+      <locale name="C">
+        <short>Show user options before username entered</short>
+        <long>If enabled, user options can be selected before username entry. Selections will be reread from saved values if username is altered during authentication, so this option is useful only on systems where the username is not known until authentication is complete.</long>
+      </locale>
+    </schema>
 
     <schema>
       <key>/schemas/apps/gdm/simple-greeter/debug</key>
@@ -35,6 +46,17 @@
       </locale>
     </schema>
     <schema>
+      <key>/schemas/apps/gdm/simple-greeter/banner_message_text_nochooser</key>
+      <applyto>/apps/gdm/simple-greeter/banner_message_text_nochooser</applyto>
+      <owner>gdm-simple-greeter</owner>
+      <type>string</type>
+      <default></default>
+      <locale name="C">
+        <short>Banner message text when chooser is empty</short>
+        <long>Text banner message to show on the login window when the user chooser is empty, instead of banner_message_text.</long>
+      </locale>
+    </schema>
+    <schema>
       <key>/schemas/apps/gdm/simple-greeter/logo_icon_name</key>
       <applyto>/apps/gdm/simple-greeter/logo_icon_name</applyto>
       <owner>gdm-simple-greeter</owner>
diff -ur gdm-2.26.0.orig/gui/simple-greeter/gdm-user-chooser-widget.c gdm-2.26.0/gui/simple-greeter/gdm-user-chooser-widget.c
--- gdm-2.26.0.orig/gui/simple-greeter/gdm-user-chooser-widget.c	2009-02-19 21:45:09.000000000 -0500
+++ gdm-2.26.0/gui/simple-greeter/gdm-user-chooser-widget.c	2009-04-07 12:18:30.000000000 -0400
@@ -67,6 +67,8 @@
         guint           show_user_auto : 1;
         guint           show_normal_users : 1;
 
+        guint           real_show_user_other : 1;
+
         guint           load_idle_id;
 };
 
@@ -83,6 +85,9 @@
 
 G_DEFINE_TYPE (GdmUserChooserWidget, gdm_user_chooser_widget, GDM_TYPE_CHOOSER_WIDGET)
 
+static void     add_user_other    (GdmUserChooserWidget *widget);
+static void     remove_user_other (GdmUserChooserWidget *widget);
+
 static int
 get_font_height_for_widget (GtkWidget *widget)
 {
@@ -123,8 +128,31 @@
 }
 
 static void
+update_other_user_visibility (GdmUserChooserWidget *widget)
+{
+        if (!widget->priv->show_user_other) {
+                if (widget->priv->real_show_user_other) {
+                        remove_user_other (widget);
+                }
+
+                return;
+        }
+
+        if (gdm_chooser_widget_get_number_of_items (GDM_CHOOSER_WIDGET (widget)) == 1) {
+                /* we hide the Other user if it's the last one, and we show it
+                 * if there's another user */
+                if (widget->priv->real_show_user_other) {
+                        remove_user_other (widget);
+                } else {
+                        add_user_other (widget);
+                }
+        }
+}
+
+static void
 add_user_other (GdmUserChooserWidget *widget)
 {
+        widget->priv->real_show_user_other = TRUE;
         gdm_chooser_widget_add_item (GDM_CHOOSER_WIDGET (widget),
                                      GDM_USER_CHOOSER_USER_OTHER,
                                      NULL,
@@ -151,6 +179,7 @@
                                      0,
                                      FALSE,
                                      TRUE);
+        update_other_user_visibility (widget);
 }
 
 static void
@@ -164,11 +193,13 @@
                                      0,
                                      FALSE,
                                      TRUE);
+        update_other_user_visibility (widget);
 }
 
 static void
 remove_user_other (GdmUserChooserWidget *widget)
 {
+        widget->priv->real_show_user_other = FALSE;
         gdm_chooser_widget_remove_item (GDM_CHOOSER_WIDGET (widget),
                                         GDM_USER_CHOOSER_USER_OTHER);
 }
@@ -178,6 +209,7 @@
 {
         gdm_chooser_widget_remove_item (GDM_CHOOSER_WIDGET (widget),
                                         GDM_USER_CHOOSER_USER_GUEST);
+        update_other_user_visibility (widget);
 }
 
 static void
@@ -185,6 +217,7 @@
 {
         gdm_chooser_widget_remove_item (GDM_CHOOSER_WIDGET (widget),
                                         GDM_USER_CHOOSER_USER_AUTO);
+        update_other_user_visibility (widget);
 }
 
 void
@@ -195,11 +228,7 @@
 
         if (widget->priv->show_user_other != show_user) {
                 widget->priv->show_user_other = show_user;
-                if (show_user) {
-                        add_user_other (widget);
-                } else {
-                        remove_user_other (widget);
-                }
+                update_other_user_visibility (widget);
         }
 }
 
@@ -374,6 +403,8 @@
         if (pixbuf != NULL) {
                 g_object_unref (pixbuf);
         }
+
+        update_other_user_visibility (widget);
 }
 
 static void
@@ -405,6 +436,8 @@
 
         gdm_chooser_widget_remove_item (GDM_CHOOSER_WIDGET (widget),
                                         user_name);
+
+        update_other_user_visibility (widget);
 }
 
 static void
@@ -449,8 +482,6 @@
 {
         GSList *users;
 
-        widget->priv->loaded = TRUE;
-
         g_debug ("GdmUserChooserWidget: Users loaded");
 
         users = gdm_user_manager_list_users (manager);
@@ -459,7 +490,7 @@
                 users = g_slist_delete_link (users, users);
         }
 
-        gtk_widget_grab_focus (GTK_WIDGET (widget));
+        widget->priv->loaded = TRUE;
 
         gdm_chooser_widget_loaded (GDM_CHOOSER_WIDGET (widget));
 }
@@ -510,6 +541,7 @@
                                                                                                               n_construct_properties,
                                                                                                               construct_properties));
 
+        widget->priv->real_show_user_other = FALSE;
         widget->priv->show_normal_users = !is_user_list_disabled (widget);
 
         widget->priv->load_idle_id = g_idle_add ((GSourceFunc)load_users, widget);
Only in gdm-2.26.0/gui/simple-greeter: gdm-user-chooser-widget.c.orig
