[gdm] Update duplicate real names to be unique



commit dfc66ca1f169c8b9f1c504f762b3d01605917a98
Author: Dan Nicholson <dbn lists gmail com>
Date:   Sun Nov 9 08:52:35 2008 -0800

    Update duplicate real names to be unique
    
    When the user manager encounters users who have duplicated real names,
    it updates the display name to be "Real Name (username)" so that it is
    unique.

 gui/simple-greeter/gdm-user-chooser-widget.c |    2 +-
 gui/simple-greeter/gdm-user-manager.c        |   52 ++++++++++++--
 gui/simple-greeter/gdm-user-private.h        |    3 +
 gui/simple-greeter/gdm-user.c                |  101 ++++++++++++++++++++++++++
 gui/simple-greeter/gdm-user.h                |    1 +
 gui/user-switch-applet/applet.c              |    4 +-
 6 files changed, 153 insertions(+), 10 deletions(-)
---
diff --git a/gui/simple-greeter/gdm-user-chooser-widget.c b/gui/simple-greeter/gdm-user-chooser-widget.c
index 90b523a..4410a02 100644
--- a/gui/simple-greeter/gdm-user-chooser-widget.c
+++ b/gui/simple-greeter/gdm-user-chooser-widget.c
@@ -393,7 +393,7 @@ add_user (GdmUserChooserWidget *widget,
         gdm_chooser_widget_add_item (GDM_CHOOSER_WIDGET (widget),
                                      gdm_user_get_user_name (user),
                                      pixbuf,
-                                     gdm_user_get_real_name (user),
+                                     gdm_user_get_display_name (user),
                                      tooltip,
                                      gdm_user_get_login_frequency (user),
                                      is_logged_in,
diff --git a/gui/simple-greeter/gdm-user-manager.c b/gui/simple-greeter/gdm-user-manager.c
index e9135da..8b55236 100644
--- a/gui/simple-greeter/gdm-user-manager.c
+++ b/gui/simple-greeter/gdm-user-manager.c
@@ -693,11 +693,39 @@ create_user (GdmUserManager *manager)
         return user;
 }
 
+static gint
+match_real_name_cmpfunc (gconstpointer a,
+                         gconstpointer b)
+{
+        if (a == b)
+                return -1;
+
+        return g_strcmp0 (gdm_user_get_real_name ((GdmUser *) a),
+                          gdm_user_get_real_name ((GdmUser *) b));
+}
+
+static gboolean
+match_real_name_hrfunc (gpointer key,
+                        gpointer value,
+                        gpointer user_data)
+{
+        return (g_strcmp0 (user_data, gdm_user_get_real_name (value)) == 0);
+}
+
 static void
 add_user (GdmUserManager *manager,
           GdmUser        *user)
 {
+        GdmUser *dup;
+
         add_sessions_for_user (manager, user);
+        dup = g_hash_table_find (manager->priv->users,
+                                 match_real_name_hrfunc,
+                                 (char *) gdm_user_get_real_name (user));
+        if (dup != NULL) {
+                _gdm_user_show_full_display_name (user);
+                _gdm_user_show_full_display_name (dup);
+        }
         g_hash_table_insert (manager->priv->users,
                              g_strdup (gdm_user_get_user_name (user)),
                              g_object_ref (user));
@@ -1274,6 +1302,7 @@ reload_passwd (GdmUserManager *manager)
         GSList        *old_users;
         GSList        *new_users;
         GSList        *list;
+        GSList        *dup;
         FILE          *fp;
 
         old_users = NULL;
@@ -1293,6 +1322,7 @@ reload_passwd (GdmUserManager *manager)
         for (list = old_users; list; list = list->next) {
                 if (gdm_user_get_num_sessions (list->data) > 0) {
                         g_object_freeze_notify (G_OBJECT (list->data));
+                        _gdm_user_show_short_display_name (list->data);
                         new_users = g_slist_prepend (new_users, g_object_ref (list->data));
                 }
         }
@@ -1341,13 +1371,6 @@ reload_passwd (GdmUserManager *manager)
                 new_users = g_slist_prepend (new_users, user);
         }
 
-        /* Go through and handle added users */
-        for (list = new_users; list; list = list->next) {
-                if (! g_slist_find (old_users, list->data)) {
-                        add_user (manager, list->data);
-                }
-        }
-
         /* Go through and handle removed users */
         for (list = old_users; list; list = list->next) {
                 if (! g_slist_find (new_users, list->data)) {
@@ -1357,6 +1380,21 @@ reload_passwd (GdmUserManager *manager)
                 }
         }
 
+        /* Go through and handle added users or update display names */
+        for (list = new_users; list; list = list->next) {
+                if (g_slist_find (old_users, list->data)) {
+                        dup = g_slist_find_custom (new_users,
+                                                   list->data,
+                                                   match_real_name_cmpfunc);
+                        if (dup != NULL) {
+                                _gdm_user_show_full_display_name (list->data);
+                                _gdm_user_show_full_display_name (dup->data);
+                        }
+                } else {
+                        add_user (manager, list->data);
+                }
+        }
+
  out:
         /* Cleanup */
 
diff --git a/gui/simple-greeter/gdm-user-private.h b/gui/simple-greeter/gdm-user-private.h
index 9a0e1d3..1b1b368 100644
--- a/gui/simple-greeter/gdm-user-private.h
+++ b/gui/simple-greeter/gdm-user-private.h
@@ -39,6 +39,9 @@ void _gdm_user_remove_session   (GdmUser             *user,
 
 void _gdm_user_icon_changed     (GdmUser             *user);
 
+void _gdm_user_show_full_display_name (GdmUser   *user);
+void _gdm_user_show_short_display_name  (GdmUser   *user);
+
 G_END_DECLS
 
 #endif /* !__GDM_USER_PRIVATE__ */
diff --git a/gui/simple-greeter/gdm-user.c b/gui/simple-greeter/gdm-user.c
index 27bf8ec..c25cfa0 100644
--- a/gui/simple-greeter/gdm-user.c
+++ b/gui/simple-greeter/gdm-user.c
@@ -48,6 +48,7 @@ enum {
         PROP_0,
         PROP_MANAGER,
         PROP_REAL_NAME,
+        PROP_DISPLAY_NAME,
         PROP_USER_NAME,
         PROP_UID,
         PROP_HOME_DIR,
@@ -69,6 +70,7 @@ struct _GdmUser {
         uid_t           uid;
         char           *user_name;
         char           *real_name;
+        char           *display_name;
         char           *home_dir;
         char           *shell;
         GList          *sessions;
@@ -207,6 +209,9 @@ gdm_user_get_property (GObject    *object,
         case PROP_REAL_NAME:
                 g_value_set_string (value, user->real_name);
                 break;
+        case PROP_DISPLAY_NAME:
+                g_value_set_string (value, user->display_name);
+                break;
         case PROP_HOME_DIR:
                 g_value_set_string (value, user->home_dir);
                 break;
@@ -254,6 +259,14 @@ gdm_user_class_init (GdmUserClass *class)
                                                               G_PARAM_READABLE));
 
         g_object_class_install_property (gobject_class,
+                                         PROP_DISPLAY_NAME,
+                                         g_param_spec_string ("display-name",
+                                                              "Display Name",
+                                                              "The unique name to display for this user.",
+                                                              NULL,
+                                                              G_PARAM_READABLE));
+
+        g_object_class_install_property (gobject_class,
                                          PROP_UID,
                                          g_param_spec_ulong ("uid",
                                                              "User ID",
@@ -370,6 +383,7 @@ gdm_user_init (GdmUser *user)
         user->manager = NULL;
         user->user_name = NULL;
         user->real_name = NULL;
+        user->display_name = NULL;
         user->sessions = NULL;
 }
 
@@ -384,6 +398,7 @@ gdm_user_finalize (GObject *object)
 
         g_free (user->user_name);
         g_free (user->real_name);
+        g_free (user->display_name);
 
         if (G_OBJECT_CLASS (gdm_user_parent_class)->finalize)
                 (*G_OBJECT_CLASS (gdm_user_parent_class)->finalize) (object);
@@ -444,6 +459,16 @@ _gdm_user_update (GdmUser             *user,
                 g_free (real_name);
         }
 
+        /* Unique Display Name */
+        if ((!user->real_name && user->display_name) ||
+            (user->real_name &&
+             user->display_name &&
+             strncmp (user->real_name, user->display_name, strlen (user->real_name)) != 0)) {
+                g_free (user->display_name);
+                user->display_name = NULL;
+                g_object_notify (G_OBJECT (user), "display-name");
+        }
+
         /* UID */
         if (pwent->pw_uid != user->uid) {
                 user->uid = pwent->pw_uid;
@@ -543,6 +568,26 @@ gdm_user_get_real_name (GdmUser *user)
 }
 
 /**
+ * gdm_user_get_display_name:
+ * @user: the user object to examine.
+ *
+ * Retrieves the unique display name of @user.
+ *
+ * Returns: a pointer to an array of characters which must not be modified or
+ *  freed, or %NULL.
+ *
+ * Since: 1.0
+ **/
+G_CONST_RETURN gchar *
+gdm_user_get_display_name (GdmUser *user)
+{
+        g_return_val_if_fail (GDM_IS_USER (user), NULL);
+
+        return (user->display_name ? user->display_name
+                : gdm_user_get_real_name (user));
+}
+
+/**
  * gdm_user_get_user_name:
  * @user: the user object to examine.
  *
@@ -610,6 +655,62 @@ gdm_user_get_login_frequency (GdmUser *user)
         return user->login_frequency;
 }
 
+/**
+ * _gdm_user_show_full_display_name:
+ * @user: the user object to examine.
+ *
+ * Updates the unique display name of @user to "Real Name (username)".
+ *
+ * Since: 1.0
+ **/
+void
+_gdm_user_show_full_display_name (GdmUser *user)
+{
+        char *uniq_name;
+
+        g_return_if_fail (GDM_IS_USER (user));
+
+        if (user->real_name != NULL) {
+                uniq_name = g_strdup_printf ("%s (%s)",
+                                             user->real_name,
+                                             user->user_name);
+        } else {
+                uniq_name = NULL;
+        }
+
+        if ((user->real_name && !user->display_name) ||
+            (!user->real_name && user->display_name) ||
+            (user->real_name &&
+             user->display_name &&
+             strcmp (uniq_name, user->display_name) != 0)) {
+                g_free (user->display_name);
+                user->display_name = uniq_name;
+                g_object_notify (G_OBJECT (user), "display-name");
+        } else {
+                g_free (uniq_name);
+        }
+}
+
+/**
+ * _gdm_user_show_short_display_name:
+ * @user: the user object to examine.
+ *
+ * Resets the unique display name of @user.
+ *
+ * Since: 1.0
+ **/
+void
+_gdm_user_show_short_display_name (GdmUser *user)
+{
+        g_return_if_fail (GDM_IS_USER (user));
+
+        if (user->display_name) {
+                g_free (user->display_name);
+                user->display_name = NULL;
+                g_object_notify (G_OBJECT (user), "display-name");
+        }
+}
+
 int
 gdm_user_collate (GdmUser *user1,
                   GdmUser *user2)
diff --git a/gui/simple-greeter/gdm-user.h b/gui/simple-greeter/gdm-user.h
index 5c72b2f..9f153d9 100644
--- a/gui/simple-greeter/gdm-user.h
+++ b/gui/simple-greeter/gdm-user.h
@@ -42,6 +42,7 @@ GType                 gdm_user_get_type            (void) G_GNUC_CONST;
 uid_t                 gdm_user_get_uid             (GdmUser   *user);
 G_CONST_RETURN char  *gdm_user_get_user_name       (GdmUser   *user);
 G_CONST_RETURN char  *gdm_user_get_real_name       (GdmUser   *user);
+G_CONST_RETURN char  *gdm_user_get_display_name    (GdmUser   *user);
 G_CONST_RETURN char  *gdm_user_get_home_directory  (GdmUser   *user);
 G_CONST_RETURN char  *gdm_user_get_shell           (GdmUser   *user);
 guint                 gdm_user_get_num_sessions    (GdmUser   *user);
diff --git a/gui/user-switch-applet/applet.c b/gui/user-switch-applet/applet.c
index fb710a9..66897c0 100644
--- a/gui/user-switch-applet/applet.c
+++ b/gui/user-switch-applet/applet.c
@@ -980,11 +980,11 @@ update_label (GdmAppletData *adata)
 
 #ifdef BUILD_PRESENSE_STUFF
         markup = g_strdup_printf ("<b>%s</b> <small>(%s)</small>",
-                                  gdm_user_get_real_name (GDM_USER (adata->user)),
+                                  gdm_user_get_display_name (GDM_USER (adata->user)),
                                   _(statuses[adata->current_status].display_name));
 #else
         markup = g_strdup_printf ("<b>%s</b>",
-                                  gdm_user_get_real_name (GDM_USER (adata->user)));
+                                  gdm_user_get_display_name (GDM_USER (adata->user)));
 #endif
         gtk_label_set_markup (GTK_LABEL (label), markup);
         g_free (markup);



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]