d0e8d54
From 1a8e5634ea780869574072ce5d4b33048fb35698 Mon Sep 17 00:00:00 2001
d0e8d54
From: Ray Strode <rstrode@redhat.com>
d0e8d54
Date: Thu, 13 Dec 2007 10:12:30 -0500
d0e8d54
Subject: [PATCH] Change user-chooser-widget over to use new chooser widget
d0e8d54
d0e8d54
---
d0e8d54
 gui/simple-greeter/Makefile.am               |   10 +
d0e8d54
 gui/simple-greeter/gdm-user-chooser-widget.c |  600 ++------------------------
d0e8d54
 gui/simple-greeter/gdm-user-chooser-widget.h |   11 +-
d0e8d54
 3 files changed, 59 insertions(+), 562 deletions(-)
d0e8d54
d0e8d54
diff --git a/gui/simple-greeter/Makefile.am b/gui/simple-greeter/Makefile.am
d0e8d54
index a403f24..836c620 100644
d0e8d54
--- a/gui/simple-greeter/Makefile.am
d0e8d54
+++ b/gui/simple-greeter/Makefile.am
d0e8d54
@@ -45,6 +45,8 @@ test_greeter_login_window_SOURCES = 	\
d0e8d54
 	test-greeter-login-window.c	\
d0e8d54
 	gdm-greeter-login-window.h	\
d0e8d54
 	gdm-greeter-login-window.c	\
d0e8d54
+	gdm-chooser-widget.h		\
d0e8d54
+	gdm-chooser-widget.c		\
d0e8d54
 	gdm-user-chooser-widget.h	\
d0e8d54
 	gdm-user-chooser-widget.c	\
d0e8d54
 	gdm-user-chooser-dialog.h	\
d0e8d54
@@ -86,6 +88,8 @@ test_language_chooser_LDADD =	\
d0e8d54
 
d0e8d54
 test_session_chooser_SOURCES = 	\
d0e8d54
 	test-session-chooser.c		\
d0e8d54
+	gdm-chooser-widget.h		\
d0e8d54
+	gdm-chooser-widget.c		\
d0e8d54
 	gdm-session-chooser-widget.h	\
d0e8d54
 	gdm-session-chooser-widget.c	\
d0e8d54
 	gdm-session-chooser-dialog.h	\
d0e8d54
@@ -98,6 +102,8 @@ test_session_chooser_LDADD =		\
d0e8d54
 
d0e8d54
 test_user_chooser_SOURCES = 		\
d0e8d54
 	test-user-chooser.c		\
d0e8d54
+	gdm-chooser-widget.h		\
d0e8d54
+	gdm-chooser-widget.c		\
d0e8d54
 	gdm-user-chooser-widget.h	\
d0e8d54
 	gdm-user-chooser-widget.c	\
d0e8d54
 	gdm-user-chooser-dialog.h	\
d0e8d54
@@ -131,6 +137,8 @@ libexec_PROGRAMS =			\
d0e8d54
 
d0e8d54
 gdm_simple_greeter_SOURCES =  		\
d0e8d54
 	greeter-main.c 			\
d0e8d54
+	gdm-chooser-widget.h		\
d0e8d54
+	gdm-chooser-widget.c		\
d0e8d54
 	gdm-greeter-client.h		\
d0e8d54
 	gdm-greeter-client.c		\
d0e8d54
 	gdm-greeter-session.h		\
d0e8d54
@@ -145,6 +153,8 @@ gdm_simple_greeter_SOURCES =  		\
d0e8d54
 	gdm-greeter-panel.c		\
d0e8d54
 	gdm-greeter-background.h	\
d0e8d54
 	gdm-greeter-background.c	\
d0e8d54
+	gdm-session-chooser-widget.h	\
d0e8d54
+	gdm-session-chooser-widget.c	\
d0e8d54
 	gdm-user-chooser-widget.h	\
d0e8d54
 	gdm-user-chooser-widget.c	\
d0e8d54
 	gdm-user-manager.h		\
d0e8d54
diff --git a/gui/simple-greeter/gdm-user-chooser-widget.c b/gui/simple-greeter/gdm-user-chooser-widget.c
d0e8d54
index e8c0cdc..b8a9bb7 100644
d0e8d54
--- a/gui/simple-greeter/gdm-user-chooser-widget.c
d0e8d54
+++ b/gui/simple-greeter/gdm-user-chooser-widget.c
d0e8d54
@@ -1,6 +1,7 @@
d0e8d54
 /* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*-
d0e8d54
  *
d0e8d54
  * Copyright (C) 2007 William Jon McCann <mccann@jhu.edu>
d0e8d54
+ * Copyright (C) 2007 Ray Strode <rstrode@redhat.com>
d0e8d54
  *
d0e8d54
  * This program is free software; you can redistribute it and/or modify
d0e8d54
  * it under the terms of the GNU General Public License as published by
d0e8d54
@@ -47,61 +48,23 @@ enum {
d0e8d54
 
d0e8d54
 struct GdmUserChooserWidgetPrivate
d0e8d54
 {
d0e8d54
-        GtkWidget          *treeview;
d0e8d54
-
d0e8d54
-        GtkTreeModel       *real_model;
d0e8d54
-        GtkTreeModel       *filter_model;
d0e8d54
-        GtkTreeModel       *sort_model;
d0e8d54
-
d0e8d54
         GdmUserManager     *manager;
d0e8d54
 
d0e8d54
         GdkPixbuf          *logged_in_pixbuf;
d0e8d54
-        char               *chosen_user;
d0e8d54
-        gboolean            show_only_chosen;
d0e8d54
-        gboolean            show_other_user;
d0e8d54
-        gboolean            show_guest_user;
d0e8d54
 
d0e8d54
-        guint               populate_id;
d0e8d54
+        guint               show_other_user : 1;
d0e8d54
+        guint               show_guest_user : 1;
d0e8d54
 };
d0e8d54
 
d0e8d54
 enum {
d0e8d54
         PROP_0,
d0e8d54
 };
d0e8d54
 
d0e8d54
-enum {
d0e8d54
-        USER_CHOSEN,
d0e8d54
-        LAST_SIGNAL
d0e8d54
-};
d0e8d54
-
d0e8d54
-static guint signals [LAST_SIGNAL] = { 0, };
d0e8d54
-
d0e8d54
 static void     gdm_user_chooser_widget_class_init  (GdmUserChooserWidgetClass *klass);
d0e8d54
 static void     gdm_user_chooser_widget_init        (GdmUserChooserWidget      *user_chooser_widget);
d0e8d54
 static void     gdm_user_chooser_widget_finalize    (GObject                   *object);
d0e8d54
 
d0e8d54
-G_DEFINE_TYPE (GdmUserChooserWidget, gdm_user_chooser_widget, GTK_TYPE_VBOX)
d0e8d54
-
d0e8d54
-enum {
d0e8d54
-        CHOOSER_LIST_PIXBUF_COLUMN = 0,
d0e8d54
-        CHOOSER_LIST_NAME_COLUMN,
d0e8d54
-        CHOOSER_LIST_TOOLTIP_COLUMN,
d0e8d54
-        CHOOSER_LIST_IS_LOGGED_IN_COLUMN,
d0e8d54
-        CHOOSER_LIST_ID_COLUMN
d0e8d54
-};
d0e8d54
-
d0e8d54
-void
d0e8d54
-gdm_user_chooser_widget_set_show_only_chosen (GdmUserChooserWidget *widget,
d0e8d54
-                                              gboolean              show_only)
d0e8d54
-{
d0e8d54
-        g_return_if_fail (GDM_IS_USER_CHOOSER_WIDGET (widget));
d0e8d54
-
d0e8d54
-        if (widget->priv->show_only_chosen != show_only) {
d0e8d54
-                widget->priv->show_only_chosen = show_only;
d0e8d54
-                if (widget->priv->filter_model != NULL) {
d0e8d54
-                        gtk_tree_model_filter_refilter (GTK_TREE_MODEL_FILTER (widget->priv->filter_model));
d0e8d54
-                }
d0e8d54
-        }
d0e8d54
-}
d0e8d54
+G_DEFINE_TYPE (GdmUserChooserWidget, gdm_user_chooser_widget, GDM_TYPE_CHOOSER_WIDGET)
d0e8d54
 
d0e8d54
 void
d0e8d54
 gdm_user_chooser_widget_set_show_other_user (GdmUserChooserWidget *widget,
d0e8d54
@@ -111,9 +74,6 @@ gdm_user_chooser_widget_set_show_other_user (GdmUserChooserWidget *widget,
d0e8d54
 
d0e8d54
         if (widget->priv->show_other_user != show_user) {
d0e8d54
                 widget->priv->show_other_user = show_user;
d0e8d54
-                if (widget->priv->filter_model != NULL) {
d0e8d54
-                        gtk_tree_model_filter_refilter (GTK_TREE_MODEL_FILTER (widget->priv->filter_model));
d0e8d54
-                }
d0e8d54
         }
d0e8d54
 }
d0e8d54
 
d0e8d54
@@ -125,122 +85,15 @@ gdm_user_chooser_widget_set_show_guest_user (GdmUserChooserWidget *widget,
d0e8d54
 
d0e8d54
         if (widget->priv->show_guest_user != show_user) {
d0e8d54
                 widget->priv->show_guest_user = show_user;
d0e8d54
-                if (widget->priv->filter_model != NULL) {
d0e8d54
-                        gtk_tree_model_filter_refilter (GTK_TREE_MODEL_FILTER (widget->priv->filter_model));
d0e8d54
-                }
d0e8d54
         }
d0e8d54
 }
d0e8d54
 
d0e8d54
 char *
d0e8d54
 gdm_user_chooser_widget_get_chosen_user_name (GdmUserChooserWidget *widget)
d0e8d54
 {
d0e8d54
-        char *user_name;
d0e8d54
-
d0e8d54
         g_return_val_if_fail (GDM_IS_USER_CHOOSER_WIDGET (widget), NULL);
d0e8d54
 
d0e8d54
-        user_name = NULL;
d0e8d54
-        if (widget->priv->chosen_user != NULL) {
d0e8d54
-                user_name = g_strdup (widget->priv->chosen_user);
d0e8d54
-        }
d0e8d54
-
d0e8d54
-        return user_name;
d0e8d54
-}
d0e8d54
-
d0e8d54
-static void
d0e8d54
-activate_name (GdmUserChooserWidget *widget,
d0e8d54
-               const char           *name)
d0e8d54
-{
d0e8d54
-        GtkTreeModel *model;
d0e8d54
-        GtkTreeIter   iter;
d0e8d54
-        GtkTreePath  *path;
d0e8d54
-
d0e8d54
-        path = NULL;
d0e8d54
-
d0e8d54
-        model = widget->priv->real_model;
d0e8d54
-
d0e8d54
-        if (name != NULL && gtk_tree_model_get_iter_first (model, &iter)) {
d0e8d54
-
d0e8d54
-                do {
d0e8d54
-                        char           *id;
d0e8d54
-                        gboolean        found;
d0e8d54
-
d0e8d54
-                        id = NULL;
d0e8d54
-                        gtk_tree_model_get (model,
d0e8d54
-                                            &iter,
d0e8d54
-                                            CHOOSER_LIST_ID_COLUMN, &id,
d0e8d54
-                                            -1);
d0e8d54
-                        if (id == NULL) {
d0e8d54
-                                continue;
d0e8d54
-                        }
d0e8d54
-
d0e8d54
-                        found = (strcmp (id, name) == 0);
d0e8d54
-
d0e8d54
-                        if (found) {
d0e8d54
-                                path = gtk_tree_model_get_path (model, &iter);
d0e8d54
-                                break;
d0e8d54
-                        }
d0e8d54
-
d0e8d54
-                } while (gtk_tree_model_iter_next (model, &iter));
d0e8d54
-        }
d0e8d54
-
d0e8d54
-        if (path != NULL) {
d0e8d54
-                gtk_tree_view_scroll_to_cell (GTK_TREE_VIEW (widget->priv->treeview),
d0e8d54
-                                              path,
d0e8d54
-                                              NULL,
d0e8d54
-                                              TRUE,
d0e8d54
-                                              0.5,
d0e8d54
-                                              0.0);
d0e8d54
-                gtk_tree_view_set_cursor (GTK_TREE_VIEW (widget->priv->treeview),
d0e8d54
-                                          path,
d0e8d54
-                                          NULL,
d0e8d54
-                                          FALSE);
d0e8d54
-
d0e8d54
-                gtk_tree_view_row_activated (GTK_TREE_VIEW (widget->priv->treeview),
d0e8d54
-                                             path,
d0e8d54
-                                             NULL);
d0e8d54
-                gtk_tree_path_free (path);
d0e8d54
-        }
d0e8d54
-}
d0e8d54
-
d0e8d54
-static void
d0e8d54
-choose_user_id (GdmUserChooserWidget *widget,
d0e8d54
-                const char           *id)
d0e8d54
-{
d0e8d54
-
d0e8d54
-        g_debug ("GdmUserChooserWidget: Selection changed from:'%s' to:'%s'",
d0e8d54
-                 widget->priv->chosen_user ? widget->priv->chosen_user : "",
d0e8d54
-                 id ? id : "");
d0e8d54
-
d0e8d54
-        g_free (widget->priv->chosen_user);
d0e8d54
-        widget->priv->chosen_user = g_strdup (id);
d0e8d54
-
d0e8d54
-        gtk_tree_model_filter_refilter (GTK_TREE_MODEL_FILTER (widget->priv->filter_model));
d0e8d54
-}
d0e8d54
-
d0e8d54
-static void
d0e8d54
-choose_selected_user (GdmUserChooserWidget *widget)
d0e8d54
-{
d0e8d54
-        char             *id;
d0e8d54
-        GtkTreeSelection *selection;
d0e8d54
-        GtkTreeModel     *model;
d0e8d54
-        GtkTreeIter       iter;
d0e8d54
-
d0e8d54
-        id = NULL;
d0e8d54
-
d0e8d54
-        selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (widget->priv->treeview));
d0e8d54
-        if (gtk_tree_selection_get_selected (selection, &model, &iter)) {
d0e8d54
-                gtk_tree_model_get (model, &iter, CHOOSER_LIST_ID_COLUMN, &id, -1);
d0e8d54
-        }
d0e8d54
-
d0e8d54
-        choose_user_id (widget, id);
d0e8d54
-}
d0e8d54
-
d0e8d54
-static void
d0e8d54
-clear_selection (GdmUserChooserWidget *widget)
d0e8d54
-{
d0e8d54
-        GtkTreeSelection *selection;
d0e8d54
-        selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (widget->priv->treeview));
d0e8d54
-        gtk_tree_selection_unselect_all (selection);
d0e8d54
+        return gdm_chooser_widget_get_active_item (GDM_CHOOSER_WIDGET (widget));
d0e8d54
 }
d0e8d54
 
d0e8d54
 void
d0e8d54
@@ -249,14 +102,18 @@ gdm_user_chooser_widget_set_chosen_user_name (GdmUserChooserWidget *widget,
d0e8d54
 {
d0e8d54
         g_return_if_fail (GDM_IS_USER_CHOOSER_WIDGET (widget));
d0e8d54
 
d0e8d54
-        if (name == NULL) {
d0e8d54
-                clear_selection (widget);
d0e8d54
-                choose_user_id (widget, NULL);
d0e8d54
-        } else {
d0e8d54
-                activate_name (widget, name);
d0e8d54
-        }
d0e8d54
+        gdm_chooser_widget_set_active_item (GDM_CHOOSER_WIDGET (widget), name);
d0e8d54
 }
d0e8d54
 
d0e8d54
+void
d0e8d54
+gdm_user_chooser_widget_set_show_only_chosen (GdmUserChooserWidget *widget,
d0e8d54
+                                              gboolean              show_only) {
d0e8d54
+        g_return_if_fail (GDM_IS_USER_CHOOSER_WIDGET (widget));
d0e8d54
+
d0e8d54
+        gdm_chooser_widget_set_hide_inactive_items (GDM_CHOOSER_WIDGET (widget),
d0e8d54
+                                                    show_only);
d0e8d54
+
d0e8d54
+}
d0e8d54
 static void
d0e8d54
 gdm_user_chooser_widget_set_property (GObject        *object,
d0e8d54
                                       guint           prop_id,
d0e8d54
@@ -315,55 +172,22 @@ gdm_user_chooser_widget_dispose (GObject *object)
d0e8d54
 
d0e8d54
         widget = GDM_USER_CHOOSER_WIDGET (object);
d0e8d54
 
d0e8d54
-        g_free (widget->priv->chosen_user);
d0e8d54
-        widget->priv->chosen_user = NULL;
d0e8d54
-
d0e8d54
         G_OBJECT_CLASS (gdm_user_chooser_widget_parent_class)->dispose (object);
d0e8d54
 }
d0e8d54
 
d0e8d54
 static void
d0e8d54
 gdm_user_chooser_widget_class_init (GdmUserChooserWidgetClass *klass)
d0e8d54
 {
d0e8d54
-        GObjectClass   *object_class = G_OBJECT_CLASS (klass);
d0e8d54
-
d0e8d54
+        GObjectClass          *object_class = G_OBJECT_CLASS (klass);
d0e8d54
         object_class->get_property = gdm_user_chooser_widget_get_property;
d0e8d54
         object_class->set_property = gdm_user_chooser_widget_set_property;
d0e8d54
         object_class->constructor = gdm_user_chooser_widget_constructor;
d0e8d54
         object_class->dispose = gdm_user_chooser_widget_dispose;
d0e8d54
         object_class->finalize = gdm_user_chooser_widget_finalize;
d0e8d54
 
d0e8d54
-        signals [USER_CHOSEN] = g_signal_new ("user-chosen",
d0e8d54
-                                              G_TYPE_FROM_CLASS (object_class),
d0e8d54
-                                              G_SIGNAL_RUN_LAST,
d0e8d54
-                                              G_STRUCT_OFFSET (GdmUserChooserWidgetClass, user_chosen),
d0e8d54
-                                              NULL,
d0e8d54
-                                              NULL,
d0e8d54
-                                              g_cclosure_marshal_VOID__VOID,
d0e8d54
-                                              G_TYPE_NONE,
d0e8d54
-                                              0);
d0e8d54
-
d0e8d54
         g_type_class_add_private (klass, sizeof (GdmUserChooserWidgetPrivate));
d0e8d54
 }
d0e8d54
 
d0e8d54
-static void
d0e8d54
-on_selection_changed (GtkTreeSelection     *selection,
d0e8d54
-                      GdmUserChooserWidget *widget)
d0e8d54
-{
d0e8d54
-}
d0e8d54
-
d0e8d54
-static void
d0e8d54
-on_row_activated (GtkTreeView          *tree_view,
d0e8d54
-                  GtkTreePath          *tree_path,
d0e8d54
-                  GtkTreeViewColumn    *tree_column,
d0e8d54
-                  GdmUserChooserWidget *widget)
d0e8d54
-{
d0e8d54
-        choose_selected_user (widget);
d0e8d54
-
d0e8d54
-        g_signal_emit (widget, signals[USER_CHOSEN], 0);
d0e8d54
-
d0e8d54
-        clear_selection (widget);
d0e8d54
-}
d0e8d54
-
d0e8d54
 static GdkPixbuf *
d0e8d54
 get_pixbuf_for_user (GdmUserChooserWidget *widget,
d0e8d54
                      const char           *username)
d0e8d54
@@ -394,107 +218,37 @@ get_logged_in_pixbuf (GdmUserChooserWidget *widget)
d0e8d54
 }
d0e8d54
 
d0e8d54
 static gboolean
d0e8d54
-populate_model (GdmUserChooserWidget *widget)
d0e8d54
+add_special_users (GdmUserChooserWidget *widget)
d0e8d54
 {
d0e8d54
-        GtkTreeIter iter;
d0e8d54
         GdkPixbuf  *pixbuf;
d0e8d54
 
d0e8d54
         widget->priv->logged_in_pixbuf = get_logged_in_pixbuf (widget);
d0e8d54
 
d0e8d54
         pixbuf = get_pixbuf_for_user (widget, NULL);
d0e8d54
 
d0e8d54
-        /* Add some fake entries */
d0e8d54
-        gtk_list_store_append (GTK_LIST_STORE (widget->priv->real_model), &iter);
d0e8d54
-        gtk_list_store_set (GTK_LIST_STORE (widget->priv->real_model), &iter,
d0e8d54
-                            CHOOSER_LIST_PIXBUF_COLUMN, pixbuf,
d0e8d54
-                            CHOOSER_LIST_NAME_COLUMN, _("Other..."),
d0e8d54
-                            CHOOSER_LIST_TOOLTIP_COLUMN, _("Choose a different account"),
d0e8d54
-                            CHOOSER_LIST_IS_LOGGED_IN_COLUMN, FALSE,
d0e8d54
-                            CHOOSER_LIST_ID_COLUMN, GDM_USER_CHOOSER_USER_OTHER,
d0e8d54
-                            -1);
d0e8d54
-
d0e8d54
-        gtk_list_store_append (GTK_LIST_STORE (widget->priv->real_model), &iter);
d0e8d54
-        gtk_list_store_set (GTK_LIST_STORE (widget->priv->real_model), &iter,
d0e8d54
-                            CHOOSER_LIST_PIXBUF_COLUMN, pixbuf,
d0e8d54
-                            CHOOSER_LIST_NAME_COLUMN, _("Guest"),
d0e8d54
-                            CHOOSER_LIST_TOOLTIP_COLUMN, _("Login as a temporary guest"),
d0e8d54
-                            CHOOSER_LIST_IS_LOGGED_IN_COLUMN, FALSE,
d0e8d54
-                            CHOOSER_LIST_ID_COLUMN, GDM_USER_CHOOSER_USER_GUEST,
d0e8d54
-                            -1);
d0e8d54
-
d0e8d54
+        gdm_chooser_widget_add_item (GDM_CHOOSER_WIDGET (widget),
d0e8d54
+                                     GDM_USER_CHOOSER_USER_OTHER,
d0e8d54
+                                     pixbuf, _("Other..."),
d0e8d54
+                                     _("Choose a different account"), FALSE,
d0e8d54
+                                     TRUE);
d0e8d54
+
d0e8d54
+        gdm_chooser_widget_add_item (GDM_CHOOSER_WIDGET (widget),
d0e8d54
+                                     GDM_USER_CHOOSER_USER_GUEST,
d0e8d54
+                                     pixbuf, _("Guest"),
d0e8d54
+                                     _("Login as a temporary guest"), FALSE,
d0e8d54
+                                     TRUE);
d0e8d54
         if (pixbuf != NULL) {
d0e8d54
                 g_object_unref (pixbuf);
d0e8d54
         }
d0e8d54
 
d0e8d54
-        widget->priv->populate_id = 0;
d0e8d54
         return FALSE;
d0e8d54
 }
d0e8d54
 
d0e8d54
-static int
d0e8d54
-compare_user_names (char *name_a,
d0e8d54
-                    char *name_b,
d0e8d54
-                    char *id_a,
d0e8d54
-                    char *id_b)
d0e8d54
-{
d0e8d54
-
d0e8d54
-        if (id_a == NULL) {
d0e8d54
-                return 1;
d0e8d54
-        } else if (id_b == NULL) {
d0e8d54
-                return -1;
d0e8d54
-        }
d0e8d54
-
d0e8d54
-        if (strcmp (id_a, "__other") == 0) {
d0e8d54
-                return 1;
d0e8d54
-        } else if (strcmp (id_b, "__other") == 0) {
d0e8d54
-                return -1;
d0e8d54
-        } else if (strcmp (id_a, "__guest") == 0) {
d0e8d54
-                return 1;
d0e8d54
-        } else if (strcmp (id_b, "__guest") == 0) {
d0e8d54
-                return -1;
d0e8d54
-        }
d0e8d54
-
d0e8d54
-        if (name_a == NULL) {
d0e8d54
-                return 1;
d0e8d54
-        } else if (name_b == NULL) {
d0e8d54
-                return -1;
d0e8d54
-        }
d0e8d54
-
d0e8d54
-        return g_utf8_collate (name_a, name_b);
d0e8d54
-}
d0e8d54
-
d0e8d54
-static int
d0e8d54
-compare_user  (GtkTreeModel *model,
d0e8d54
-                  GtkTreeIter  *a,
d0e8d54
-                  GtkTreeIter  *b,
d0e8d54
-                  gpointer      user_data)
d0e8d54
-{
d0e8d54
-        char *name_a;
d0e8d54
-        char *name_b;
d0e8d54
-        char *id_a;
d0e8d54
-        char *id_b;
d0e8d54
-        int   result;
d0e8d54
-
d0e8d54
-        gtk_tree_model_get (model, a, CHOOSER_LIST_NAME_COLUMN, &name_a, -1);
d0e8d54
-        gtk_tree_model_get (model, b, CHOOSER_LIST_NAME_COLUMN, &name_b, -1);
d0e8d54
-        gtk_tree_model_get (model, a, CHOOSER_LIST_ID_COLUMN, &id_a, -1);
d0e8d54
-        gtk_tree_model_get (model, b, CHOOSER_LIST_ID_COLUMN, &id_b, -1);
d0e8d54
-
d0e8d54
-        result = compare_user_names (name_a, name_b, id_a, id_b);
d0e8d54
-
d0e8d54
-        g_free (name_a);
d0e8d54
-        g_free (name_b);
d0e8d54
-        g_free (id_a);
d0e8d54
-        g_free (id_b);
d0e8d54
-
d0e8d54
-        return result;
d0e8d54
-}
d0e8d54
-
d0e8d54
 static void
d0e8d54
 on_user_added (GdmUserManager       *manager,
d0e8d54
                GdmUser              *user,
d0e8d54
                GdmUserChooserWidget *widget)
d0e8d54
 {
d0e8d54
-        GtkTreeIter   iter;
d0e8d54
         GdkPixbuf    *pixbuf;
d0e8d54
         char         *tooltip;
d0e8d54
 
d0e8d54
@@ -502,18 +256,13 @@ on_user_added (GdmUserManager       *manager,
d0e8d54
 
d0e8d54
         pixbuf = gdm_user_render_icon (user, GTK_WIDGET (widget), ICON_SIZE);
d0e8d54
 
d0e8d54
-        tooltip = g_strdup_printf ("%s: %s",
d0e8d54
-                                   _("Short Name"),
d0e8d54
+        tooltip = g_strdup_printf (_("Log in as %s"),
d0e8d54
                                    gdm_user_get_user_name (user));
d0e8d54
 
d0e8d54
-        gtk_list_store_append (GTK_LIST_STORE (widget->priv->real_model), &iter);
d0e8d54
-        gtk_list_store_set (GTK_LIST_STORE (widget->priv->real_model), &iter,
d0e8d54
-                            CHOOSER_LIST_PIXBUF_COLUMN, pixbuf,
d0e8d54
-                            CHOOSER_LIST_NAME_COLUMN, gdm_user_get_real_name (user),
d0e8d54
-                            CHOOSER_LIST_TOOLTIP_COLUMN, tooltip,
d0e8d54
-                            CHOOSER_LIST_IS_LOGGED_IN_COLUMN, gdm_user_get_num_sessions (user) > 0,
d0e8d54
-                            CHOOSER_LIST_ID_COLUMN, gdm_user_get_user_name (user),
d0e8d54
-                            -1);
d0e8d54
+        gdm_chooser_widget_add_item (GDM_CHOOSER_WIDGET (widget),
d0e8d54
+                                     gdm_user_get_user_name (user),
d0e8d54
+                                     pixbuf, gdm_user_get_real_name (user),
d0e8d54
+                                     tooltip, FALSE, FALSE);
d0e8d54
         g_free (tooltip);
d0e8d54
 
d0e8d54
         if (pixbuf != NULL) {
d0e8d54
@@ -526,41 +275,14 @@ on_user_removed (GdmUserManager       *manager,
d0e8d54
                  GdmUser              *user,
d0e8d54
                  GdmUserChooserWidget *widget)
d0e8d54
 {
d0e8d54
-        GtkTreeIter iter;
d0e8d54
-        gboolean    found;
d0e8d54
         const char *user_name;
d0e8d54
 
d0e8d54
         g_debug ("GdmUserChooserWidget: User removed: %s", gdm_user_get_user_name (user));
d0e8d54
 
d0e8d54
-        found = FALSE;
d0e8d54
-
d0e8d54
         user_name = gdm_user_get_user_name (user);
d0e8d54
 
d0e8d54
-        if (gtk_tree_model_get_iter_first (widget->priv->real_model, &iter)) {
d0e8d54
-
d0e8d54
-                do {
d0e8d54
-                        char *id;
d0e8d54
-
d0e8d54
-                        id = NULL;
d0e8d54
-                        gtk_tree_model_get (widget->priv->real_model,
d0e8d54
-                                            &iter,
d0e8d54
-                                            CHOOSER_LIST_ID_COLUMN, &id,
d0e8d54
-                                            -1);
d0e8d54
-                        if (id == NULL) {
d0e8d54
-                                continue;
d0e8d54
-                        }
d0e8d54
-
d0e8d54
-                        found = (strcmp (id, user_name) == 0);
d0e8d54
-
d0e8d54
-                        if (found) {
d0e8d54
-                                break;
d0e8d54
-                        }
d0e8d54
-
d0e8d54
-                } while (gtk_tree_model_iter_next (widget->priv->real_model, &iter));
d0e8d54
-        }
d0e8d54
-        if (found) {
d0e8d54
-                gtk_list_store_remove (GTK_LIST_STORE (widget->priv->real_model), &iter);
d0e8d54
-        }
d0e8d54
+        gdm_chooser_widget_remove_item (GDM_CHOOSER_WIDGET (widget),
d0e8d54
+                                        user_name);
d0e8d54
 }
d0e8d54
 
d0e8d54
 static void
d0e8d54
@@ -568,162 +290,28 @@ on_user_is_logged_in_changed (GdmUserManager       *manager,
d0e8d54
                               GdmUser              *user,
d0e8d54
                               GdmUserChooserWidget *widget)
d0e8d54
 {
d0e8d54
-        GtkTreeIter iter;
d0e8d54
-        gboolean    found;
d0e8d54
         const char *user_name;
d0e8d54
         gboolean    is_logged_in;
d0e8d54
 
d0e8d54
         g_debug ("GdmUserChooserWidget: User logged in changed: %s", gdm_user_get_user_name (user));
d0e8d54
 
d0e8d54
-        found = FALSE;
d0e8d54
-
d0e8d54
         user_name = gdm_user_get_user_name (user);
d0e8d54
         is_logged_in = gdm_user_get_num_sessions (user) > 0;
d0e8d54
 
d0e8d54
-        if (gtk_tree_model_get_iter_first (widget->priv->real_model, &iter)) {
d0e8d54
-
d0e8d54
-                do {
d0e8d54
-                        char *id;
d0e8d54
-
d0e8d54
-                        id = NULL;
d0e8d54
-                        gtk_tree_model_get (widget->priv->real_model,
d0e8d54
-                                            &iter,
d0e8d54
-                                            CHOOSER_LIST_ID_COLUMN, &id,
d0e8d54
-                                            -1);
d0e8d54
-                        if (id == NULL) {
d0e8d54
-                                continue;
d0e8d54
-                        }
d0e8d54
-
d0e8d54
-                        found = (strcmp (id, user_name) == 0);
d0e8d54
-
d0e8d54
-                        if (found) {
d0e8d54
-                                break;
d0e8d54
-                        }
d0e8d54
-
d0e8d54
-                } while (gtk_tree_model_iter_next (widget->priv->real_model, &iter));
d0e8d54
-        }
d0e8d54
-
d0e8d54
-        if (found) {
d0e8d54
-                gtk_list_store_set (GTK_LIST_STORE (widget->priv->real_model),
d0e8d54
-                                    &iter,
d0e8d54
-                                    CHOOSER_LIST_IS_LOGGED_IN_COLUMN, is_logged_in,
d0e8d54
-                                    -1);
d0e8d54
-        }
d0e8d54
-}
d0e8d54
-
d0e8d54
-static gboolean
d0e8d54
-user_visible_cb (GtkTreeModel         *model,
d0e8d54
-                 GtkTreeIter          *iter,
d0e8d54
-                 GdmUserChooserWidget *widget)
d0e8d54
-{
d0e8d54
-        char    *id;
d0e8d54
-        gboolean ret;
d0e8d54
-
d0e8d54
-        ret = FALSE;
d0e8d54
-
d0e8d54
-        id = NULL;
d0e8d54
-        gtk_tree_model_get (model, iter, CHOOSER_LIST_ID_COLUMN, &id, -1);
d0e8d54
-        if (id == NULL) {
d0e8d54
-                goto out;
d0e8d54
-        }
d0e8d54
-
d0e8d54
-        /* if a user is chosen */
d0e8d54
-        if (widget->priv->chosen_user != NULL
d0e8d54
-            && widget->priv->show_only_chosen) {
d0e8d54
-
d0e8d54
-                ret = (strcmp (id, widget->priv->chosen_user) == 0);
d0e8d54
-                goto out;
d0e8d54
-        }
d0e8d54
-
d0e8d54
-        if (! widget->priv->show_other_user
d0e8d54
-            && strcmp (id, GDM_USER_CHOOSER_USER_OTHER) == 0) {
d0e8d54
-                ret = FALSE;
d0e8d54
-                goto out;
d0e8d54
-        }
d0e8d54
-        if (! widget->priv->show_guest_user
d0e8d54
-            && strcmp (id, GDM_USER_CHOOSER_USER_GUEST) == 0) {
d0e8d54
-                ret = FALSE;
d0e8d54
-                goto out;
d0e8d54
-        }
d0e8d54
-
d0e8d54
-        ret = TRUE;
d0e8d54
-
d0e8d54
- out:
d0e8d54
-        g_free (id);
d0e8d54
-
d0e8d54
-        return ret;
d0e8d54
-}
d0e8d54
-
d0e8d54
-static void
d0e8d54
-name_cell_data_func (GtkTreeViewColumn    *tree_column,
d0e8d54
-                     GtkCellRenderer      *cell,
d0e8d54
-                     GtkTreeModel         *model,
d0e8d54
-                     GtkTreeIter          *iter,
d0e8d54
-                     GdmUserChooserWidget *widget)
d0e8d54
-{
d0e8d54
-        gboolean logged_in;
d0e8d54
-        char    *name;
d0e8d54
-        char    *markup;
d0e8d54
-
d0e8d54
-        name = NULL;
d0e8d54
-        gtk_tree_model_get (model,
d0e8d54
-                            iter,
d0e8d54
-                            CHOOSER_LIST_IS_LOGGED_IN_COLUMN, &logged_in,
d0e8d54
-                            CHOOSER_LIST_NAME_COLUMN, &name,
d0e8d54
-                            -1);
d0e8d54
-
d0e8d54
-        if (logged_in) {
d0e8d54
-                markup = g_strdup_printf ("%s\n%s",
d0e8d54
-                                          name,
d0e8d54
-                                          _("Currently logged in"));
d0e8d54
-        } else {
d0e8d54
-                markup = g_strdup_printf ("%s", name);
d0e8d54
-        }
d0e8d54
-
d0e8d54
-        g_object_set (cell,
d0e8d54
-                      "markup", markup,
d0e8d54
-                      NULL);
d0e8d54
-
d0e8d54
-        g_free (markup);
d0e8d54
-        g_free (name);
d0e8d54
-}
d0e8d54
-
d0e8d54
-static void
d0e8d54
-check_cell_data_func (GtkTreeViewColumn    *tree_column,
d0e8d54
-                      GtkCellRenderer      *cell,
d0e8d54
-                      GtkTreeModel         *model,
d0e8d54
-                      GtkTreeIter          *iter,
d0e8d54
-                      GdmUserChooserWidget *widget)
d0e8d54
-{
d0e8d54
-        gboolean   logged_in;
d0e8d54
-        GdkPixbuf *pixbuf;
d0e8d54
-
d0e8d54
-        gtk_tree_model_get (model,
d0e8d54
-                            iter,
d0e8d54
-                            CHOOSER_LIST_IS_LOGGED_IN_COLUMN, &logged_in,
d0e8d54
-                            -1);
d0e8d54
-
d0e8d54
-        if (logged_in) {
d0e8d54
-                pixbuf = widget->priv->logged_in_pixbuf;
d0e8d54
-        } else {
d0e8d54
-                pixbuf = NULL;
d0e8d54
-        }
d0e8d54
-
d0e8d54
-        g_object_set (cell,
d0e8d54
-                      "pixbuf", pixbuf,
d0e8d54
-                      NULL);
d0e8d54
+        gdm_chooser_widget_set_item_in_use (GDM_CHOOSER_WIDGET (widget),
d0e8d54
+                                            user_name, is_logged_in);
d0e8d54
 }
d0e8d54
 
d0e8d54
 static void
d0e8d54
 gdm_user_chooser_widget_init (GdmUserChooserWidget *widget)
d0e8d54
 {
d0e8d54
-        GtkWidget         *scrolled;
d0e8d54
-        GtkTreeViewColumn *column;
d0e8d54
-        GtkTreeSelection  *selection;
d0e8d54
-        GtkCellRenderer   *renderer;
d0e8d54
-
d0e8d54
         widget->priv = GDM_USER_CHOOSER_WIDGET_GET_PRIVATE (widget);
d0e8d54
 
d0e8d54
+        gdm_chooser_widget_set_separator_position (GDM_CHOOSER_WIDGET (widget),
d0e8d54
+                                                   GDM_CHOOSER_WIDGET_POSITION_BOTTOM);
d0e8d54
+        gdm_chooser_widget_set_in_use_message (GDM_CHOOSER_WIDGET (widget),
d0e8d54
+                                               _("Currently logged in"));
d0e8d54
+
d0e8d54
         widget->priv->manager = gdm_user_manager_ref_default ();
d0e8d54
         g_signal_connect (widget->priv->manager,
d0e8d54
                           "user-added",
d0e8d54
@@ -738,103 +326,7 @@ gdm_user_chooser_widget_init (GdmUserChooserWidget *widget)
d0e8d54
                           G_CALLBACK (on_user_is_logged_in_changed),
d0e8d54
                           widget);
d0e8d54
 
d0e8d54
-        scrolled = gtk_scrolled_window_new (NULL, NULL);
d0e8d54
-        gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolled),
d0e8d54
-                                             GTK_SHADOW_IN);
d0e8d54
-        gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled),
d0e8d54
-                                        GTK_POLICY_NEVER,
d0e8d54
-                                        GTK_POLICY_AUTOMATIC);
d0e8d54
-        gtk_box_pack_start (GTK_BOX (widget), scrolled, TRUE, TRUE, 0);
d0e8d54
-
d0e8d54
-        widget->priv->treeview = gtk_tree_view_new ();
d0e8d54
-        gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (widget->priv->treeview), FALSE);
d0e8d54
-
d0e8d54
-        g_signal_connect (widget->priv->treeview,
d0e8d54
-                          "row-activated",
d0e8d54
-                          G_CALLBACK (on_row_activated),
d0e8d54
-                          widget);
d0e8d54
-        gtk_container_add (GTK_CONTAINER (scrolled), widget->priv->treeview);
d0e8d54
-
d0e8d54
-        selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (widget->priv->treeview));
d0e8d54
-        gtk_tree_selection_set_mode (selection, GTK_SELECTION_SINGLE);
d0e8d54
-        g_signal_connect (selection, "changed",
d0e8d54
-                          G_CALLBACK (on_selection_changed),
d0e8d54
-                          widget);
d0e8d54
-
d0e8d54
-        widget->priv->real_model = (GtkTreeModel *)gtk_list_store_new (5,
d0e8d54
-                                                                       GDK_TYPE_PIXBUF,
d0e8d54
-                                                                       G_TYPE_STRING,
d0e8d54
-                                                                       G_TYPE_STRING,
d0e8d54
-                                                                       G_TYPE_BOOLEAN,
d0e8d54
-                                                                       G_TYPE_STRING);
d0e8d54
-
d0e8d54
-        widget->priv->filter_model = gtk_tree_model_filter_new (widget->priv->real_model, NULL);
d0e8d54
-
d0e8d54
-        gtk_tree_model_filter_set_visible_func (GTK_TREE_MODEL_FILTER (widget->priv->filter_model),
d0e8d54
-                                                (GtkTreeModelFilterVisibleFunc) user_visible_cb,
d0e8d54
-                                                widget,
d0e8d54
-                                                NULL);
d0e8d54
-
d0e8d54
-        widget->priv->sort_model = gtk_tree_model_sort_new_with_model (widget->priv->filter_model);
d0e8d54
-
d0e8d54
-        gtk_tree_sortable_set_sort_func (GTK_TREE_SORTABLE (widget->priv->sort_model),
d0e8d54
-                                         CHOOSER_LIST_NAME_COLUMN,
d0e8d54
-                                         compare_user,
d0e8d54
-                                         NULL, NULL);
d0e8d54
-
d0e8d54
-        gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (widget->priv->sort_model),
d0e8d54
-                                              CHOOSER_LIST_NAME_COLUMN,
d0e8d54
-                                              GTK_SORT_ASCENDING);
d0e8d54
-
d0e8d54
-        gtk_tree_view_set_model (GTK_TREE_VIEW (widget->priv->treeview), widget->priv->sort_model);
d0e8d54
-
d0e8d54
-        /* CHECK COLUMN */
d0e8d54
-        renderer = gtk_cell_renderer_pixbuf_new ();
d0e8d54
-        column = gtk_tree_view_column_new ();
d0e8d54
-        gtk_tree_view_column_pack_start (column, renderer, FALSE);
d0e8d54
-        gtk_tree_view_append_column (GTK_TREE_VIEW (widget->priv->treeview), column);
d0e8d54
-        gtk_tree_view_column_set_cell_data_func (column,
d0e8d54
-                                                 renderer,
d0e8d54
-                                                 (GtkTreeCellDataFunc) check_cell_data_func,
d0e8d54
-                                                 widget,
d0e8d54
-                                                 NULL);
d0e8d54
-        g_object_set (renderer,
d0e8d54
-                      "width", 96,
d0e8d54
-                      "yalign", 0.5,
d0e8d54
-                      "xalign", 0.5,
d0e8d54
-                      NULL);
d0e8d54
-
d0e8d54
-        /* FACE COLUMN */
d0e8d54
-        renderer = gtk_cell_renderer_pixbuf_new ();
d0e8d54
-        column = gtk_tree_view_column_new ();
d0e8d54
-        gtk_tree_view_column_pack_start (column, renderer, FALSE);
d0e8d54
-        gtk_tree_view_append_column (GTK_TREE_VIEW (widget->priv->treeview), column);
d0e8d54
-
d0e8d54
-        gtk_tree_view_column_set_attributes (column,
d0e8d54
-                                             renderer,
d0e8d54
-                                             "pixbuf", CHOOSER_LIST_PIXBUF_COLUMN,
d0e8d54
-                                             NULL);
d0e8d54
-
d0e8d54
-        g_object_set (renderer,
d0e8d54
-                      "width", 64,
d0e8d54
-                      "yalign", 0.5,
d0e8d54
-                      "xalign", 1.0,
d0e8d54
-                      NULL);
d0e8d54
-
d0e8d54
-        /* NAME COLUMN */
d0e8d54
-        renderer = gtk_cell_renderer_text_new ();
d0e8d54
-        column = gtk_tree_view_column_new ();
d0e8d54
-        gtk_tree_view_column_pack_start (column, renderer, FALSE);
d0e8d54
-        gtk_tree_view_append_column (GTK_TREE_VIEW (widget->priv->treeview), column);
d0e8d54
-        gtk_tree_view_column_set_cell_data_func (column,
d0e8d54
-                                                 renderer,
d0e8d54
-                                                 (GtkTreeCellDataFunc) name_cell_data_func,
d0e8d54
-                                                 widget,
d0e8d54
-                                                 NULL);
d0e8d54
-
d0e8d54
-        gtk_tree_view_set_tooltip_column (GTK_TREE_VIEW (widget->priv->treeview), CHOOSER_LIST_TOOLTIP_COLUMN);
d0e8d54
-
d0e8d54
-        widget->priv->populate_id = g_idle_add ((GSourceFunc)populate_model, widget);
d0e8d54
+        add_special_users (widget);
d0e8d54
 }
d0e8d54
 
d0e8d54
 static void
d0e8d54
@@ -849,10 +341,6 @@ gdm_user_chooser_widget_finalize (GObject *object)
d0e8d54
 
d0e8d54
         g_return_if_fail (widget->priv != NULL);
d0e8d54
 
d0e8d54
-        if (widget->priv->populate_id > 0) {
d0e8d54
-                g_source_remove (widget->priv->populate_id);
d0e8d54
-        }
d0e8d54
-
d0e8d54
         G_OBJECT_CLASS (gdm_user_chooser_widget_parent_class)->finalize (object);
d0e8d54
 }
d0e8d54
 
d0e8d54
@@ -862,6 +350,8 @@ gdm_user_chooser_widget_new (void)
d0e8d54
         GObject *object;
d0e8d54
 
d0e8d54
         object = g_object_new (GDM_TYPE_USER_CHOOSER_WIDGET,
d0e8d54
+                               "inactive-text", _("_Users:"),
d0e8d54
+                               "active-text", _("_User:"),
d0e8d54
                                NULL);
d0e8d54
 
d0e8d54
         return GTK_WIDGET (object);
d0e8d54
diff --git a/gui/simple-greeter/gdm-user-chooser-widget.h b/gui/simple-greeter/gdm-user-chooser-widget.h
d0e8d54
index 9c1ef6f..a117fb3 100644
d0e8d54
--- a/gui/simple-greeter/gdm-user-chooser-widget.h
d0e8d54
+++ b/gui/simple-greeter/gdm-user-chooser-widget.h
d0e8d54
@@ -22,7 +22,8 @@
d0e8d54
 #define __GDM_USER_CHOOSER_WIDGET_H
d0e8d54
 
d0e8d54
 #include <glib-object.h>
d0e8d54
-#include <gtk/gtkvbox.h>
d0e8d54
+
d0e8d54
+#include "gdm-chooser-widget.h"
d0e8d54
 
d0e8d54
 G_BEGIN_DECLS
d0e8d54
 
d0e8d54
@@ -37,16 +38,13 @@ typedef struct GdmUserChooserWidgetPrivate GdmUserChooserWidgetPrivate;
d0e8d54
 
d0e8d54
 typedef struct
d0e8d54
 {
d0e8d54
-        GtkVBox                      parent;
d0e8d54
+        GdmChooserWidget            parent;
d0e8d54
         GdmUserChooserWidgetPrivate *priv;
d0e8d54
 } GdmUserChooserWidget;
d0e8d54
 
d0e8d54
 typedef struct
d0e8d54
 {
d0e8d54
-        GtkVBoxClass   parent_class;
d0e8d54
-
d0e8d54
-        /* signals */
d0e8d54
-        void (* user_chosen)        (GdmUserChooserWidget *widget);
d0e8d54
+        GdmChooserWidgetClass   parent_class;
d0e8d54
 } GdmUserChooserWidgetClass;
d0e8d54
 
d0e8d54
 #define GDM_USER_CHOOSER_USER_OTHER "__other"
d0e8d54
@@ -64,7 +62,6 @@ void                   gdm_user_chooser_widget_set_show_other_user        (GdmUs
d0e8d54
                                                                            gboolean              show_other);
d0e8d54
 void                   gdm_user_chooser_widget_set_show_guest_user        (GdmUserChooserWidget *widget,
d0e8d54
                                                                            gboolean              show_other);
d0e8d54
-
d0e8d54
 G_END_DECLS
d0e8d54
 
d0e8d54
 #endif /* __GDM_USER_CHOOSER_WIDGET_H */
d0e8d54
-- 
d0e8d54
1.5.3.6
d0e8d54