[accounts-dialog] Allow typeahead search in the user list
- From: Matthias Clasen <matthiasc src gnome org>
- To: svn-commits-list gnome org
- Cc:
- Subject: [accounts-dialog] Allow typeahead search in the user list
- Date: Tue, 2 Feb 2010 01:56:36 +0000 (UTC)
commit 2812b509250ddf52e4c3fc92b3f74fd5a606dc20
Author: Matthias Clasen <mclasen redhat com>
Date: Mon Feb 1 20:53:38 2010 -0500
Allow typeahead search in the user list
...and try to be somewhat smart about matching names.
src/main.c | 66 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 66 insertions(+), 0 deletions(-)
---
diff --git a/src/main.c b/src/main.c
index 646f6af..4440a82 100644
--- a/src/main.c
+++ b/src/main.c
@@ -1186,6 +1186,69 @@ focus_moved (GtkWindow *window,
}
}
+static gboolean
+match_user (GtkTreeModel *model,
+ gint column,
+ const gchar *key,
+ GtkTreeIter *iter,
+ gpointer search_data)
+{
+ UmUser *user;
+ const gchar *name;
+ gchar *normalized_key = NULL;
+ gchar *normalized_name = NULL;
+ gchar *case_normalized_key = NULL;
+ gchar *case_normalized_name = NULL;
+ gchar *p;
+ gboolean result = TRUE;
+ gint i;
+
+ gtk_tree_model_get (model, iter, USER_COL, &user, -1);
+
+ if (!user) {
+ goto out;
+ }
+
+ normalized_key = g_utf8_normalize (key, -1, G_NORMALIZE_ALL);
+ if (!normalized_key) {
+ goto out;
+ }
+
+ case_normalized_key = g_utf8_casefold (normalized_key, -1);
+
+ for (i = 0; i < 2; i++) {
+ if (i == 0)
+ name = um_user_get_real_name (user);
+ else
+ name = um_user_get_user_name (user);
+
+ g_free (normalized_name);
+ normalized_name = g_utf8_normalize (name, -1, G_NORMALIZE_ALL);
+ if (normalized_name) {
+ g_free (case_normalized_name);
+ case_normalized_name = g_utf8_casefold (normalized_name, -1);
+ p = strstr (case_normalized_name, case_normalized_key);
+
+ /* poor man's \b */
+ if (p == case_normalized_name || (p && p[-1] == ' ')) {
+ result = FALSE;
+ break;
+ }
+ }
+ }
+
+ out:
+ if (user) {
+ g_object_unref (user);
+ }
+ g_free (normalized_key);
+ g_free (case_normalized_key);
+ g_free (normalized_name);
+ g_free (case_normalized_name);
+
+ return result;
+}
+
static void
setup_main_window (UserAccountDialog *d)
{
@@ -1217,6 +1280,9 @@ setup_main_window (UserAccountDialog *d)
gtk_tree_sortable_set_default_sort_func (GTK_TREE_SORTABLE (model), sort_users, NULL, NULL);
gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (model), GTK_TREE_SORTABLE_DEFAULT_SORT_COLUMN_ID, GTK_SORT_ASCENDING);
gtk_tree_view_set_model (GTK_TREE_VIEW (userlist), model);
+ gtk_tree_view_set_search_column (GTK_TREE_VIEW (userlist), USER_COL);
+ gtk_tree_view_set_search_equal_func (GTK_TREE_VIEW (userlist),
+ match_user, NULL, NULL);
g_signal_connect (d->um, "users-loaded", G_CALLBACK (users_loaded), d);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]