+
+static void
+select_first_contact (EmpathyRosterView *self)
+{
+ GList *children, *l;
+
+ children = gtk_container_get_children (GTK_CONTAINER (self));
+ for (l = children; l != NULL; l = g_list_next (l))
+ {
+ GtkWidget *child = l->data;
+
+ if (!gtk_widget_get_child_visible (child))
+ continue;
+
+ if (!EMPATHY_IS_ROSTER_CONTACT (child))
+ continue;
+
+ egg_list_box_select_child (EGG_LIST_BOX (self), child);
+ break;
+ }
+
+ g_list_free (children);
+}
+
+static void
+search_text_notify_cb (EmpathyLiveSearch *search,
+ GParamSpec *pspec,
+ EmpathyRosterView *self)
+{
+ egg_list_box_refilter (EGG_LIST_BOX (self));
+
+ select_first_contact (self);
+}
+
+static void
+search_activate_cb (GtkWidget *search,
+ EmpathyRosterView *self)
+{
+ /* TODO */
+}
+
+void
+empathy_roster_view_set_live_search (EmpathyRosterView *self,
+ EmpathyLiveSearch *search)
+{
+ if (self->priv->search != NULL)
+ {
+ g_signal_handlers_disconnect_by_func (self->priv->search,
+ search_text_notify_cb, self);
+ g_signal_handlers_disconnect_by_func (self->priv->search,
+ search_activate_cb, self);
+
+ g_clear_object (&self->priv->search);
+ }
+
+ if (search == NULL)
+ return;
+
+ self->priv->search = g_object_ref (search);
+
+ g_signal_connect (self->priv->search, "notify::text",
+ G_CALLBACK (search_text_notify_cb), self);
+ g_signal_connect (self->priv->search, "activate",
+ G_CALLBACK (search_activate_cb), self);
+}