#include #include #include static int timediff( struct timeval *large, struct timeval *small ) { return ( ( ( large->tv_sec * 1000 * 1000 ) + large->tv_usec ) - ( ( small->tv_sec * 1000 * 1000 ) + small->tv_usec ) ); } static void foreach_func (GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter, gpointer data) { } static void tree_selection_changed_cb (GtkTreeSelection *selection, gpointer data) { GtkWidget *tree = (GtkWidget *) data; struct timeval before, after; gettimeofday (&before, 0); gtk_tree_selection_get_selected_rows (selection, 0); gettimeofday (&after, 0); fprintf (stderr, "gtk_tree_selection_get_selected_rows: %d\n", timediff (&after, &before)); gettimeofday (&before, 0); gtk_tree_selection_selected_foreach (selection, foreach_func, tree); gettimeofday (&after, 0); fprintf (stderr, "gtk_tree_selection_selected_foreach: %d\n", timediff (&after, &before)); } int main (int argc, char **argv) { GtkWidget *window, *tree, *scrolled, *vbox; GtkListStore *store; GtkCellRenderer *renderer; GtkTreeViewColumn *column; GtkTreeIter iter; GtkTreeSelection *select; 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); vbox = gtk_vbox_new (FALSE, 0); 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), FALSE); renderer = gtk_cell_renderer_text_new (); column = gtk_tree_view_column_new_with_attributes ("Column1", renderer, "text", 0, 0); gtk_tree_view_column_set_sizing (column, GTK_TREE_VIEW_COLUMN_FIXED); gtk_tree_view_column_set_min_width (column, 40); gtk_tree_view_append_column (GTK_TREE_VIEW (tree), column); g_object_set (tree, "fixed-height-mode", TRUE, NULL); gtk_container_add (GTK_CONTAINER (scrolled), tree); gtk_container_add (GTK_CONTAINER (vbox), scrolled); gtk_container_add (GTK_CONTAINER (window), vbox); for (i = 0; i < 100000; i++) { gtk_list_store_append (store, &iter); gtk_list_store_set (store, &iter, 0, "Item", -1); } gtk_widget_set_size_request (window, 800, 600); gtk_widget_show_all (window); select = gtk_tree_view_get_selection (GTK_TREE_VIEW (tree)); gtk_tree_selection_set_mode (select, GTK_SELECTION_MULTIPLE); g_signal_connect (G_OBJECT (select), "changed", G_CALLBACK (tree_selection_changed_cb), tree); gtk_main (); return 0; }