]> git.0d.be Git - empathy.git/blobdiff - libempathy-gtk/empathy-contact-list-view.c
Merge branch 'sasl'
[empathy.git] / libempathy-gtk / empathy-contact-list-view.c
index c9fc1c595e682b6d16dbc3d53f6ef1db7e05cf48..1b11309f3f150efd8047dab08b48afd3479ec152 100644 (file)
@@ -152,7 +152,7 @@ contact_list_view_is_visible_contact (EmpathyContactListView *self,
        g_assert (live != NULL);
 
        /* check alias name */
-       str = empathy_contact_get_name (contact);
+       str = empathy_contact_get_alias (contact);
        if (empathy_live_search_match (live, str))
                return TRUE;
 
@@ -763,11 +763,9 @@ contact_list_view_drag_data_get (GtkWidget        *widget,
        g_object_unref (contact);
        str = g_strconcat (account_id, ":", contact_id, NULL);
 
-       switch (info) {
-       case DND_DRAG_TYPE_CONTACT_ID:
+       if (info == DND_DRAG_TYPE_CONTACT_ID) {
                gtk_selection_data_set (selection, drag_atoms_source[info], 8,
                                        (guchar *) str, strlen (str) + 1);
-               break;
        }
 
        g_free (str);
@@ -818,8 +816,6 @@ contact_list_view_popup_menu_idle_cb (gpointer user_data)
        }
 
        if (menu) {
-               g_signal_connect (menu, "deactivate",
-                                 G_CALLBACK (gtk_menu_detach), NULL);
                gtk_menu_attach_to_widget (GTK_MENU (menu),
                                           GTK_WIDGET (data->view), NULL);
                gtk_widget_show (menu);
@@ -858,7 +854,7 @@ contact_list_view_key_press_event_cb (EmpathyContactListView *view,
                                      GdkEventKey            *event,
                                      gpointer                user_data)
 {
-       if (event->keyval == GDK_Menu) {
+       if (event->keyval == GDK_KEY_Menu) {
                MenuPopupData *data;
 
                data = g_slice_new (MenuPopupData);
@@ -894,7 +890,7 @@ contact_list_view_row_activated (GtkTreeView       *view,
        if (contact) {
                DEBUG ("Starting a chat");
                empathy_dispatcher_chat_with_contact (contact,
-                       gtk_get_current_event_time (), NULL, NULL);
+                       gtk_get_current_event_time ());
                g_object_unref (contact);
        }
 }
@@ -938,8 +934,6 @@ contact_list_view_call_activated_cb (
        gtk_menu_shell_append (shell, item);
        gtk_widget_show (item);
 
-       g_signal_connect (menu, "deactivate",
-                         G_CALLBACK (gtk_menu_detach), NULL);
        gtk_menu_attach_to_widget (GTK_MENU (menu),
                                   GTK_WIDGET (view), NULL);
        gtk_widget_show (menu);
@@ -1213,8 +1207,89 @@ 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 gboolean
+contact_list_view_search_key_navigation_cb (GtkWidget *search,
+                                           GdkEvent *event,
+                                           EmpathyContactListView *view)
+{
+       GdkEventKey *eventkey = ((GdkEventKey *) event);
+       gboolean ret = FALSE;
+
+       if (eventkey->keyval == GDK_KEY_Up || eventkey->keyval == GDK_KEY_Down) {
+               GdkEvent *new_event;
+
+               new_event = gdk_event_copy (event);
+               gtk_widget_grab_focus (GTK_WIDGET (view));
+               ret = gtk_widget_event (GTK_WIDGET (view), new_event);
+               gtk_widget_grab_focus (search);
+
+               gdk_event_free (new_event);
+       }
+
+       return ret;
 }
 
 static void
@@ -2004,7 +2079,7 @@ contact_list_view_remove_activate_cb (GtkMenuItem            *menuitem,
 
                parent = empathy_get_toplevel_window (GTK_WIDGET (view));
                text = g_strdup_printf (_("Do you really want to remove the contact '%s'?"),
-                                       empathy_contact_get_name (contact));
+                                       empathy_contact_get_alias (contact));
                if (contact_list_view_remove_dialog_show (parent, _("Removing contact"), text)) {
                        EmpathyContactList *list;
 
@@ -2081,6 +2156,12 @@ empathy_contact_list_view_set_live_search (EmpathyContactListView *view,
                g_signal_handlers_disconnect_by_func (priv->search_widget,
                        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_key_navigation_cb,
+                       view);
                g_signal_handlers_disconnect_by_func (priv->search_widget,
                        contact_list_view_search_hide_cb,
                        view);
@@ -2102,6 +2183,12 @@ 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, "key-navigation",
+                       G_CALLBACK (contact_list_view_search_key_navigation_cb),
+                       view);
                g_signal_connect (priv->search_widget, "hide",
                        G_CALLBACK (contact_list_view_search_hide_cb),
                        view);