399 lines
16 KiB
Diff
399 lines
16 KiB
Diff
Index: gui/simple-greeter/gdm-user-chooser-widget.c
|
|
===================================================================
|
|
--- gui/simple-greeter/gdm-user-chooser-widget.c (révision 6670)
|
|
+++ gui/simple-greeter/gdm-user-chooser-widget.c (copie de travail)
|
|
@@ -67,6 +67,8 @@ struct GdmUserChooserWidgetPrivate
|
|
guint show_user_auto : 1;
|
|
guint show_normal_users : 1;
|
|
|
|
+ guint real_show_user_other : 1;
|
|
+
|
|
guint load_idle_id;
|
|
};
|
|
|
|
@@ -83,6 +85,9 @@ static void gdm_user_chooser_widget_
|
|
|
|
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 @@ get_icon_height_for_widget (GtkWidget *w
|
|
}
|
|
|
|
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,
|
|
@@ -146,6 +174,7 @@ add_user_guest (GdmUserChooserWidget *wi
|
|
0,
|
|
FALSE,
|
|
TRUE);
|
|
+ update_other_user_visibility (widget);
|
|
}
|
|
|
|
static void
|
|
@@ -159,11 +188,13 @@ add_user_auto (GdmUserChooserWidget *wid
|
|
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);
|
|
}
|
|
@@ -173,6 +204,7 @@ remove_user_guest (GdmUserChooserWidget
|
|
{
|
|
gdm_chooser_widget_remove_item (GDM_CHOOSER_WIDGET (widget),
|
|
GDM_USER_CHOOSER_USER_GUEST);
|
|
+ update_other_user_visibility (widget);
|
|
}
|
|
|
|
static void
|
|
@@ -180,6 +212,7 @@ remove_user_auto (GdmUserChooserWidget *
|
|
{
|
|
gdm_chooser_widget_remove_item (GDM_CHOOSER_WIDGET (widget),
|
|
GDM_USER_CHOOSER_USER_AUTO);
|
|
+ update_other_user_visibility (widget);
|
|
}
|
|
|
|
void
|
|
@@ -190,11 +223,7 @@ gdm_user_chooser_widget_set_show_user_ot
|
|
|
|
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);
|
|
}
|
|
}
|
|
|
|
@@ -369,6 +398,8 @@ add_user (GdmUserChooserWidget *widget,
|
|
if (pixbuf != NULL) {
|
|
g_object_unref (pixbuf);
|
|
}
|
|
+
|
|
+ update_other_user_visibility (widget);
|
|
}
|
|
|
|
static void
|
|
@@ -400,6 +431,8 @@ on_user_removed (GdmUserManager *m
|
|
|
|
gdm_chooser_widget_remove_item (GDM_CHOOSER_WIDGET (widget),
|
|
user_name);
|
|
+
|
|
+ update_other_user_visibility (widget);
|
|
}
|
|
|
|
static void
|
|
@@ -444,8 +477,6 @@ on_users_loaded (GdmUserManager *m
|
|
{
|
|
GSList *users;
|
|
|
|
- widget->priv->loaded = TRUE;
|
|
-
|
|
g_debug ("GdmUserChooserWidget: Users loaded");
|
|
|
|
users = gdm_user_manager_list_users (manager);
|
|
@@ -454,7 +485,7 @@ on_users_loaded (GdmUserManager *m
|
|
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));
|
|
}
|
|
@@ -505,6 +536,7 @@ gdm_user_chooser_widget_constructor (GTy
|
|
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);
|
|
Index: gui/simple-greeter/gdm-greeter-login-window.c
|
|
===================================================================
|
|
--- gui/simple-greeter/gdm-greeter-login-window.c (révision 6670)
|
|
+++ gui/simple-greeter/gdm-greeter-login-window.c (copie de travail)
|
|
@@ -114,6 +114,7 @@ struct GdmGreeterLoginWindowPrivate
|
|
GtkWidget *auth_banner_label;
|
|
guint display_is_local : 1;
|
|
guint is_interactive : 1;
|
|
+ guint user_chooser_loaded : 1;
|
|
GConfClient *client;
|
|
|
|
gboolean banner_message_enabled;
|
|
@@ -528,9 +529,13 @@ switch_mode (GdmGreeterLoginWindow *logi
|
|
GtkWidget *box;
|
|
gboolean show_restart_buttons;
|
|
gboolean show_suspend_button;
|
|
+ gboolean only_other_user;
|
|
+ gboolean show_buttons;
|
|
|
|
- show_restart_buttons = get_show_restart_buttons (login_window);
|
|
- show_suspend_button = can_suspend (login_window);
|
|
+ only_other_user = (gdm_chooser_widget_get_number_of_items (GDM_CHOOSER_WIDGET (login_window->priv->user_chooser)) == 0);
|
|
+ show_buttons = (number == MODE_SELECTION) || only_other_user;
|
|
+ show_restart_buttons = show_buttons && get_show_restart_buttons (login_window);
|
|
+ show_suspend_button = show_buttons && can_suspend (login_window);
|
|
|
|
/* we want to run this even if we're supposed to
|
|
be in the mode already so that we reset everything
|
|
@@ -539,7 +544,14 @@ switch_mode (GdmGreeterLoginWindow *logi
|
|
|
|
default_name = NULL;
|
|
|
|
- remove_sensitize_power_buttons_timeout (login_window);
|
|
+ show_widget (login_window, "shutdown-button",
|
|
+ login_window->priv->display_is_local && show_restart_buttons);
|
|
+ show_widget (login_window, "restart-button",
|
|
+ login_window->priv->display_is_local && show_restart_buttons);
|
|
+ show_widget (login_window, "suspend-button",
|
|
+ login_window->priv->display_is_local && show_restart_buttons && show_suspend_button);
|
|
+ show_widget (login_window, "disconnect-button",
|
|
+ !login_window->priv->display_is_local && show_buttons);
|
|
|
|
switch (number) {
|
|
case MODE_SELECTION:
|
|
@@ -547,15 +559,6 @@ switch_mode (GdmGreeterLoginWindow *logi
|
|
|
|
show_widget (login_window, "cancel-button", FALSE);
|
|
|
|
- show_widget (login_window, "shutdown-button",
|
|
- login_window->priv->display_is_local && show_restart_buttons);
|
|
- show_widget (login_window, "restart-button",
|
|
- login_window->priv->display_is_local && show_restart_buttons);
|
|
- show_widget (login_window, "suspend-button",
|
|
- login_window->priv->display_is_local && show_restart_buttons && show_suspend_button);
|
|
- show_widget (login_window, "disconnect-button",
|
|
- ! login_window->priv->display_is_local);
|
|
-
|
|
show_widget (login_window, "auth-input-box", FALSE);
|
|
|
|
add_sensitize_power_buttons_timeout (login_window);
|
|
@@ -568,10 +571,12 @@ switch_mode (GdmGreeterLoginWindow *logi
|
|
break;
|
|
case MODE_AUTHENTICATION:
|
|
show_widget (login_window, "cancel-button", TRUE);
|
|
- show_widget (login_window, "shutdown-button", FALSE);
|
|
- show_widget (login_window, "restart-button", FALSE);
|
|
- show_widget (login_window, "suspend-button", FALSE);
|
|
- show_widget (login_window, "disconnect-button", FALSE);
|
|
+
|
|
+ sensitize_widget (login_window, "shutdown-button", TRUE);
|
|
+ sensitize_widget (login_window, "restart-button", TRUE);
|
|
+ sensitize_widget (login_window, "suspend-button", TRUE);
|
|
+ sensitize_widget (login_window, "disconnect-button", TRUE);
|
|
+
|
|
default_name = "log-in-button";
|
|
break;
|
|
default:
|
|
@@ -665,10 +670,40 @@ delete_entry_text (GtkWidget *entry)
|
|
}
|
|
|
|
static void
|
|
+select_user (GdmGreeterLoginWindow *login_window,
|
|
+ const char *user_name)
|
|
+{
|
|
+ g_signal_emit (G_OBJECT (login_window), signals[USER_SELECTED],
|
|
+ 0, user_name);
|
|
+
|
|
+ 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) {
|
|
+ /* FIXME: handle guest account stuff */
|
|
+ } else if (strcmp (user_name, GDM_USER_CHOOSER_USER_AUTO) == 0) {
|
|
+ g_signal_emit (login_window, signals[BEGIN_AUTO_LOGIN], 0,
|
|
+ login_window->priv->timed_login_username);
|
|
+
|
|
+ login_window->priv->timed_login_enabled = TRUE;
|
|
+ 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);
|
|
+ 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);
|
|
+}
|
|
+
|
|
+
|
|
+static void
|
|
reset_dialog (GdmGreeterLoginWindow *login_window)
|
|
{
|
|
GtkWidget *entry;
|
|
GtkWidget *label;
|
|
+ gboolean use_selection;
|
|
|
|
g_debug ("GdmGreeterLoginWindow: Resetting dialog");
|
|
set_busy (login_window);
|
|
@@ -703,12 +738,21 @@ reset_dialog (GdmGreeterLoginWindow *log
|
|
label = glade_xml_get_widget (GDM_GREETER_LOGIN_WINDOW (login_window)->priv->xml, "auth-prompt-label");
|
|
gtk_label_set_text (GTK_LABEL (label), "");
|
|
|
|
- switch_mode (login_window, MODE_SELECTION);
|
|
+ use_selection = !login_window->priv->user_chooser_loaded || (gdm_chooser_widget_get_number_of_items (GDM_CHOOSER_WIDGET (login_window->priv->user_chooser)) >= 1);
|
|
+
|
|
+ if (use_selection) {
|
|
+ switch_mode (login_window, MODE_SELECTION);
|
|
+ } else {
|
|
+ select_user (login_window, GDM_USER_CHOOSER_USER_OTHER);
|
|
+ }
|
|
|
|
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));
|
|
+
|
|
+ if (use_selection) {
|
|
+ gdm_chooser_widget_propagate_pending_key_events (GDM_CHOOSER_WIDGET (login_window->priv->user_chooser));
|
|
+ }
|
|
}
|
|
|
|
static void
|
|
@@ -1323,7 +1367,19 @@ 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;
|
|
+
|
|
+ login_window->priv->user_chooser_loaded = TRUE;
|
|
+
|
|
+ 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 (user_chooser));
|
|
+ } else if (number_users == 0) {
|
|
+ select_user (login_window, GDM_USER_CHOOSER_USER_OTHER);
|
|
+ }
|
|
+
|
|
+ set_focus (GDM_GREETER_LOGIN_WINDOW (login_window));
|
|
}
|
|
|
|
static void
|
|
@@ -1339,28 +1395,7 @@ on_user_chosen (GdmUserChooserWidget *u
|
|
return;
|
|
}
|
|
|
|
- g_signal_emit (G_OBJECT (login_window), signals[USER_SELECTED],
|
|
- 0, user_name);
|
|
-
|
|
- 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) {
|
|
- /* FIXME: handle guest account stuff */
|
|
- } else if (strcmp (user_name, GDM_USER_CHOOSER_USER_AUTO) == 0) {
|
|
- g_signal_emit (login_window, signals[BEGIN_AUTO_LOGIN], 0,
|
|
- login_window->priv->timed_login_username);
|
|
-
|
|
- login_window->priv->timed_login_enabled = TRUE;
|
|
- 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);
|
|
- 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);
|
|
+ select_user (login_window, user_name);
|
|
|
|
g_free (user_name);
|
|
}
|
|
@@ -1914,6 +1949,7 @@ gdm_greeter_login_window_init (GdmGreete
|
|
|
|
login_window->priv = GDM_GREETER_LOGIN_WINDOW_GET_PRIVATE (login_window);
|
|
|
|
+ login_window->priv->user_chooser_loaded = FALSE;
|
|
login_window->priv->timed_login_enabled = FALSE;
|
|
|
|
login_window->priv->dialog_mode = MODE_SELECTION;
|
|
Index: gui/simple-greeter/gdm-chooser-widget.c
|
|
===================================================================
|
|
--- gui/simple-greeter/gdm-chooser-widget.c (révision 6670)
|
|
+++ gui/simple-greeter/gdm-chooser-widget.c (copie de travail)
|
|
@@ -593,6 +593,16 @@ update_separator_visibility (GdmChooserW
|
|
}
|
|
|
|
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);
|
|
+ }
|
|
+}
|
|
+
|
|
+static void
|
|
set_inactive_items_visible (GdmChooserWidget *widget,
|
|
gboolean should_show)
|
|
{
|
|
@@ -1771,7 +1781,6 @@ gdm_chooser_widget_init (GdmChooserWidge
|
|
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 +2064,8 @@ gdm_chooser_widget_add_item (GdmChooserW
|
|
-1);
|
|
|
|
move_cursor_to_top (widget);
|
|
+
|
|
+ update_chooser_visibility (widget);
|
|
}
|
|
|
|
void
|
|
@@ -2103,6 +2114,8 @@ gdm_chooser_widget_remove_item (GdmChoos
|
|
gtk_list_store_remove (widget->priv->list_store, &iter);
|
|
|
|
move_cursor_to_top (widget);
|
|
+
|
|
+ update_chooser_visibility (widget);
|
|
}
|
|
|
|
gboolean
|