+
+typedef struct
+{
+ EmpathyContactSelectorFilterFunc func;
+ gpointer user_data;
+} FilterData;
+
+static void
+filter_data_free (gpointer data)
+{
+ g_slice_free (FilterData, data);
+}
+
+static gboolean
+contact_selector_filter_visible_func (GtkTreeModel *model,
+ GtkTreeIter *iter,
+ gpointer user_data)
+{
+ EmpathyContact *contact;
+ gboolean visible = FALSE;
+ FilterData *data = (FilterData *) user_data;
+
+ gtk_tree_model_get (model, iter, 0, &contact, -1);
+
+ if (contact != NULL)
+ {
+ visible = data->func(contact, data->user_data);
+
+ g_object_unref (contact);
+ }
+
+ return visible;
+
+}
+
+void
+empathy_contact_selector_set_visible (EmpathyContactSelector *selector,
+ EmpathyContactSelectorFilterFunc func,
+ gpointer user_data)
+{
+ EmpathyContactSelectorPriv *priv = GET_PRIV (selector);
+ FilterData *data;
+
+ data = g_slice_new0 (FilterData);
+ data->func = func;
+ data->user_data = user_data;
+
+ gtk_tree_model_filter_set_visible_func (GTK_TREE_MODEL_FILTER (priv->model),
+ contact_selector_filter_visible_func, data, filter_data_free);
+
+ gtk_tree_model_filter_refilter (GTK_TREE_MODEL_FILTER (priv->model));
+}