Package: libgtk2.0-0 Version: 2.6.2-4 Severity: important The number of selected rows in a GtkTreeVew is incorrect in "cursor-changed" callback when rows are selected with a modefier - Ctrl or Shift. This problem does not happen when rows are selected without a modifier or when number of selected rows is reported in another callback.
By the look of it, when modifiers are used the selection is made before the collback but GtkTreeSelection of the GtkTreeView is updated after. Unfortunately, I'm not familiar with libgtk2.0 internals to know for sure. Attached is a small program showing the problem. Hope it helps, Igor -- System Information: Debian Release: 3.1 APT prefers unstable APT policy: (500, 'unstable') Architecture: i386 (i686) Kernel: Linux 2.6.11 Locale: LANG=C, LC_CTYPE=ru_RU.KOI8-R (charmap=KOI8-R) Versions of packages libgtk2.0-0 depends on: ii libatk1.0-0 1.8.0-4 The ATK accessibility toolkit ii libc6 2.3.2.ds1-20 GNU C Library: Shared libraries an ii libfontconfig1 2.3.1-2 generic font configuration library ii libfreetype6 2.1.7-2.3 FreeType 2 font engine, shared lib ii libglib2.0-0 2.6.3-1 The GLib library of C routines ii libgtk2.0-bin 2.6.2-4 The programs for the GTK+ graphica ii libgtk2.0-common 2.6.2-4 Common files for the GTK+ graphica ii libjpeg62 6b-10 The Independent JPEG Group's JPEG ii libpango1.0-0 1.8.1-1 Layout and rendering of internatio ii libpng12-0 1.2.8rel-1 PNG library - runtime ii libtiff4 3.7.2-1 Tag Image File Format (TIFF) libra ii libx11-6 4.3.0.dfsg.1-12.0.1 X Window System protocol client li ii libxcursor1 1.1.3-1 X cursor management library ii libxext6 4.3.0.dfsg.1-12.0.1 X Window System miscellaneous exte ii libxft2 2.1.2-6 FreeType-based font drawing librar ii libxi6 4.3.0.dfsg.1-12.0.1 X Window System Input extension li ii libxrandr2 4.3.0.dfsg.1-12.0.1 X Window System Resize, Rotate and ii libxrender1 0.8.3-7 X Rendering Extension client libra ii xlibs 4.3.0.dfsg.1-12 X Keyboard Extension (XKB) configu ii zlib1g 1:1.2.2-4 compression library - runtime -- no debconf information
/* * Compilation instruction: * gcc -o treeview-bug treeview-bug.c `pkg-config --cflags --libs gtk+-2.0` * * Bug reproduction: * Hold <Ctrl> or <Shift> and click mouse buttons to select columns. * Compare the number of selected columns you see with the print out * from the "cursor-changed" callback. */ #include <stdio.h> #include <gtk/gtk.h> static void show_rows(GtkTreeView *treeview, gpointer data) { GtkTreeSelection *selection = gtk_tree_view_get_selection(treeview); printf("Selected %d rows\n", gtk_tree_selection_count_selected_rows(selection)); } int main(int argc, char *argv[]) { GtkWidget *window; GtkListStore *liststore; GtkTreeIter iter; GtkCellRenderer *renderer; GtkTreeViewColumn *column; GtkWidget *treeview; gtk_set_locale (); gtk_init (&argc, &argv); window = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_window_set_title(GTK_WINDOW(window), "Bug report"); g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL); liststore = gtk_list_store_new(2, G_TYPE_STRING, G_TYPE_STRING); gtk_list_store_append(liststore, &iter); gtk_list_store_set(liststore, &iter, 0, "One", 1, "Over there", -1); gtk_list_store_append(liststore, &iter); gtk_list_store_set(liststore, &iter, 0, "Two", 1, "Right here", -1); treeview = gtk_tree_view_new_with_model(GTK_TREE_MODEL(liststore)); g_signal_connect(treeview, "cursor-changed", G_CALLBACK(show_rows), NULL); gtk_tree_selection_set_mode(gtk_tree_view_get_selection(GTK_TREE_VIEW(treeview)), GTK_SELECTION_MULTIPLE); renderer = gtk_cell_renderer_text_new (); column = gtk_tree_view_column_new_with_attributes("What", renderer, "text", 0, NULL); gtk_tree_view_append_column (GTK_TREE_VIEW(treeview), column); renderer = gtk_cell_renderer_text_new (); column = gtk_tree_view_column_new_with_attributes("Where", renderer, "text", 1, NULL); gtk_tree_view_append_column (GTK_TREE_VIEW(treeview), column); gtk_container_add(GTK_CONTAINER(window), treeview); gtk_widget_show_all(window); gtk_main(); return 0; }