#include #include #include static GtkListStore *store; static GtkWidget *tree; #define NUM_ITEMS 100 static GtkTreeIter iters[ NUM_ITEMS ]; #define NUM_EXTRA_ITEMS 5 static GtkTreeIter extra_iters[ NUM_EXTRA_ITEMS ]; int main (int argc, char **argv) { GtkWidget *window; GtkCellRenderer *renderer; GtkTreeViewColumn *column; GtkWidget *scrolled; GtkTreePath *path; int i; gtk_init (&argc, &argv); window = gtk_window_new (GTK_WINDOW_TOPLEVEL); g_signal_connect (G_OBJECT (window), "destroy", G_CALLBACK (gtk_main_quit), 0); g_signal_connect (G_OBJECT (window), "delete_event", G_CALLBACK (gtk_main_quit), 0); gtk_widget_set_size_request (window, 400, 200); scrolled = gtk_scrolled_window_new (0, 0); store = gtk_list_store_new (1, G_TYPE_STRING); tree = gtk_tree_view_new_with_model (GTK_TREE_MODEL (store)); gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (tree), TRUE); renderer = gtk_cell_renderer_text_new (); column = gtk_tree_view_column_new_with_attributes ("Column1", renderer, "text", 0, 0); gtk_tree_view_append_column (GTK_TREE_VIEW (tree), column); gtk_container_add (GTK_CONTAINER (scrolled), tree); gtk_container_add (GTK_CONTAINER (window), scrolled); // Add 100 elements to the list. for (i = 0; i < NUM_ITEMS; i++) { char text[ 256 ]; sprintf (text, "item %d", i); gtk_list_store_append (store, &(iters[i])); gtk_list_store_set (store, &(iters[i]), 0, text, -1); } // XXX: // If the call to gtk_widget_show_all () is made, the // scroll code does not work. gtk_widget_show_all (window); // Add 5 more elements to the list. for (i = 0; i < NUM_EXTRA_ITEMS; i++) { char text[ 256 ]; sprintf (text, "item %d", i); gtk_list_store_append (store, &(extra_iters[i])); gtk_list_store_set (store, &(extra_iters[i]), 0, text, -1); } // XXX: Scroll to item 40 from the first list. path = gtk_tree_model_get_path (GTK_TREE_MODEL (store), &(iters[40])); gtk_tree_view_scroll_to_cell (GTK_TREE_VIEW (tree), path, NULL, TRUE, 0.0f, 0.0f); gtk_tree_path_free (path); gtk_widget_show_all (window); gtk_main (); return 0; }