From: Jonathan Blandford Date: Sat, 9 Feb 2002 01:28:00 +0000 (+0000) Subject: fix evil ref bug where the wrong row and a deleted row was unreffed. Found X-Git-Url: http://pileus.org/git/?a=commitdiff_plain;h=d243e3ec4a73c9c268e44d38e09d9ede168bbb9c;p=~andy%2Fgtk fix evil ref bug where the wrong row and a deleted row was unreffed. Found Fri Feb 8 21:25:56 2002 Jonathan Blandford * gtk/gtktreemodelsort.c (gtk_tree_model_sort_row_deleted): fix evil ref bug where the wrong row and a deleted row was unreffed. Found by Darin Adler --- diff --git a/ChangeLog b/ChangeLog index 5ca1ee06e..9fc3db38e 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +Fri Feb 8 21:25:56 2002 Jonathan Blandford + + * gtk/gtktreemodelsort.c (gtk_tree_model_sort_row_deleted): fix + evil ref bug where the wrong row and a deleted row was unreffed. + Found by Darin Adler + Fri Feb 8 18:46:13 2002 Owen Taylor * gtk/gtkbindings.[ch] (_gtk_binding_reset_parsed): Add diff --git a/ChangeLog.pre-2-0 b/ChangeLog.pre-2-0 index 5ca1ee06e..9fc3db38e 100644 --- a/ChangeLog.pre-2-0 +++ b/ChangeLog.pre-2-0 @@ -1,3 +1,9 @@ +Fri Feb 8 21:25:56 2002 Jonathan Blandford + + * gtk/gtktreemodelsort.c (gtk_tree_model_sort_row_deleted): fix + evil ref bug where the wrong row and a deleted row was unreffed. + Found by Darin Adler + Fri Feb 8 18:46:13 2002 Owen Taylor * gtk/gtkbindings.[ch] (_gtk_binding_reset_parsed): Add diff --git a/ChangeLog.pre-2-10 b/ChangeLog.pre-2-10 index 5ca1ee06e..9fc3db38e 100644 --- a/ChangeLog.pre-2-10 +++ b/ChangeLog.pre-2-10 @@ -1,3 +1,9 @@ +Fri Feb 8 21:25:56 2002 Jonathan Blandford + + * gtk/gtktreemodelsort.c (gtk_tree_model_sort_row_deleted): fix + evil ref bug where the wrong row and a deleted row was unreffed. + Found by Darin Adler + Fri Feb 8 18:46:13 2002 Owen Taylor * gtk/gtkbindings.[ch] (_gtk_binding_reset_parsed): Add diff --git a/ChangeLog.pre-2-2 b/ChangeLog.pre-2-2 index 5ca1ee06e..9fc3db38e 100644 --- a/ChangeLog.pre-2-2 +++ b/ChangeLog.pre-2-2 @@ -1,3 +1,9 @@ +Fri Feb 8 21:25:56 2002 Jonathan Blandford + + * gtk/gtktreemodelsort.c (gtk_tree_model_sort_row_deleted): fix + evil ref bug where the wrong row and a deleted row was unreffed. + Found by Darin Adler + Fri Feb 8 18:46:13 2002 Owen Taylor * gtk/gtkbindings.[ch] (_gtk_binding_reset_parsed): Add diff --git a/ChangeLog.pre-2-4 b/ChangeLog.pre-2-4 index 5ca1ee06e..9fc3db38e 100644 --- a/ChangeLog.pre-2-4 +++ b/ChangeLog.pre-2-4 @@ -1,3 +1,9 @@ +Fri Feb 8 21:25:56 2002 Jonathan Blandford + + * gtk/gtktreemodelsort.c (gtk_tree_model_sort_row_deleted): fix + evil ref bug where the wrong row and a deleted row was unreffed. + Found by Darin Adler + Fri Feb 8 18:46:13 2002 Owen Taylor * gtk/gtkbindings.[ch] (_gtk_binding_reset_parsed): Add diff --git a/ChangeLog.pre-2-6 b/ChangeLog.pre-2-6 index 5ca1ee06e..9fc3db38e 100644 --- a/ChangeLog.pre-2-6 +++ b/ChangeLog.pre-2-6 @@ -1,3 +1,9 @@ +Fri Feb 8 21:25:56 2002 Jonathan Blandford + + * gtk/gtktreemodelsort.c (gtk_tree_model_sort_row_deleted): fix + evil ref bug where the wrong row and a deleted row was unreffed. + Found by Darin Adler + Fri Feb 8 18:46:13 2002 Owen Taylor * gtk/gtkbindings.[ch] (_gtk_binding_reset_parsed): Add diff --git a/ChangeLog.pre-2-8 b/ChangeLog.pre-2-8 index 5ca1ee06e..9fc3db38e 100644 --- a/ChangeLog.pre-2-8 +++ b/ChangeLog.pre-2-8 @@ -1,3 +1,9 @@ +Fri Feb 8 21:25:56 2002 Jonathan Blandford + + * gtk/gtktreemodelsort.c (gtk_tree_model_sort_row_deleted): fix + evil ref bug where the wrong row and a deleted row was unreffed. + Found by Darin Adler + Fri Feb 8 18:46:13 2002 Owen Taylor * gtk/gtkbindings.[ch] (_gtk_binding_reset_parsed): Add diff --git a/gtk/gtkliststore.h b/gtk/gtkliststore.h index 7f5d1eec1..93ebaf98d 100644 --- a/gtk/gtkliststore.h +++ b/gtk/gtkliststore.h @@ -71,6 +71,9 @@ GtkListStore *gtk_list_store_newv (gint n_columns, void gtk_list_store_set_column_types (GtkListStore *list_store, gint n_columns, GType *types); + +/* NOTE: use gtk_tree_model_get to get values from a GtkListStore */ + void gtk_list_store_set_value (GtkListStore *list_store, GtkTreeIter *iter, gint column, diff --git a/gtk/gtktreemodelsort.c b/gtk/gtktreemodelsort.c index 96d8bd644..e9fe17246 100644 --- a/gtk/gtktreemodelsort.c +++ b/gtk/gtktreemodelsort.c @@ -168,6 +168,9 @@ static gboolean gtk_tree_model_sort_iter_parent (GtkTreeModel GtkTreeIter *child); static void gtk_tree_model_sort_ref_node (GtkTreeModel *tree_model, GtkTreeIter *iter); +static void gtk_tree_model_sort_real_unref_node (GtkTreeModel *tree_model, + GtkTreeIter *iter, + gboolean propagate_unref); static void gtk_tree_model_sort_unref_node (GtkTreeModel *tree_model, GtkTreeIter *iter); @@ -686,21 +689,22 @@ gtk_tree_model_sort_row_deleted (GtkTreeModel *s_model, elt = SORT_ELT (iter.user_data2); offset = elt->offset; - gtk_tree_model_sort_increment_stamp (tree_model_sort); - gtk_tree_model_row_deleted (GTK_TREE_MODEL (data), path); - while (elt->ref_count > 0) - gtk_tree_model_sort_unref_node (GTK_TREE_MODEL (data), &iter); + gtk_tree_model_sort_real_unref_node (GTK_TREE_MODEL (data), &iter, FALSE); if (level->ref_count == 0 && level != tree_model_sort->root) { /* This will prune the level, so I can just emit the signal and not worry * about cleaning this level up. */ - + gtk_tree_model_sort_increment_stamp (tree_model_sort); + gtk_tree_model_row_deleted (GTK_TREE_MODEL (data), path); gtk_tree_path_free (path); return; } + gtk_tree_model_sort_increment_stamp (tree_model_sort); + gtk_tree_model_row_deleted (GTK_TREE_MODEL (data), path); + /* Remove the row */ for (i = 0; i < level->array->len; i++) if (elt->offset == g_array_index (level->array, SortElt, i).offset) @@ -1131,8 +1135,9 @@ gtk_tree_model_sort_ref_node (GtkTreeModel *tree_model, } static void -gtk_tree_model_sort_unref_node (GtkTreeModel *tree_model, - GtkTreeIter *iter) +gtk_tree_model_sort_real_unref_node (GtkTreeModel *tree_model, + GtkTreeIter *iter, + gboolean propagate_unref) { GtkTreeModelSort *tree_model_sort = (GtkTreeModelSort *) tree_model; GtkTreeIter child_iter; @@ -1145,7 +1150,8 @@ gtk_tree_model_sort_unref_node (GtkTreeModel *tree_model, GET_CHILD_ITER (tree_model, &child_iter, iter); - gtk_tree_model_unref_node (GTK_TREE_MODEL_SORT (tree_model)->child_model, &child_iter); + if (propagate_unref) + gtk_tree_model_unref_node (GTK_TREE_MODEL_SORT (tree_model)->child_model, &child_iter); level = iter->user_data; elt = iter->user_data2; @@ -1171,6 +1177,13 @@ gtk_tree_model_sort_unref_node (GtkTreeModel *tree_model, } } +static void +gtk_tree_model_sort_unref_node (GtkTreeModel *tree_model, + GtkTreeIter *iter) +{ + gtk_tree_model_sort_real_unref_node (tree_model, iter, TRUE); +} + /* Sortable interface */ static gboolean gtk_tree_model_sort_get_sort_column_id (GtkTreeSortable *sortable, diff --git a/gtk/gtktreestore.h b/gtk/gtktreestore.h index faa103ae6..e7fdff9a9 100644 --- a/gtk/gtktreestore.h +++ b/gtk/gtktreestore.h @@ -70,6 +70,9 @@ GtkTreeStore *gtk_tree_store_newv (gint n_columns, void gtk_tree_store_set_column_types (GtkTreeStore *tree_store, gint n_columns, GType *types); + +/* NOTE: use gtk_tree_model_get to get values from a GtkTreeStore */ + void gtk_tree_store_set_value (GtkTreeStore *tree_store, GtkTreeIter *iter, gint column,