+static void
+search_activate_cb (GtkEntry *entry,
+ EmpathyContactChooser *self)
+{
+ g_signal_emit (self, signals[SIG_ACTIVATE], 0);
+}
+
+static void
+view_activate_cb (GtkTreeView *view,
+ GtkTreePath *path,
+ GtkTreeViewColumn *column,
+ EmpathyContactChooser *self)
+{
+ g_signal_emit (self, signals[SIG_ACTIVATE], 0);
+}
+
+static gboolean
+search_key_press_cb (GtkEntry *entry,
+ GdkEventKey *event,
+ EmpathyContactChooser *self)
+{
+ GtkTreeSelection *selection;
+ GtkTreeModel *model;
+ GtkTreeIter iter;
+
+ if (event->state != 0)
+ return FALSE;
+
+ switch (event->keyval)
+ {
+ case GDK_KEY_Down:
+ case GDK_KEY_KP_Down:
+ case GDK_KEY_Up:
+ case GDK_KEY_KP_Up:
+ break;
+
+ default:
+ return FALSE;
+ }
+
+ selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (self->priv->view));
+
+ if (!gtk_tree_selection_get_selected (selection, &model, &iter))
+ return TRUE;
+
+ switch (event->keyval)
+ {
+ case GDK_KEY_Down:
+ case GDK_KEY_KP_Down:
+ if (!gtk_tree_model_iter_next (model, &iter))
+ return TRUE;
+
+ break;
+
+ case GDK_KEY_Up:
+ case GDK_KEY_KP_Up:
+ if (!gtk_tree_model_iter_previous (model, &iter))
+ return TRUE;
+
+ break;
+
+ default:
+ g_assert_not_reached ();
+ }
+
+ gtk_tree_selection_select_iter (selection, &iter);
+
+ return TRUE;
+}
+