diff options
Diffstat (limited to 'gui/simple-greeter/gdm-chooser-widget.c')
-rw-r--r-- | gui/simple-greeter/gdm-chooser-widget.c | 65 |
1 files changed, 65 insertions, 0 deletions
diff --git a/gui/simple-greeter/gdm-chooser-widget.c b/gui/simple-greeter/gdm-chooser-widget.c index 6d961d3f..c28d4b38 100644 --- a/gui/simple-greeter/gdm-chooser-widget.c +++ b/gui/simple-greeter/gdm-chooser-widget.c @@ -28,6 +28,7 @@ #include <errno.h> #include <dirent.h> #include <sys/stat.h> +#include <syslog.h> #include <glib.h> #include <glib/gi18n.h> @@ -86,10 +87,12 @@ struct GdmChooserWidgetPrivate guint update_idle_id; guint timer_animation_timeout_id; + guint activate_idle_id; guint32 should_hide_inactive_items : 1; guint32 emit_activated_after_resize_animation : 1; guint32 was_fully_grown : 1; + guint32 activate_on_one_item : 1; GdmChooserWidgetPosition separator_position; GdmChooserWidgetState state; @@ -539,6 +542,42 @@ start_shrink_animation (GdmChooserWidget *widget) on_shrink_animation_complete, widget); } +static char * +get_first_item (GdmChooserWidget *widget) +{ + GtkTreeModel *model; + GtkTreeIter iter; + char *id; + + model = GTK_TREE_MODEL (widget->priv->list_store); + + if (!gtk_tree_model_get_iter_first (model, &iter)) { + g_assert_not_reached (); + } + + gtk_tree_model_get (model, &iter, + CHOOSER_ID_COLUMN, &id, -1); + return id; +} + +static gboolean +activate_if_one_item (GdmChooserWidget *widget) +{ + char *id; + + widget->priv->activate_idle_id = 0; + + if (gdm_chooser_widget_get_number_of_items (widget) != 1) { + return FALSE; + } + + id = get_first_item (widget); + gdm_chooser_widget_set_active_item (widget, id); + g_free (id); + + return FALSE; +} + static void on_grow_animation_complete (GdmScrollableWidget *scrollable_widget, GdmChooserWidget *widget) @@ -1808,6 +1847,10 @@ gdm_chooser_widget_add_item (GdmChooserWidget *widget, -1); move_cursor_to_top (widget); + + if (widget->priv->activate_on_one_item) { + activate_if_one_item (widget); + } } void @@ -1856,6 +1899,10 @@ gdm_chooser_widget_remove_item (GdmChooserWidget *widget, gtk_list_store_remove (widget->priv->list_store, &iter); move_cursor_to_top (widget); + + if (widget->priv->activate_on_one_item) { + activate_if_one_item (widget); + } } gboolean @@ -2214,3 +2261,21 @@ gdm_chooser_widget_set_hide_inactive_items (GdmChooserWidget *widget, gdm_chooser_widget_grow (widget); } } + +int +gdm_chooser_widget_get_number_of_items (GdmChooserWidget *widget) +{ + return widget->priv->number_of_normal_rows + + widget->priv->number_of_separated_rows; +} + +void +gdm_chooser_widget_activate_on_one_item (GdmChooserWidget *widget, + gboolean should_activate) +{ + widget->priv->activate_on_one_item = should_activate; + + if (widget->priv->activate_on_one_item) { + activate_if_one_item (widget); + } +} |