static gboolean keynav_failed (GtkWidget *view, GtkDirectionType direction, Views *views) { GtkTreePath *path; GtkTreeModel *model; GtkTreeIter iter; gint col; GtkTreePath *sel; if (view == views->view1 && direction == GTK_DIR_DOWN) { if (gtk_icon_view_get_cursor (GTK_ICON_VIEW (views->view1), &path, NULL)) { col = gtk_icon_view_get_item_column (GTK_ICON_VIEW (views->view1), path); gtk_tree_path_free (path); sel = NULL; model = gtk_icon_view_get_model (GTK_ICON_VIEW (views->view2)); gtk_tree_model_get_iter_first (model, &iter); do { path = gtk_tree_model_get_path (model, &iter); if (gtk_icon_view_get_item_column (GTK_ICON_VIEW (views->view2), path) == col) { sel = path; break; } } while (gtk_tree_model_iter_next (model, &iter)); gtk_icon_view_set_cursor (GTK_ICON_VIEW (views->view2), sel, NULL, FALSE); gtk_tree_path_free (sel); } gtk_widget_grab_focus (views->view2); return TRUE; } if (view == views->view2 && direction == GTK_DIR_UP) { if (gtk_icon_view_get_cursor (GTK_ICON_VIEW (views->view2), &path, NULL)) { col = gtk_icon_view_get_item_column (GTK_ICON_VIEW (views->view2), path); gtk_tree_path_free (path); sel = NULL; model = gtk_icon_view_get_model (GTK_ICON_VIEW (views->view1)); gtk_tree_model_get_iter_first (model, &iter); do { path = gtk_tree_model_get_path (model, &iter); if (gtk_icon_view_get_item_column (GTK_ICON_VIEW (views->view1), path) == col) { if (sel) gtk_tree_path_free (sel); sel = path; } else gtk_tree_path_free (path); } while (gtk_tree_model_iter_next (model, &iter)); gtk_icon_view_set_cursor (GTK_ICON_VIEW (views->view1), sel, NULL, FALSE); gtk_tree_path_free (sel); } gtk_widget_grab_focus (views->view1); return TRUE; } return FALSE; }
static gboolean keynav_failed (GtkIconView *current_view, GtkDirectionType direction, GnomeControlCenter *shell) { GList *views, *v; GtkIconView *new_view; GtkTreePath *path; GtkTreeModel *model; GtkTreeIter iter; gint col, c, dist, d; GtkTreePath *sel; gboolean res; res = FALSE; views = get_item_views (shell); for (v = views; v; v = v->next) { if (v->data == current_view) break; } if (direction == GTK_DIR_DOWN && v != NULL && v->next != NULL) { new_view = v->next->data; if (gtk_icon_view_get_cursor (current_view, &path, NULL)) { col = gtk_icon_view_get_item_column (current_view, path); gtk_tree_path_free (path); sel = NULL; dist = 1000; model = gtk_icon_view_get_model (new_view); gtk_tree_model_get_iter_first (model, &iter); do { path = gtk_tree_model_get_path (model, &iter); c = gtk_icon_view_get_item_column (new_view, path); d = ABS (c - col); if (d < dist) { if (sel) gtk_tree_path_free (sel); sel = path; dist = d; } else gtk_tree_path_free (path); } while (gtk_tree_model_iter_next (model, &iter)); gtk_icon_view_set_cursor (new_view, sel, NULL, FALSE); gtk_tree_path_free (sel); } gtk_widget_grab_focus (GTK_WIDGET (new_view)); res = TRUE; } if (direction == GTK_DIR_UP && v != NULL && v->prev != NULL) { new_view = v->prev->data; if (gtk_icon_view_get_cursor (current_view, &path, NULL)) { col = gtk_icon_view_get_item_column (current_view, path); gtk_tree_path_free (path); sel = NULL; dist = 1000; model = gtk_icon_view_get_model (new_view); gtk_tree_model_get_iter_first (model, &iter); do { path = gtk_tree_model_get_path (model, &iter); c = gtk_icon_view_get_item_column (new_view, path); d = ABS (c - col); if (d <= dist) { if (sel) gtk_tree_path_free (sel); sel = path; dist = d; } else gtk_tree_path_free (path); } while (gtk_tree_model_iter_next (model, &iter)); gtk_icon_view_set_cursor (new_view, sel, NULL, FALSE); gtk_tree_path_free (sel); } gtk_widget_grab_focus (GTK_WIDGET (new_view)); res = TRUE; } g_list_free (views); return res; }