[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