[empathy] Make sure taping ENTER when searching contact starts a chat.
- From: Xavier Claessens <xclaesse src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [empathy] Make sure taping ENTER when searching contact starts a chat.
- Date: Mon, 21 Jun 2010 15:16:56 +0000 (UTC)
commit 23347330b2a4859f7e1af042d00d54ba1c4d5b15
Author: Xavier Claessens <xclaesse gmail com>
Date: Mon Jun 21 17:03:45 2010 +0200
Make sure taping ENTER when searching contact starts a chat.
Make sure there is always a contact selected when live search is active, and
activate its row when the live search is activated
libempathy-gtk/empathy-contact-list-view.c | 65 ++++++++++++++++++++++++++++
1 files changed, 65 insertions(+), 0 deletions(-)
---
diff --git a/libempathy-gtk/empathy-contact-list-view.c b/libempathy-gtk/empathy-contact-list-view.c
index c9fc1c5..c6099d9 100644
--- a/libempathy-gtk/empathy-contact-list-view.c
+++ b/libempathy-gtk/empathy-contact-list-view.c
@@ -1213,8 +1213,67 @@ contact_list_view_search_text_notify_cb (EmpathyLiveSearch *search,
EmpathyContactListView *view)
{
EmpathyContactListViewPriv *priv = GET_PRIV (view);
+ GtkTreePath *path;
+ GtkTreeViewColumn *focus_column;
+ GtkTreeModel *model;
+ GtkTreeIter iter;
+ gboolean set_cursor = FALSE;
gtk_tree_model_filter_refilter (priv->filter);
+
+ /* Set cursor on the first contact. If it is already set on a group,
+ * set it on its first child contact. Note that first child of a group
+ * is its separator, that's why we actually set to the 2nd
+ */
+
+ model = gtk_tree_view_get_model (GTK_TREE_VIEW (view));
+ gtk_tree_view_get_cursor (GTK_TREE_VIEW (view), &path, &focus_column);
+
+ if (path == NULL) {
+ path = gtk_tree_path_new_from_string ("0:1");
+ set_cursor = TRUE;
+ } else if (gtk_tree_path_get_depth (path) < 2) {
+ gboolean is_group;
+
+ gtk_tree_model_get_iter (model, &iter, path);
+ gtk_tree_model_get (model, &iter,
+ EMPATHY_CONTACT_LIST_STORE_COL_IS_GROUP, &is_group,
+ -1);
+
+ if (is_group) {
+ gtk_tree_path_down (path);
+ gtk_tree_path_next (path);
+ set_cursor = TRUE;
+ }
+ }
+
+ if (set_cursor) {
+ /* FIXME: Workaround for GTK bug #621651, we have to make sure
+ * the path is valid. */
+ if (gtk_tree_model_get_iter (model, &iter, path)) {
+ gtk_tree_view_set_cursor (GTK_TREE_VIEW (view), path,
+ focus_column, FALSE);
+ }
+ }
+
+ gtk_tree_path_free (path);
+}
+
+static void
+contact_list_view_search_activate_cb (GtkWidget *search,
+ EmpathyContactListView *view)
+{
+ GtkTreePath *path;
+ GtkTreeViewColumn *focus_column;
+
+ gtk_tree_view_get_cursor (GTK_TREE_VIEW (view), &path, &focus_column);
+ if (path != NULL) {
+ gtk_tree_view_row_activated (GTK_TREE_VIEW (view), path,
+ focus_column);
+ gtk_tree_path_free (path);
+
+ gtk_widget_hide (search);
+ }
}
static void
@@ -2082,6 +2141,9 @@ empathy_contact_list_view_set_live_search (EmpathyContactListView *view,
contact_list_view_search_text_notify_cb,
view);
g_signal_handlers_disconnect_by_func (priv->search_widget,
+ contact_list_view_search_activate_cb,
+ view);
+ g_signal_handlers_disconnect_by_func (priv->search_widget,
contact_list_view_search_hide_cb,
view);
g_signal_handlers_disconnect_by_func (priv->search_widget,
@@ -2102,6 +2164,9 @@ empathy_contact_list_view_set_live_search (EmpathyContactListView *view,
g_signal_connect (priv->search_widget, "notify::text",
G_CALLBACK (contact_list_view_search_text_notify_cb),
view);
+ g_signal_connect (priv->search_widget, "activate",
+ G_CALLBACK (contact_list_view_search_activate_cb),
+ view);
g_signal_connect (priv->search_widget, "hide",
G_CALLBACK (contact_list_view_search_hide_cb),
view);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]