[gdm] Only load icons for visible items
- From: William Jon McCann <mccann src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gdm] Only load icons for visible items
- Date: Fri, 11 Jun 2010 00:19:50 +0000 (UTC)
commit 373eb671d5085bb9941c08e33655ebadd822dcc1
Author: William Jon McCann <jmccann redhat com>
Date: Tue Jun 8 19:01:42 2010 -0400
Only load icons for visible items
https://bugzilla.gnome.org/show_bug.cgi?id=621045
gui/simple-greeter/gdm-chooser-widget.c | 66 ++++++++++++-
gui/simple-greeter/gdm-chooser-widget.h | 8 ++-
gui/simple-greeter/gdm-language-chooser-widget.c | 4 +-
gui/simple-greeter/gdm-layout-chooser-widget.c | 4 +-
gui/simple-greeter/gdm-user-chooser-widget.c | 117 +++++++++++++---------
5 files changed, 147 insertions(+), 52 deletions(-)
---
diff --git a/gui/simple-greeter/gdm-chooser-widget.c b/gui/simple-greeter/gdm-chooser-widget.c
index 64e613e..36f2603 100644
--- a/gui/simple-greeter/gdm-chooser-widget.c
+++ b/gui/simple-greeter/gdm-chooser-widget.c
@@ -139,6 +139,8 @@ enum {
CHOOSER_TIMER_DURATION_COLUMN,
CHOOSER_TIMER_VALUE_COLUMN,
CHOOSER_ID_COLUMN,
+ CHOOSER_LOAD_FUNC_COLUMN,
+ CHOOSER_LOAD_DATA_COLUMN,
NUMBER_OF_CHOOSER_COLUMNS
};
@@ -598,9 +600,49 @@ update_separator_visibility (GdmChooserWidget *widget)
-1);
}
+static void
+update_visible_items (GdmChooserWidget *widget)
+{
+ GtkTreePath *path;
+ GtkTreePath *end;
+ GtkTreeIter iter;
+
+ if (! gtk_tree_view_get_visible_range (GTK_TREE_VIEW (widget->priv->items_view), &path, &end)) {
+ g_debug ("Unable to get visible range");
+ return;
+ }
+
+ for (; gtk_tree_path_compare (path, end) <= 0; gtk_tree_path_next (path)) {
+ char *id;
+ gpointer user_data;
+ GdmChooserWidgetItemLoadFunc func;
+
+ if (! gtk_tree_model_get_iter (GTK_TREE_MODEL (widget->priv->model_sorter), &iter, path))
+ break;
+
+ id = NULL;
+ gtk_tree_model_get (GTK_TREE_MODEL (widget->priv->model_sorter),
+ &iter,
+ CHOOSER_ID_COLUMN, &id,
+ CHOOSER_LOAD_FUNC_COLUMN, &func,
+ CHOOSER_LOAD_DATA_COLUMN, &user_data,
+ -1);
+ if (id != NULL && func != NULL) {
+ func (widget, id, user_data);
+ }
+
+ g_free (id);
+ }
+
+ gtk_tree_path_free (path);
+ gtk_tree_path_free (end);
+}
+
static gboolean
update_chooser_visibility (GdmChooserWidget *widget)
{
+ update_visible_items (widget);
+
if (gdm_chooser_widget_get_number_of_items (widget) > 0) {
gtk_widget_show (widget->priv->frame);
} else {
@@ -1792,11 +1834,20 @@ on_selection_changed (GtkTreeSelection *selection,
}
static void
+on_adjustment_value_changed (GtkAdjustment *adjustment,
+ GdmChooserWidget *widget)
+{
+ g_debug ("Treeview scrolled");
+ update_visible_items (widget);
+}
+
+static void
gdm_chooser_widget_init (GdmChooserWidget *widget)
{
GtkTreeViewColumn *column;
GtkTreeSelection *selection;
GtkCellRenderer *renderer;
+ GtkAdjustment *adjustment;
widget->priv = GDM_CHOOSER_WIDGET_GET_PRIVATE (widget);
@@ -1850,7 +1901,7 @@ gdm_chooser_widget_init (GdmChooserWidget *widget)
g_signal_connect (selection, "changed", G_CALLBACK (on_selection_changed), widget);
- g_assert (NUMBER_OF_CHOOSER_COLUMNS == 11);
+ g_assert (NUMBER_OF_CHOOSER_COLUMNS == 13);
widget->priv->list_store = gtk_list_store_new (NUMBER_OF_CHOOSER_COLUMNS,
GDK_TYPE_PIXBUF,
G_TYPE_STRING,
@@ -1862,7 +1913,9 @@ gdm_chooser_widget_init (GdmChooserWidget *widget)
G_TYPE_DOUBLE,
G_TYPE_DOUBLE,
G_TYPE_DOUBLE,
- G_TYPE_STRING);
+ G_TYPE_STRING,
+ G_TYPE_POINTER,
+ G_TYPE_POINTER);
widget->priv->model_filter = GTK_TREE_MODEL_FILTER (gtk_tree_model_filter_new (GTK_TREE_MODEL (widget->priv->list_store), NULL));
@@ -1945,6 +1998,9 @@ gdm_chooser_widget_init (GdmChooserWidget *widget)
add_separator (widget);
queue_column_visibility_update (widget);
+
+ adjustment = gtk_tree_view_get_vadjustment (GTK_TREE_VIEW (widget->priv->items_view));
+ g_signal_connect (adjustment, "value-changed", G_CALLBACK (on_adjustment_value_changed), widget);
}
static void
@@ -2079,7 +2135,9 @@ gdm_chooser_widget_add_item (GdmChooserWidget *widget,
const char *comment,
gulong priority,
gboolean in_use,
- gboolean keep_separate)
+ gboolean keep_separate,
+ GdmChooserWidgetItemLoadFunc load_func,
+ gpointer load_data)
{
gboolean is_visible;
@@ -2114,6 +2172,8 @@ gdm_chooser_widget_add_item (GdmChooserWidget *widget,
CHOOSER_ITEM_IS_SEPARATED_COLUMN, keep_separate,
CHOOSER_ITEM_IS_VISIBLE_COLUMN, is_visible,
CHOOSER_ID_COLUMN, id,
+ CHOOSER_LOAD_FUNC_COLUMN, load_func,
+ CHOOSER_LOAD_DATA_COLUMN, load_data,
-1);
queue_move_cursor_to_top (widget);
diff --git a/gui/simple-greeter/gdm-chooser-widget.h b/gui/simple-greeter/gdm-chooser-widget.h
index 7e3e59c..11a6456 100644
--- a/gui/simple-greeter/gdm-chooser-widget.h
+++ b/gui/simple-greeter/gdm-chooser-widget.h
@@ -57,6 +57,10 @@ typedef enum {
GDM_CHOOSER_WIDGET_POSITION_BOTTOM,
} GdmChooserWidgetPosition;
+typedef void (*GdmChooserWidgetItemLoadFunc) (GdmChooserWidget *widget,
+ const char *id,
+ gpointer data);
+
typedef gboolean (*GdmChooserUpdateForeachFunc) (GdmChooserWidget *widget,
const char *id,
GdkPixbuf **image,
@@ -78,7 +82,9 @@ void gdm_chooser_widget_add_item (GdmChooserWidget *
const char *comment,
gulong priority,
gboolean is_in_use,
- gboolean keep_separate);
+ gboolean keep_separate,
+ GdmChooserWidgetItemLoadFunc load_func,
+ gpointer load_data);
void gdm_chooser_widget_update_foreach_item (GdmChooserWidget *widget,
GdmChooserUpdateForeachFunc cb,
diff --git a/gui/simple-greeter/gdm-language-chooser-widget.c b/gui/simple-greeter/gdm-language-chooser-widget.c
index 7594cf7..305044a 100644
--- a/gui/simple-greeter/gdm-language-chooser-widget.c
+++ b/gui/simple-greeter/gdm-language-chooser-widget.c
@@ -121,7 +121,9 @@ gdm_language_chooser_widget_add_language (GdmLanguageChooserWidget *widget,
readable_language,
0,
FALSE,
- FALSE);
+ FALSE,
+ NULL,
+ NULL);
g_free (language);
}
g_free (readable_language);
diff --git a/gui/simple-greeter/gdm-layout-chooser-widget.c b/gui/simple-greeter/gdm-layout-chooser-widget.c
index f3d66a4..9d85eb1 100644
--- a/gui/simple-greeter/gdm-layout-chooser-widget.c
+++ b/gui/simple-greeter/gdm-layout-chooser-widget.c
@@ -108,7 +108,9 @@ gdm_layout_chooser_widget_add_layout (GdmLayoutChooserWidget *widget,
NULL,
0,
FALSE,
- FALSE);
+ FALSE,
+ NULL,
+ NULL);
g_free (escaped);
g_free (layout);
}
diff --git a/gui/simple-greeter/gdm-user-chooser-widget.c b/gui/simple-greeter/gdm-user-chooser-widget.c
index fe7e618..f962473 100644
--- a/gui/simple-greeter/gdm-user-chooser-widget.c
+++ b/gui/simple-greeter/gdm-user-chooser-widget.c
@@ -168,6 +168,63 @@ queue_update_other_user_visibility (GdmUserChooserWidget *widget)
}
static void
+update_item_for_user (GdmUserChooserWidget *widget,
+ GdmUser *user)
+{
+ GdkPixbuf *pixbuf;
+ char *tooltip;
+ gboolean is_logged_in;
+ int size;
+
+
+ size = get_icon_height_for_widget (GTK_WIDGET (widget));
+ pixbuf = gdm_user_render_icon (user, size);
+
+ if (pixbuf == NULL && widget->priv->stock_person_pixbuf != NULL) {
+ pixbuf = g_object_ref (widget->priv->stock_person_pixbuf);
+ }
+
+ tooltip = g_strdup_printf (_("Log in as %s"),
+ gdm_user_get_user_name (user));
+
+ is_logged_in = gdm_user_is_logged_in (user);
+
+ g_debug ("GdmUserChooserWidget: User added name:%s logged-in:%d pixbuf:%p",
+ gdm_user_get_user_name (user),
+ is_logged_in,
+ pixbuf);
+
+ gdm_chooser_widget_update_item (GDM_CHOOSER_WIDGET (widget),
+ gdm_user_get_user_name (user),
+ pixbuf,
+ gdm_user_get_real_name (user),
+ tooltip,
+ gdm_user_get_login_frequency (user),
+ is_logged_in,
+ FALSE);
+ g_free (tooltip);
+
+ if (pixbuf != NULL) {
+ g_object_unref (pixbuf);
+ }
+}
+
+static void
+on_item_load (GdmChooserWidget *widget,
+ const char *id,
+ GdmUserChooserWidget *user_chooser)
+{
+ GdmUser *user;
+
+ g_debug ("GdmUserChooserWidget: Loading item for id=%s", id);
+
+ user = gdm_user_manager_get_user (user_chooser->priv->manager, id);
+ if (user != NULL) {
+ update_item_for_user (user_chooser, user);
+ }
+}
+
+static void
add_user_other (GdmUserChooserWidget *widget)
{
widget->priv->has_user_other = TRUE;
@@ -183,7 +240,9 @@ add_user_other (GdmUserChooserWidget *widget)
_("Choose a different account"),
0,
FALSE,
- TRUE);
+ TRUE,
+ (GdmChooserWidgetItemLoadFunc) on_item_load,
+ widget);
}
static void
@@ -196,7 +255,9 @@ add_user_guest (GdmUserChooserWidget *widget)
_("Log in as a temporary guest"),
0,
FALSE,
- TRUE);
+ TRUE,
+ (GdmChooserWidgetItemLoadFunc) on_item_load,
+ widget);
queue_update_other_user_visibility (widget);
}
@@ -210,7 +271,9 @@ add_user_auto (GdmUserChooserWidget *widget)
_("Automatically log into the system after selecting options"),
0,
FALSE,
- TRUE);
+ TRUE,
+ (GdmChooserWidgetItemLoadFunc) on_item_load,
+ widget);
queue_update_other_user_visibility (widget);
}
@@ -386,18 +449,12 @@ add_user (GdmUserChooserWidget *widget,
GdkPixbuf *pixbuf;
char *tooltip;
gboolean is_logged_in;
- int size;
if (!widget->priv->show_normal_users) {
return;
}
- size = get_icon_height_for_widget (GTK_WIDGET (widget));
- pixbuf = gdm_user_render_icon (user, size);
- if (pixbuf == NULL && widget->priv->stock_person_pixbuf != NULL) {
- pixbuf = g_object_ref (widget->priv->stock_person_pixbuf);
- }
-
+ pixbuf = NULL;
tooltip = g_strdup_printf (_("Log in as %s"),
gdm_user_get_user_name (user));
@@ -415,7 +472,9 @@ add_user (GdmUserChooserWidget *widget,
tooltip,
gdm_user_get_login_frequency (user),
is_logged_in,
- FALSE);
+ FALSE,
+ (GdmChooserWidgetItemLoadFunc) on_item_load,
+ widget);
g_free (tooltip);
if (pixbuf != NULL) {
@@ -481,11 +540,6 @@ on_user_changed (GdmUserManager *manager,
GdmUser *user,
GdmUserChooserWidget *widget)
{
- GdkPixbuf *pixbuf;
- char *tooltip;
- gboolean is_logged_in;
- int size;
-
/* wait for all users to be loaded */
if (! widget->priv->loaded) {
return;
@@ -494,36 +548,7 @@ on_user_changed (GdmUserManager *manager,
return;
}
- size = get_icon_height_for_widget (GTK_WIDGET (widget));
- pixbuf = gdm_user_render_icon (user, size);
-
- if (pixbuf == NULL && widget->priv->stock_person_pixbuf != NULL) {
- pixbuf = g_object_ref (widget->priv->stock_person_pixbuf);
- }
-
- tooltip = g_strdup_printf (_("Log in as %s"),
- gdm_user_get_user_name (user));
-
- is_logged_in = gdm_user_is_logged_in (user);
-
- g_debug ("GdmUserChooserWidget: User added name:%s logged-in:%d pixbuf:%p",
- gdm_user_get_user_name (user),
- is_logged_in,
- pixbuf);
-
- gdm_chooser_widget_update_item (GDM_CHOOSER_WIDGET (widget),
- gdm_user_get_user_name (user),
- pixbuf,
- gdm_user_get_real_name (user),
- tooltip,
- gdm_user_get_login_frequency (user),
- is_logged_in,
- FALSE);
- g_free (tooltip);
-
- if (pixbuf != NULL) {
- g_object_unref (pixbuf);
- }
+ update_item_for_user (widget, user);
}
static void
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]