summaryrefslogtreecommitdiff
path: root/gtk
diff options
context:
space:
mode:
authorKristian Rietveld <kris@gtk.org>2002-02-15 18:38:02 +0000
committerKristian Rietveld <kristian@src.gnome.org>2002-02-15 18:38:02 +0000
commitbaf21fbfa2cfacad32b1bf593ce81927f2ba7836 (patch)
tree5f1dd665d615c47f2dfb10a508d2363e61ee33a9 /gtk
parentd7f8af9af0e0e0364c03a7c42a593a0d3cac2e27 (diff)
downloadgtk+-baf21fbfa2cfacad32b1bf593ce81927f2ba7836.tar.gz
new function (gtk_tree_store_clear): traverse the tree, so we emit
Fri Feb 15 19:38:00 2002 Kristian Rietveld <kris@gtk.org> * gtk/gtktreestore.c (gtk_tree_store_clear_traverse): new function (gtk_tree_store_clear): traverse the tree, so we emit row_deleted for every node. This way we don't have confused row refs crashing the application. (#70631)
Diffstat (limited to 'gtk')
-rw-r--r--gtk/gtktreestore.c50
1 files changed, 42 insertions, 8 deletions
diff --git a/gtk/gtktreestore.c b/gtk/gtktreestore.c
index ebe1e6a8dc..c4497be735 100644
--- a/gtk/gtktreestore.c
+++ b/gtk/gtktreestore.c
@@ -1423,6 +1423,47 @@ gtk_tree_store_iter_depth (GtkTreeStore *tree_store,
return g_node_depth (G_NODE (iter->user_data)) - 2;
}
+/* simple ripoff from g_node_traverse_post_order */
+static gboolean
+gtk_tree_store_clear_traverse (GNode *node,
+ GtkTreeStore *store)
+{
+ GtkTreeIter iter;
+
+ if (node->children)
+ {
+ GNode *child;
+
+ child = node->children;
+ while (child)
+ {
+ register GNode *current;
+
+ current = child;
+ child = current->next;
+ if (gtk_tree_store_clear_traverse (current, store))
+ return TRUE;
+ }
+
+ if (node->parent)
+ {
+ iter.stamp = store->stamp;
+ iter.user_data = node;
+
+ gtk_tree_store_remove (store, &iter);
+ }
+ }
+ else if (node->parent)
+ {
+ iter.stamp = store->stamp;
+ iter.user_data = node;
+
+ gtk_tree_store_remove (store, &iter);
+ }
+
+ return FALSE;
+}
+
/**
* gtk_tree_store_clear:
* @tree_store: a #GtkTreeStore
@@ -1432,16 +1473,9 @@ gtk_tree_store_iter_depth (GtkTreeStore *tree_store,
void
gtk_tree_store_clear (GtkTreeStore *tree_store)
{
- GtkTreeIter iter;
-
g_return_if_fail (GTK_IS_TREE_STORE (tree_store));
- while (G_NODE (tree_store->root)->children)
- {
- iter.stamp = tree_store->stamp;
- iter.user_data = G_NODE (tree_store->root)->children;
- gtk_tree_store_remove (tree_store, &iter);
- }
+ gtk_tree_store_clear_traverse (tree_store->root, tree_store);
}
/* DND */