diff options
author | William Jon McCann <jmccann@redhat.com> | 2010-06-22 19:00:21 -0400 |
---|---|---|
committer | William Jon McCann <jmccann@redhat.com> | 2010-06-22 19:05:25 -0400 |
commit | 7e0720dfc8504c81015baf0b27c9c93ce9f0a702 (patch) | |
tree | 18259329e9b2163457d31b869ba73e6de5b859f6 | |
parent | 2b61c0c20e3f92ca61f248a1efccf8d22b7facba (diff) | |
download | gdm-7e0720dfc8504c81015baf0b27c9c93ce9f0a702.tar.gz |
Simplify the handling of dialog state
Should fix https://bugzilla.gnome.org/show_bug.cgi?id=622431
-rw-r--r-- | gui/simple-greeter/gdm-greeter-login-window.c | 132 |
1 files changed, 62 insertions, 70 deletions
diff --git a/gui/simple-greeter/gdm-greeter-login-window.c b/gui/simple-greeter/gdm-greeter-login-window.c index a64113e3..2b0215c9 100644 --- a/gui/simple-greeter/gdm-greeter-login-window.c +++ b/gui/simple-greeter/gdm-greeter-login-window.c @@ -86,8 +86,9 @@ enum { MODE_UNDEFINED = 0, + MODE_TIMED_LOGIN, MODE_SELECTION, - MODE_AUTHENTICATION + MODE_AUTHENTICATION, }; enum { @@ -109,10 +110,11 @@ struct GdmGreeterLoginWindowPrivate gboolean banner_message_enabled; guint gconf_cnxn; + guint last_mode; guint dialog_mode; gboolean user_list_disabled; - gboolean show_cancel_button; + guint num_queries; gboolean timed_login_already_enabled; gboolean timed_login_enabled; @@ -401,21 +403,42 @@ user_chooser_has_no_user (GdmGreeterLoginWindow *login_window) } static void -adjust_other_login_visibility (GdmGreeterLoginWindow *login_window) +maybe_show_cancel_button (GdmGreeterLoginWindow *login_window) { - if (! login_window->priv->user_chooser_loaded) { - return; - } + gboolean show; - if (login_window->priv->dialog_mode != MODE_SELECTION) { - return; - } + show = FALSE; - 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_ANSWER_QUERY); - } else { - set_log_in_button_mode (login_window, LOGIN_BUTTON_HIDDEN); + /* only show the cancel button if there is something to go + back to */ + + switch (login_window->priv->dialog_mode) { + case MODE_SELECTION: + /* should never have anything to return to from here */ + show = FALSE; + break; + case MODE_TIMED_LOGIN: + /* should always have something to return to from here */ + show = TRUE; + break; + case MODE_AUTHENTICATION: + if (login_window->priv->num_queries > 1) { + /* if we are inside a pam conversation past + the first step */ + show = TRUE; + } else { + if (login_window->priv->user_list_disabled || user_chooser_has_no_user (login_window)) { + show = FALSE; + } else { + show = TRUE; + } + } + break; + default: + g_assert_not_reached (); } + + show_widget (login_window, "cancel-button", show); } static void @@ -431,48 +454,29 @@ switch_mode (GdmGreeterLoginWindow *login_window, /* we want to run this even if we're supposed to be in the mode already so that we reset everything to a known state */ - login_window->priv->dialog_mode = number; + if (login_window->priv->dialog_mode != number) { + login_window->priv->last_mode = login_window->priv->dialog_mode; + login_window->priv->dialog_mode = number; + } default_name = NULL; switch (number) { case MODE_SELECTION: set_log_in_button_mode (login_window, LOGIN_BUTTON_HIDDEN); - - show_widget (login_window, "cancel-button", FALSE); - - show_widget (login_window, "auth-input-box", FALSE); - - /* - * Although the cancel button is not shown in the selection - * dialog, the show_cancel_button flag manages when the - * cancel button is shown on subsequent PAM queries. Set the - * flag to true initially since the button should appear on - * the first query, since the button takes the user back to - * selection mode. - */ - login_window->priv->show_cancel_button = TRUE; + break; + case MODE_TIMED_LOGIN: + set_log_in_button_mode (login_window, LOGIN_BUTTON_TIMED_LOGIN); break; case MODE_AUTHENTICATION: - default_name = "log-in-button"; + set_log_in_button_mode (login_window, LOGIN_BUTTON_ANSWER_QUERY); break; default: g_assert_not_reached (); } - box = GTK_WIDGET (gtk_builder_get_object (login_window->priv->builder, - "buttonbox")); - gtk_button_box_set_layout (GTK_BUTTON_BOX (box), - (number == MODE_SELECTION) ? - GTK_BUTTONBOX_SPREAD : - GTK_BUTTONBOX_END ); - - if (default_name != NULL) { - GtkWidget *widget; - - widget = GTK_WIDGET (gtk_builder_get_object (login_window->priv->builder, default_name)); - gtk_widget_grab_default (widget); - } + show_widget (login_window, "auth-input-box", FALSE); + maybe_show_cancel_button (login_window); /* * The rest of this function sets up the user list, so just return if @@ -520,12 +524,13 @@ reset_dialog (GdmGreeterLoginWindow *login_window) { GtkWidget *entry; GtkWidget *label; + guint mode; g_debug ("GdmGreeterLoginWindow: Resetting dialog"); set_busy (login_window); set_sensitive (login_window, FALSE); - login_window->priv->show_cancel_button = FALSE; + login_window->priv->num_queries = 0; if (login_window->priv->timed_login_enabled) { gdm_chooser_widget_set_item_timer (GDM_CHOOSER_WIDGET (login_window->priv->user_chooser), @@ -556,17 +561,18 @@ reset_dialog (GdmGreeterLoginWindow *login_window) label = GTK_WIDGET (gtk_builder_get_object (GDM_GREETER_LOGIN_WINDOW (login_window)->priv->builder, "auth-prompt-label")); gtk_label_set_text (GTK_LABEL (label), ""); + mode = MODE_SELECTION; if (login_window->priv->user_list_disabled || user_chooser_has_no_user (login_window)) { - switch_mode (login_window, MODE_AUTHENTICATION); - } else { - switch_mode (login_window, MODE_SELECTION); + /* If we don't have a user list jump straight to authenticate */ + mode = MODE_AUTHENTICATION; } + switch_mode (login_window, mode); set_sensitive (login_window, TRUE); set_ready (login_window); set_focus (GDM_GREETER_LOGIN_WINDOW (login_window)); 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)); } @@ -730,21 +736,6 @@ gdm_greeter_login_window_start_session_when_ready (GdmGreeterLoginWindow *login_ } } -static void -_show_cancel_button (GdmGreeterLoginWindow *login_window) -{ - /* - * If show_cancel_button is false, this is because the face browser - * is disabled and the first query is showing. It does not make sense - * to display the cancel button when showing the initial query and - * the face browser is disabled. Set the flag to true so that the - * button is shown on following queries. - */ - show_widget (login_window, "cancel-button", - login_window->priv->show_cancel_button); - login_window->priv->show_cancel_button = TRUE; -} - gboolean gdm_greeter_login_window_info_query (GdmGreeterLoginWindow *login_window, const char *text) @@ -754,7 +745,8 @@ gdm_greeter_login_window_info_query (GdmGreeterLoginWindow *login_window, g_return_val_if_fail (GDM_IS_GREETER_LOGIN_WINDOW (login_window), FALSE); - _show_cancel_button (login_window); + login_window->priv->num_queries++; + maybe_show_cancel_button (login_window); g_debug ("GdmGreeterLoginWindow: info query: %s", text); @@ -785,7 +777,8 @@ gdm_greeter_login_window_secret_info_query (GdmGreeterLoginWindow *login_window, g_return_val_if_fail (GDM_IS_GREETER_LOGIN_WINDOW (login_window), FALSE); - _show_cancel_button (login_window); + login_window->priv->num_queries++; + maybe_show_cancel_button (login_window); entry = GTK_WIDGET (gtk_builder_get_object (GDM_GREETER_LOGIN_WINDOW (login_window)->priv->builder, "auth-prompt-entry")); delete_entry_text (entry); @@ -881,7 +874,6 @@ on_user_chooser_visibility_changed (GdmGreeterLoginWindow *login_window) { g_debug ("GdmGreeterLoginWindow: Chooser visibility changed"); update_banner_message (login_window); - adjust_other_login_visibility (login_window); } static void @@ -891,11 +883,9 @@ on_users_loaded (GdmUserChooserWidget *user_chooser, g_debug ("GdmGreeterLoginWindow: users loaded"); login_window->priv->user_chooser_loaded = TRUE; update_banner_message (login_window); - adjust_other_login_visibility (login_window); if (user_chooser_has_no_user (login_window)) { - /* There's no face browser to show */ - login_window->priv->show_cancel_button = FALSE; + /* jump straight to authenticate */ switch_mode (login_window, MODE_AUTHENTICATION); g_debug ("Starting PAM conversation since no local users"); @@ -910,6 +900,7 @@ on_user_chosen (GdmUserChooserWidget *user_chooser, GdmGreeterLoginWindow *login_window) { char *user_name; + guint mode; user_name = gdm_user_chooser_widget_get_chosen_user_name (GDM_USER_CHOOSER_WIDGET (login_window->priv->user_chooser)); g_debug ("GdmGreeterLoginWindow: user chosen '%s'", user_name); @@ -921,6 +912,7 @@ on_user_chosen (GdmUserChooserWidget *user_chooser, g_signal_emit (G_OBJECT (login_window), signals[USER_SELECTED], 0, user_name); + mode = MODE_AUTHENTICATION; if (strcmp (user_name, GDM_USER_CHOOSER_USER_OTHER) == 0) { g_signal_emit (login_window, signals[BEGIN_VERIFICATION], 0); } else if (strcmp (user_name, GDM_USER_CHOOSER_USER_GUEST) == 0) { @@ -933,13 +925,13 @@ on_user_chosen (GdmUserChooserWidget *user_chooser, restart_timed_login_timeout (login_window); /* just wait for the user to select language and stuff */ - set_log_in_button_mode (login_window, LOGIN_BUTTON_TIMED_LOGIN); + mode = MODE_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); } - switch_mode (login_window, MODE_AUTHENTICATION); + switch_mode (login_window, mode); g_free (user_name); } |