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;
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);
}
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);
GdkEventKey *event,
gpointer user_data)
{
- if (event->keyval == GDK_Menu) {
+ if (event->keyval == GDK_KEY_Menu) {
MenuPopupData *data;
data = g_slice_new (MenuPopupData);
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);
}
}
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);
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
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;
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);
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);