From 126ba7d455a30f28451987db70565da3d1dab8ce Mon Sep 17 00:00:00 2001 From: Ray Strode Date: Mon, 21 Apr 2008 20:47:31 +0000 Subject: Add two new signals "users-loaded" and "loading-users" to signify when the 2008-04-21 Ray Strode * gui/simple-greeter/gdm-user-manager.[hc]: (reload_users_timeout), (queue_reload_users), (gdm_user_manager_class_init): Add two new signals "users-loaded" and "loading-users" to signify when the user manager is doing its initial run through of available users * gui/simple-greeter/gdm-user-chooser-widget.c: (on_users_loaded), (gdm_user_chooser_widget_init) * gui/simple-greeter/gdm-chooser-widget.c: (get_first_item), (activate_if_one_item), (gdm_chooser_widget_add_item), (gdm_chooser_widget_remove_item), (gdm_chooser_widget_get_number_of_items), (gdm_chooser_widget_activate_on_one_item): Activate the "Other..." user automatically if it's the only available user svn path=/trunk/; revision=6165 --- ChangeLog | 20 ++++++++- gui/simple-greeter/gdm-chooser-widget.c | 65 ++++++++++++++++++++++++++++ gui/simple-greeter/gdm-chooser-widget.h | 4 ++ gui/simple-greeter/gdm-user-chooser-widget.c | 12 +++++ gui/simple-greeter/gdm-user-manager.c | 21 +++++++++ gui/simple-greeter/gdm-user-manager.h | 2 + 6 files changed, 123 insertions(+), 1 deletion(-) diff --git a/ChangeLog b/ChangeLog index 490d7402..dfd713eb 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,4 +1,22 @@ -2008-04-18 Ray Strode +2008-04-21 Ray Strode + + * gui/simple-greeter/gdm-user-manager.[hc]: + (reload_users_timeout), (queue_reload_users), + (gdm_user_manager_class_init): Add two new signals + "users-loaded" and "loading-users" to signify when + the user manager is doing its initial run through + of available users + * gui/simple-greeter/gdm-user-chooser-widget.c: + (on_users_loaded), (gdm_user_chooser_widget_init) + * gui/simple-greeter/gdm-chooser-widget.c: + (get_first_item), (activate_if_one_item), + (gdm_chooser_widget_add_item), (gdm_chooser_widget_remove_item), + (gdm_chooser_widget_get_number_of_items), + (gdm_chooser_widget_activate_on_one_item): + Activate the "Other..." user automatically if it's the only + available user + +2008-04-18 Ray Strode * gui/simple-greeter/gdm-languages.c: (add_locale): 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 #include #include +#include #include #include @@ -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); + } +} diff --git a/gui/simple-greeter/gdm-chooser-widget.h b/gui/simple-greeter/gdm-chooser-widget.h index 25f1248a..301355d5 100644 --- a/gui/simple-greeter/gdm-chooser-widget.h +++ b/gui/simple-greeter/gdm-chooser-widget.h @@ -126,6 +126,10 @@ void gdm_chooser_widget_set_hide_inactive_items (GdmChooserWid void gdm_chooser_widget_activate_selected_item (GdmChooserWidget *widget); +int gdm_chooser_widget_get_number_of_items (GdmChooserWidget *widget); +void gdm_chooser_widget_activate_on_one_item (GdmChooserWidget *widget, + gboolean should_activate); + G_END_DECLS #endif /* __GDM_CHOOSER_WIDGET_H */ diff --git a/gui/simple-greeter/gdm-user-chooser-widget.c b/gui/simple-greeter/gdm-user-chooser-widget.c index f534c73c..e152ebb0 100644 --- a/gui/simple-greeter/gdm-user-chooser-widget.c +++ b/gui/simple-greeter/gdm-user-chooser-widget.c @@ -386,6 +386,14 @@ setup_icons (GdmUserChooserWidget *widget) load_icons (widget); } +static void +on_users_loaded (GdmUserManager *manager, + GdmUserChooserWidget *widget) +{ + gdm_chooser_widget_activate_on_one_item (GDM_CHOOSER_WIDGET (widget), + TRUE); +} + static void on_user_added (GdmUserManager *manager, GdmUser *user, @@ -487,6 +495,10 @@ gdm_user_chooser_widget_init (GdmUserChooserWidget *widget) _("Currently logged in")); widget->priv->manager = gdm_user_manager_ref_default (); + g_signal_connect (widget->priv->manager, + "users-loaded", + G_CALLBACK (on_users_loaded), + widget); g_signal_connect (widget->priv->manager, "user-added", G_CALLBACK (on_user_added), diff --git a/gui/simple-greeter/gdm-user-manager.c b/gui/simple-greeter/gdm-user-manager.c index 2afb5367..6863b7a5 100644 --- a/gui/simple-greeter/gdm-user-manager.c +++ b/gui/simple-greeter/gdm-user-manager.c @@ -117,6 +117,8 @@ struct GdmUserManagerPrivate }; enum { + LOADING_USERS, + USERS_LOADED, USER_ADDED, USER_REMOVED, USER_IS_LOGGED_IN_CHANGED, @@ -1375,6 +1377,8 @@ reload_users_timeout (GdmUserManager *manager) { reload_users (manager); manager->priv->reload_id = 0; + + g_signal_emit (G_OBJECT (manager), signals[USERS_LOADED], 0); return FALSE; } @@ -1385,6 +1389,7 @@ queue_reload_users (GdmUserManager *manager) return; } + g_signal_emit (G_OBJECT (manager), signals[LOADING_USERS], 0); manager->priv->reload_id = g_idle_add ((GSourceFunc)reload_users_timeout, manager); } @@ -1450,6 +1455,22 @@ gdm_user_manager_class_init (GdmUserManagerClass *klass) object_class->finalize = gdm_user_manager_finalize; + signals [LOADING_USERS] = + g_signal_new ("loading-users", + G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (GdmUserManagerClass, loading_users), + NULL, NULL, + g_cclosure_marshal_VOID__VOID, + G_TYPE_NONE, 0); + signals [USERS_LOADED] = + g_signal_new ("users-loaded", + G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (GdmUserManagerClass, users_loaded), + NULL, NULL, + g_cclosure_marshal_VOID__VOID, + G_TYPE_NONE, 0); signals [USER_ADDED] = g_signal_new ("user-added", G_TYPE_FROM_CLASS (klass), diff --git a/gui/simple-greeter/gdm-user-manager.h b/gui/simple-greeter/gdm-user-manager.h index c7ef769e..6c696e58 100644 --- a/gui/simple-greeter/gdm-user-manager.h +++ b/gui/simple-greeter/gdm-user-manager.h @@ -46,6 +46,8 @@ typedef struct { GObjectClass parent_class; + void (* loading_users) (GdmUserManager *user_manager); + void (* users_loaded) (GdmUserManager *user_manager); void (* user_added) (GdmUserManager *user_manager, GdmUser *user); void (* user_removed) (GdmUserManager *user_manager, -- cgit v1.2.1