[gdm/f14/master] Fix icons in user list
Ray Strode
rstrode at fedoraproject.org
Tue Aug 31 18:34:33 UTC 2010
commit e53a0cf5f7ebd5f44555943532fd306053a067b5
Author: Ray Strode <rstrode at redhat.com>
Date: Tue Aug 31 14:32:15 2010 -0400
Fix icons in user list
This commit does a number of internal fixes to make sure
the icons in the user list show up.
These fixes include:
1) activation fixes to ensure the accounts service is started
2) timing and synchronization issues in new async code
2) update queueing after the widget is mapped
fix-accounts-activation.patch | 134 +++++++++++
fix-hash-table-issue.patch | 28 +++
fix-user-async-issue.patch | 520 +++++++++++++++++++++++++++++++++++++++++
gdm.spec | 11 +-
4 files changed, 692 insertions(+), 1 deletions(-)
---
diff --git a/fix-accounts-activation.patch b/fix-accounts-activation.patch
new file mode 100644
index 0000000..725107a
--- /dev/null
+++ b/fix-accounts-activation.patch
@@ -0,0 +1,134 @@
+From 0ca0d06b10a8091b5a273fcfd6788ef1cf9f020c Mon Sep 17 00:00:00 2001
+From: Ray Strode <rstrode at redhat.com>
+Date: Fri, 27 Aug 2010 16:33:22 -0400
+Subject: [PATCH] Connect to accounts service correctly
+
+Previously, we were using
+
+dbus_g_proxy_new_for_name_owner which is wrong.
+
+It means we will give up early and fail to active
+the accounts service.
+
+(This used to work because we also did a separate
+dbus_g_proxy_new_for_name to the accounts service
+in a different source file)
+---
+ gui/simple-greeter/gdm-user-manager.c | 84 ++++++++++++---------------------
+ 1 files changed, 31 insertions(+), 53 deletions(-)
+
+diff --git a/gui/simple-greeter/gdm-user-manager.c b/gui/simple-greeter/gdm-user-manager.c
+index 4dbfcbe..0069480 100644
+--- a/gui/simple-greeter/gdm-user-manager.c
++++ b/gui/simple-greeter/gdm-user-manager.c
+@@ -1438,15 +1438,6 @@ unload_seat (GdmUserManager *manager)
+ }
+
+ static void
+-on_accounts_proxy_destroy (DBusGProxy *proxy,
+- GdmUserManager *manager)
+-{
+- g_debug ("GdmUserManager: accounts proxy destroyed");
+-
+- manager->priv->accounts_proxy = NULL;
+-}
+-
+-static void
+ get_accounts_proxy (GdmUserManager *manager)
+ {
+ DBusGProxy *proxy;
+@@ -1455,40 +1446,31 @@ get_accounts_proxy (GdmUserManager *manager)
+ g_assert (manager->priv->accounts_proxy == NULL);
+
+ error = NULL;
+- proxy = dbus_g_proxy_new_for_name_owner (manager->priv->connection,
+- ACCOUNTS_NAME,
+- ACCOUNTS_PATH,
+- ACCOUNTS_INTERFACE,
+- &error);
++ proxy = dbus_g_proxy_new_for_name (manager->priv->connection,
++ ACCOUNTS_NAME,
++ ACCOUNTS_PATH,
++ ACCOUNTS_INTERFACE);
+ manager->priv->accounts_proxy = proxy;
+
+- if (proxy != NULL) {
+- g_signal_connect (proxy, "destroy",
+- G_CALLBACK (on_accounts_proxy_destroy),
+- manager);
++ dbus_g_proxy_add_signal (proxy,
++ "UserAdded",
++ DBUS_TYPE_G_OBJECT_PATH,
++ G_TYPE_INVALID);
++ dbus_g_proxy_add_signal (proxy,
++ "UserDeleted",
++ DBUS_TYPE_G_OBJECT_PATH,
++ G_TYPE_INVALID);
+
+- dbus_g_proxy_add_signal (proxy,
+- "UserAdded",
+- DBUS_TYPE_G_OBJECT_PATH,
+- G_TYPE_INVALID);
+- dbus_g_proxy_add_signal (proxy,
+- "UserDeleted",
+- DBUS_TYPE_G_OBJECT_PATH,
+- G_TYPE_INVALID);
+-
+- dbus_g_proxy_connect_signal (proxy,
+- "UserAdded",
+- G_CALLBACK (on_new_user_in_accounts_service),
+- manager,
+- NULL);
+- dbus_g_proxy_connect_signal (proxy,
+- "UserDeleted",
+- G_CALLBACK (on_user_removed_in_accounts_service),
+- manager,
+- NULL);
+- } else {
+- g_debug ("GdmUserManager: Unable to connect to accounts service");
+- }
++ dbus_g_proxy_connect_signal (proxy,
++ "UserAdded",
++ G_CALLBACK (on_new_user_in_accounts_service),
++ manager,
++ NULL);
++ dbus_g_proxy_connect_signal (proxy,
++ "UserDeleted",
++ G_CALLBACK (on_user_removed_in_accounts_service),
++ manager,
++ NULL);
+ }
+
+ static void
+@@ -2343,19 +2325,15 @@ load_users_manually (GdmUserManager *manager)
+ static void
+ load_users (GdmUserManager *manager)
+ {
+- if (manager->priv->accounts_proxy != NULL) {
+- g_debug ("GdmUserManager: calling 'ListCachedUsers'");
+-
+- dbus_g_proxy_begin_call (manager->priv->accounts_proxy,
+- "ListCachedUsers",
+- on_list_cached_users_finished,
+- manager,
+- NULL,
+- G_TYPE_INVALID);
+- } else {
+- g_debug ("GdmUserManager: Getting users manually");
+- load_users_manually (manager);
+- }
++ g_assert (manager->priv->accounts_proxy != NULL);
++ g_debug ("GdmUserManager: calling 'ListCachedUsers'");
++
++ dbus_g_proxy_begin_call (manager->priv->accounts_proxy,
++ "ListCachedUsers",
++ on_list_cached_users_finished,
++ manager,
++ NULL,
++ G_TYPE_INVALID);
+ }
+
+ static void
+--
+1.7.2.2
+
diff --git a/fix-hash-table-issue.patch b/fix-hash-table-issue.patch
new file mode 100644
index 0000000..bae9e68
--- /dev/null
+++ b/fix-hash-table-issue.patch
@@ -0,0 +1,28 @@
+From bf392b8b48cae7f1a5d32fb715c70f359633b421 Mon Sep 17 00:00:00 2001
+From: Ray Strode <rstrode at redhat.com>
+Date: Fri, 27 Aug 2010 17:35:59 -0400
+Subject: [PATCH] Don't destroy shells hash table if we never made it
+
+---
+ gui/simple-greeter/gdm-user-manager.c | 5 ++++-
+ 1 files changed, 4 insertions(+), 1 deletions(-)
+
+diff --git a/gui/simple-greeter/gdm-user-manager.c b/gui/simple-greeter/gdm-user-manager.c
+index 0069480..e3bea4a 100644
+--- a/gui/simple-greeter/gdm-user-manager.c
++++ b/gui/simple-greeter/gdm-user-manager.c
+@@ -2792,7 +2792,10 @@ gdm_user_manager_finalize (GObject *object)
+ if (manager->priv->shells_monitor != NULL) {
+ g_file_monitor_cancel (manager->priv->shells_monitor);
+ }
+- g_hash_table_destroy (manager->priv->shells);
++
++ if (manager->priv->shells != NULL) {
++ g_hash_table_destroy (manager->priv->shells);
++ }
+
+ G_OBJECT_CLASS (gdm_user_manager_parent_class)->finalize (object);
+ }
+--
+1.7.2.2
+
diff --git a/fix-user-async-issue.patch b/fix-user-async-issue.patch
new file mode 100644
index 0000000..d0aa054
--- /dev/null
+++ b/fix-user-async-issue.patch
@@ -0,0 +1,520 @@
+From 8f3588dcf2f1d7b5907c77bdf3d407e074f65b14 Mon Sep 17 00:00:00 2001
+From: Ray Strode <rstrode at redhat.com>
+Date: Fri, 27 Aug 2010 17:57:18 -0400
+Subject: [PATCH 1/7] Emit changed signal whenever we do a GetAll call
+
+Previously we'd emit it after update_info, but at
+that point no properties have been changed yet,
+so its getting emitted prematurely.
+---
+ gui/simple-greeter/gdm-user.c | 6 +++---
+ 1 files changed, 3 insertions(+), 3 deletions(-)
+
+diff --git a/gui/simple-greeter/gdm-user.c b/gui/simple-greeter/gdm-user.c
+index 037b7e7..de46329 100644
+--- a/gui/simple-greeter/gdm-user.c
++++ b/gui/simple-greeter/gdm-user.c
+@@ -877,6 +877,8 @@ on_get_all_finished (DBusGProxy *proxy,
+ g_hash_table_foreach (hash_table, (GHFunc) collect_props, user);
+ g_hash_table_unref (hash_table);
+
++ g_signal_emit (user, signals[CHANGED], 0);
++
+ out:
+ g_object_unref (proxy);
+ }
+@@ -925,9 +927,7 @@ changed_handler (DBusGProxy *proxy,
+ {
+ GdmUser *user = GDM_USER (data);
+
+- if (update_info (user)) {
+- g_signal_emit (user, signals[CHANGED], 0);
+- }
++ update_info (user);
+ }
+
+ GdmUser *
+--
+1.7.2.2
+
+
+From b02dd2f7a684e36de84dfec778d6c4e39836efde Mon Sep 17 00:00:00 2001
+From: Ray Strode <rstrode at redhat.com>
+Date: Mon, 30 Aug 2010 13:49:58 -0400
+Subject: [PATCH 2/7] Add new 'is-loaded' property to user object
+
+Since the user objects are loaded asynchronously,
+there is a timeframe where they are incomplete.
+
+This commit adds an "is-loaded" property to
+GdmUser to mark when the user is fully loaded.
+---
+ gui/simple-greeter/gdm-user-manager.c | 40 +++++++++++++---
+ gui/simple-greeter/gdm-user.c | 78 +++++++++++++++++++++++++++++++++
+ gui/simple-greeter/gdm-user.h | 1 +
+ 3 files changed, 111 insertions(+), 8 deletions(-)
+
+diff --git a/gui/simple-greeter/gdm-user-manager.c b/gui/simple-greeter/gdm-user-manager.c
+index 40707b9..01117e2 100644
+--- a/gui/simple-greeter/gdm-user-manager.c
++++ b/gui/simple-greeter/gdm-user-manager.c
+@@ -758,27 +758,51 @@ remove_user (GdmUserManager *manager,
+ }
+
+ static void
+-on_new_user_changed (GdmUser *user,
+- GdmUserManager *manager)
++on_new_user_loaded (GdmUser *user,
++ GParamSpec *pspec,
++ GdmUserManager *manager)
+ {
+ const char *username;
+
+- username = gdm_user_get_user_name (user);
+-
+- if (username == NULL) {
++ if (!gdm_user_is_loaded (user)) {
+ return;
+ }
+
+- g_signal_handlers_disconnect_by_func (user, on_new_user_changed, manager);
++ g_signal_handlers_disconnect_by_func (user, on_new_user_loaded, manager);
+ manager->priv->new_users = g_slist_remove (manager->priv->new_users,
+ user);
+
++ username = gdm_user_get_user_name (user);
++
++ if (username == NULL) {
++ const char *object_path;
++
++ object_path = gdm_user_get_object_path (user);
++
++ if (object_path != NULL) {
++ g_warning ("GdmUserManager: user has no username "
++ "(object path: %s, uid: %lu)",
++ object_path, gdm_user_get_uid (user));
++ } else {
++ g_warning ("GdmUserManager: user has no username (uid: %lu)",
++ gdm_user_get_uid (user));
++ }
++ g_object_unref (user);
++ return;
++ }
++
+ if (username_in_exclude_list (manager, username)) {
+ g_debug ("GdmUserManager: excluding user '%s'", username);
+ g_object_unref (user);
+ return;
+ }
+
++ /* User added already through alternative, but less authoratative means.
++ */
++ if (g_hash_table_lookup (manager->priv->users_by_name, username) != NULL) {
++ g_hash_table_remove (manager->priv->users_by_name, username);
++ }
++
+ add_user (manager, user);
+ g_object_unref (user);
+ }
+@@ -800,7 +824,7 @@ add_new_user_for_object_path (const char *object_path,
+
+ manager->priv->new_users = g_slist_prepend (manager->priv->new_users, user);
+
+- g_signal_connect (user, "changed", G_CALLBACK (on_new_user_changed), manager);
++ g_signal_connect (user, "notify::is-loaded", G_CALLBACK (on_new_user_loaded), manager);
+ }
+
+ static void
+@@ -2734,7 +2758,7 @@ gdm_user_manager_finalize (GObject *object)
+ user = GDM_USER (node->data);
+ next_node = node->next;
+
+- g_signal_handlers_disconnect_by_func (user, on_new_user_changed, manager);
++ g_signal_handlers_disconnect_by_func (user, on_new_user_loaded, manager);
+ g_object_unref (user);
+ manager->priv->new_users = g_slist_delete_link (manager->priv->new_users, node);
+ node = next_node;
+diff --git a/gui/simple-greeter/gdm-user.c b/gui/simple-greeter/gdm-user.c
+index de46329..25951ba 100644
+--- a/gui/simple-greeter/gdm-user.c
++++ b/gui/simple-greeter/gdm-user.c
+@@ -46,6 +46,11 @@
+ #define USER_ACCOUNTS_INTERFACE "org.freedesktop.Accounts.User"
+
+ enum {
++ PROP_0,
++ PROP_IS_LOADED
++};
++
++enum {
+ CHANGED,
+ SESSIONS_CHANGED,
+ LAST_SIGNAL
+@@ -66,6 +71,8 @@ struct _GdmUser {
+ char *icon_file;
+ GList *sessions;
+ gulong login_frequency;
++
++ guint is_loaded : 1;
+ };
+
+ typedef struct _GdmUserClass
+@@ -139,6 +146,43 @@ gdm_user_get_num_sessions (GdmUser *user)
+ }
+
+ static void
++gdm_user_set_property (GObject *object,
++ guint prop_id,
++ const GValue *value,
++ GParamSpec *pspec)
++{
++ GdmUser *user;
++
++ user = GDM_USER (object);
++
++ switch (prop_id) {
++ default:
++ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
++ break;
++ }
++}
++
++static void
++gdm_user_get_property (GObject *object,
++ guint prop_id,
++ GValue *value,
++ GParamSpec *pspec)
++{
++ GdmUser *user;
++
++ user = GDM_USER (object);
++
++ switch (prop_id) {
++ case PROP_IS_LOADED:
++ g_value_set_boolean (value, user->is_loaded);
++ break;
++ default:
++ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
++ break;
++ }
++}
++
++static void
+ gdm_user_class_init (GdmUserClass *class)
+ {
+ GObjectClass *gobject_class;
+@@ -146,6 +190,16 @@ gdm_user_class_init (GdmUserClass *class)
+ gobject_class = G_OBJECT_CLASS (class);
+
+ gobject_class->finalize = gdm_user_finalize;
++ gobject_class->set_property = gdm_user_set_property;
++ gobject_class->get_property = gdm_user_get_property;
++
++ g_object_class_install_property (gobject_class,
++ PROP_IS_LOADED,
++ g_param_spec_boolean ("is-loaded",
++ NULL,
++ NULL,
++ FALSE,
++ G_PARAM_READABLE));
+
+ signals [CHANGED] =
+ g_signal_new ("changed",
+@@ -209,6 +263,16 @@ gdm_user_finalize (GObject *object)
+ (*G_OBJECT_CLASS (gdm_user_parent_class)->finalize) (object);
+ }
+
++static void
++set_is_loaded (GdmUser *user,
++ gboolean is_loaded)
++{
++ if (user->is_loaded != is_loaded) {
++ user->is_loaded = is_loaded;
++ g_object_notify (G_OBJECT (user), "is-loaded");
++ }
++}
++
+ /**
+ * _gdm_user_update_from_pwent:
+ * @user: the user object to update.
+@@ -297,6 +361,10 @@ _gdm_user_update_from_pwent (GdmUser *user,
+ changed = TRUE;
+ }
+
++ if (!user->is_loaded) {
++ set_is_loaded (user, TRUE);
++ }
++
+ if (changed) {
+ g_signal_emit (user, signals[CHANGED], 0);
+ }
+@@ -877,6 +945,10 @@ on_get_all_finished (DBusGProxy *proxy,
+ g_hash_table_foreach (hash_table, (GHFunc) collect_props, user);
+ g_hash_table_unref (hash_table);
+
++ if (!user->is_loaded) {
++ set_is_loaded (user, TRUE);
++ }
++
+ g_signal_emit (user, signals[CHANGED], 0);
+
+ out:
+@@ -958,3 +1030,9 @@ gdm_user_new_from_object_path (const gchar *object_path)
+ g_object_unref (user);
+ return NULL;
+ }
++
++gboolean
++gdm_user_is_loaded (GdmUser *user)
++{
++ return user->is_loaded;
++}
+diff --git a/gui/simple-greeter/gdm-user.h b/gui/simple-greeter/gdm-user.h
+index 2aee30a..4d6ced8 100644
+--- a/gui/simple-greeter/gdm-user.h
++++ b/gui/simple-greeter/gdm-user.h
+@@ -56,6 +56,7 @@ GdkPixbuf *gdm_user_render_icon (GdmUser *user,
+
+ gint gdm_user_collate (GdmUser *user1,
+ GdmUser *user2);
++gboolean gdm_user_is_loaded (GdmUser *user);
+
+ G_END_DECLS
+
+--
+1.7.2.2
+
+
+From 658303e84af31a3b3d4cf2e6159dd2bb059881ed Mon Sep 17 00:00:00 2001
+From: Ray Strode <rstrode at redhat.com>
+Date: Mon, 30 Aug 2010 14:38:06 -0400
+Subject: [PATCH 3/7] If a user added early, drop it from list
+
+Since we support getting users from multiple sources,
+we may end up with the same user getting added to the list
+twice. The accounts-service is the authoratative source,
+so if another source adds a user first then "undo" that user.
+---
+ gui/simple-greeter/gdm-user-manager.c | 16 +++++++++++-----
+ 1 files changed, 11 insertions(+), 5 deletions(-)
+
+diff --git a/gui/simple-greeter/gdm-user-manager.c b/gui/simple-greeter/gdm-user-manager.c
+index 01117e2..1407458 100644
+--- a/gui/simple-greeter/gdm-user-manager.c
++++ b/gui/simple-greeter/gdm-user-manager.c
+@@ -197,6 +197,7 @@ static void queue_load_seat_and_users (GdmUserManager *manager);
+ static void monitor_local_users (GdmUserManager *manager);
+
+ static void load_new_session_incrementally (GdmUserManagerNewSession *new_session);
++static void set_is_loaded (GdmUserManager *manager, gboolean is_loaded);
+
+ static gpointer user_manager_object = NULL;
+
+@@ -763,6 +764,7 @@ on_new_user_loaded (GdmUser *user,
+ GdmUserManager *manager)
+ {
+ const char *username;
++ GdmUser *old_user;
+
+ if (!gdm_user_is_loaded (user)) {
+ return;
+@@ -797,14 +799,20 @@ on_new_user_loaded (GdmUser *user,
+ return;
+ }
+
+- /* User added already through alternative, but less authoratative means.
++ old_user = g_hash_table_lookup (manager->priv->users_by_name, username);
++
++ /* If username got added earlier by a different means, trump it now.
+ */
+- if (g_hash_table_lookup (manager->priv->users_by_name, username) != NULL) {
+- g_hash_table_remove (manager->priv->users_by_name, username);
++ if (old_user != NULL) {
++ remove_user (manager, old_user);
+ }
+
+ add_user (manager, user);
+ g_object_unref (user);
++
++ if (manager->priv->new_users == NULL) {
++ set_is_loaded (manager, TRUE);
++ }
+ }
+
+ static void
+@@ -1137,8 +1145,6 @@ on_list_cached_users_finished (DBusGProxy *proxy,
+ }
+ }
+ }
+-
+- set_is_loaded (manager, TRUE);
+ }
+
+ static void
+--
+1.7.2.2
+
+
+From 395854d36caa3e10699c512d4227b6bcdad572fa Mon Sep 17 00:00:00 2001
+From: Ray Strode <rstrode at redhat.com>
+Date: Mon, 30 Aug 2010 14:55:35 -0400
+Subject: [PATCH 4/7] Don't mark list as loaded until accounts service chimes in
+
+---
+ gui/simple-greeter/gdm-user-manager.c | 8 ++++++++
+ 1 files changed, 8 insertions(+), 0 deletions(-)
+
+diff --git a/gui/simple-greeter/gdm-user-manager.c b/gui/simple-greeter/gdm-user-manager.c
+index 1407458..4ff850e 100644
+--- a/gui/simple-greeter/gdm-user-manager.c
++++ b/gui/simple-greeter/gdm-user-manager.c
+@@ -163,6 +163,7 @@ struct GdmUserManagerPrivate
+
+ gboolean is_loaded;
+ gboolean has_multiple_users;
++ gboolean listing_cached_users;
+ };
+
+ enum {
+@@ -854,6 +855,7 @@ on_user_removed_in_accounts_service (DBusGProxy *proxy,
+ GdmUser *user;
+
+ user = g_hash_table_lookup (manager->priv->users_by_object_path, object_path);
++
+ remove_user (manager, user);
+ }
+
+@@ -1106,6 +1108,7 @@ on_list_cached_users_finished (DBusGProxy *proxy,
+ GError *error = NULL;
+ GPtrArray *paths;
+
++ manager->priv->listing_cached_users = FALSE;
+ if (!dbus_g_proxy_end_call (proxy,
+ call_id,
+ &error,
+@@ -1748,6 +1751,10 @@ maybe_set_is_loaded (GdmUserManager *manager)
+ return;
+ }
+
++ if (manager->priv->listing_cached_users) {
++ return;
++ }
++
+ /* Don't set is_loaded yet unless the seat is already loaded
+ * or failed to load.
+ */
+@@ -2364,6 +2371,7 @@ load_users (GdmUserManager *manager)
+ manager,
+ NULL,
+ G_TYPE_INVALID);
++ manager->priv->listing_cached_users = TRUE;
+ }
+
+ static void
+--
+1.7.2.2
+
+
+From 91f8593e5d259f7e6b32f1afa29fa49dffa5f21a Mon Sep 17 00:00:00 2001
+From: Ray Strode <rstrode at redhat.com>
+Date: Tue, 31 Aug 2010 14:07:46 -0400
+Subject: [PATCH 5/7] Don't emit 'user-removed' if list isn't loaded
+
+We don't want to emit add or removed signals before
+loading.
+---
+ gui/simple-greeter/gdm-user-manager.c | 5 ++++-
+ 1 files changed, 4 insertions(+), 1 deletions(-)
+
+diff --git a/gui/simple-greeter/gdm-user-manager.c b/gui/simple-greeter/gdm-user-manager.c
+index 4ff850e..ddb6070 100644
+--- a/gui/simple-greeter/gdm-user-manager.c
++++ b/gui/simple-greeter/gdm-user-manager.c
+@@ -750,7 +750,10 @@ remove_user (GdmUserManager *manager,
+ g_hash_table_remove (manager->priv->users_by_object_path, gdm_user_get_object_path (user));
+ }
+ g_hash_table_remove (manager->priv->users_by_name, gdm_user_get_user_name (user));
+- g_signal_emit (manager, signals[USER_REMOVED], 0, user);
++
++ if (manager->priv->is_loaded) {
++ g_signal_emit (manager, signals[USER_REMOVED], 0, user);
++ }
+
+ g_object_unref (user);
+
+--
+1.7.2.2
+
+
+From ea8538cac4c6f48bffe8a4cbf67ca2fb317838a5 Mon Sep 17 00:00:00 2001
+From: Ray Strode <rstrode at redhat.com>
+Date: Tue, 31 Aug 2010 14:03:01 -0400
+Subject: [PATCH 6/7] Remove user from new-users list if removed from accounts service
+
+---
+ gui/simple-greeter/gdm-user-manager.c | 2 ++
+ 1 files changed, 2 insertions(+), 0 deletions(-)
+
+diff --git a/gui/simple-greeter/gdm-user-manager.c b/gui/simple-greeter/gdm-user-manager.c
+index ddb6070..138fbb6 100644
+--- a/gui/simple-greeter/gdm-user-manager.c
++++ b/gui/simple-greeter/gdm-user-manager.c
+@@ -859,6 +859,8 @@ on_user_removed_in_accounts_service (DBusGProxy *proxy,
+
+ user = g_hash_table_lookup (manager->priv->users_by_object_path, object_path);
+
++ manager->priv->new_users = g_slist_remove (manager->priv->new_users, user);
++
+ remove_user (manager, user);
+ }
+
+--
+1.7.2.2
+
+
+From 0df669070bfa550af9830deb0c17273529743970 Mon Sep 17 00:00:00 2001
+From: Ray Strode <rstrode at redhat.com>
+Date: Tue, 31 Aug 2010 13:36:20 -0400
+Subject: [PATCH 7/7] Fire off loading user images after chooser is mapped
+
+The update_visible_items function calls gtk_tree_view_get_visible_range
+which seems to only work after the tree view is mapped.
+
+This commit makes sure that we queue an update after the widget is
+mapped.
+
+(seems to a fix a problem where users face icons don't always show up)
+---
+ gui/simple-greeter/gdm-chooser-widget.c | 9 +++++++++
+ 1 files changed, 9 insertions(+), 0 deletions(-)
+
+diff --git a/gui/simple-greeter/gdm-chooser-widget.c b/gui/simple-greeter/gdm-chooser-widget.c
+index 9e3ae73..043928d 100644
+--- a/gui/simple-greeter/gdm-chooser-widget.c
++++ b/gui/simple-greeter/gdm-chooser-widget.c
+@@ -1362,6 +1362,14 @@ gdm_chooser_widget_show (GtkWidget *widget)
+ }
+
+ static void
++gdm_chooser_widget_map (GtkWidget *widget)
++{
++ queue_update_visible_items (GDM_CHOOSER_WIDGET (widget));
++
++ GTK_WIDGET_CLASS (gdm_chooser_widget_parent_class)->map (widget);
++}
++
++static void
+ gdm_chooser_widget_size_allocate (GtkWidget *widget,
+ GtkAllocation *allocation)
+ {
+@@ -1420,6 +1428,7 @@ gdm_chooser_widget_class_init (GdmChooserWidgetClass *klass)
+ widget_class->size_allocate = gdm_chooser_widget_size_allocate;
+ widget_class->hide = gdm_chooser_widget_hide;
+ widget_class->show = gdm_chooser_widget_show;
++ widget_class->map = gdm_chooser_widget_map;
+ widget_class->focus = gdm_chooser_widget_focus;
+ widget_class->focus_in_event = gdm_chooser_widget_focus_in_event;
+
+--
+1.7.2.2
+
diff --git a/gdm.spec b/gdm.spec
index 3870c18..941fdea 100644
--- a/gdm.spec
+++ b/gdm.spec
@@ -15,7 +15,7 @@
Summary: The GNOME Display Manager
Name: gdm
Version: 2.31.90
-Release: 2%{?dist}
+Release: 3%{?dist}
Epoch: 1
License: GPLv2+
Group: User Interface/X
@@ -87,6 +87,9 @@ Provides: service(graphical-login) = %{name}
Requires: audit-libs >= %{libauditver}
Patch2: plymouth.patch
+Patch3: fix-accounts-activation.patch
+Patch4: fix-hash-table-issue.patch
+Patch5: fix-user-async-issue.patch
Patch96: gdm-multistack.patch
# Fedora-specific
@@ -130,6 +133,9 @@ The GDM fingerprint plugin provides functionality necessary to use a fingerprint
%prep
%setup -q
%patch2 -p1 -b .plymouth
+%patch3 -p1 -b .fix-accounts-activation
+%patch4 -p1 -b .fix-hash-table-issue
+%patch5 -p1 -b .fix-user-async-issue
%patch96 -p1 -b .multistack
%patch97 -p1 -b .bubble-location
%patch98 -p1 -b .tray-padding
@@ -368,6 +374,9 @@ gtk-update-icon-cache %{_datadir}/icons/hicolor >&/dev/ull || :
%{_libdir}/gdm/simple-greeter/plugins/fingerprint.so
%changelog
+* Tue Aug 31 2010 Ray Strode <rstrode at redhat.com> 2.31.90-3
+- Fix icons in user list
+
* Wed Aug 25 2010 Ray Strode <rstrode at redhat.com> 2.31.90-2
- Fix crash when autologin is enabled
More information about the scm-commits
mailing list