summaryrefslogtreecommitdiff
path: root/gtk/gtktreeview.c
diff options
context:
space:
mode:
authorMatthias Clasen <mclasen@redhat.com>2005-11-27 20:36:15 +0000
committerMatthias Clasen <matthiasc@src.gnome.org>2005-11-27 20:36:15 +0000
commit7014ef00329ee58c9de30ea7e45eebc191498a00 (patch)
treeb04abef1b8dc9833f1506937b7e89ed62f77ddc7 /gtk/gtktreeview.c
parent66627293010520847dc964af67fd68e23b3c0275 (diff)
downloadgtk+-7014ef00329ee58c9de30ea7e45eebc191498a00.tar.gz
Fix two memory handling problems in GtkTreeView: (#322350, Søren
2005-11-27 Matthias Clasen <mclasen@redhat.com> Fix two memory handling problems in GtkTreeView: (#322350, Søren Sandmann) * gtk/gtktreeview.c (gtk_tree_view_destroy) (gtk_tree_view_set_model): Remove all references to nodes in the old model. (gtk_tree_view_real_collapse_row): Unmark expanded_collapsed_node before removing the children.
Diffstat (limited to 'gtk/gtktreeview.c')
-rw-r--r--gtk/gtktreeview.c44
1 files changed, 25 insertions, 19 deletions
diff --git a/gtk/gtktreeview.c b/gtk/gtktreeview.c
index baa2386235..fac7393a34 100644
--- a/gtk/gtktreeview.c
+++ b/gtk/gtktreeview.c
@@ -1314,6 +1314,20 @@ gtk_tree_view_finalize (GObject *object)
*/
static void
+gtk_tree_view_free_rbtree (GtkTreeView *tree_view)
+{
+ _gtk_rbtree_free (tree_view->priv->tree);
+
+ tree_view->priv->tree = NULL;
+ tree_view->priv->button_pressed_node = NULL;
+ tree_view->priv->button_pressed_tree = NULL;
+ tree_view->priv->prelight_tree = NULL;
+ tree_view->priv->prelight_node = NULL;
+ tree_view->priv->expanded_collapsed_node = NULL;
+ tree_view->priv->expanded_collapsed_tree = NULL;
+}
+
+static void
gtk_tree_view_destroy (GtkObject *object)
{
GtkTreeView *tree_view = GTK_TREE_VIEW (object);
@@ -1337,8 +1351,8 @@ gtk_tree_view_destroy (GtkObject *object)
if (tree_view->priv->tree != NULL)
{
gtk_tree_view_unref_and_check_selection_tree (tree_view, tree_view->priv->tree);
- _gtk_rbtree_free (tree_view->priv->tree);
- tree_view->priv->tree = NULL;
+
+ gtk_tree_view_free_rbtree (tree_view);
}
if (tree_view->priv->selection != NULL)
@@ -9464,15 +9478,7 @@ gtk_tree_view_set_model (GtkTreeView *tree_view,
tree_view->priv->model);
if (tree_view->priv->tree)
- {
- _gtk_rbtree_free (tree_view->priv->tree);
- tree_view->priv->tree = NULL;
- }
-
- tree_view->priv->prelight_node = NULL;
- tree_view->priv->prelight_tree = NULL;
- tree_view->priv->button_pressed_node = NULL;
- tree_view->priv->button_pressed_tree = NULL;
+ gtk_tree_view_free_rbtree (tree_view);
gtk_tree_row_reference_free (tree_view->priv->drag_dest_row);
tree_view->priv->drag_dest_row = NULL;
@@ -10966,6 +10972,14 @@ gtk_tree_view_real_collapse_row (GtkTreeView *tree_view,
gtk_tree_path_free (lsc);
}
+ if (tree_view->priv->expanded_collapsed_node != NULL)
+ {
+ GTK_RBNODE_UNSET_FLAG (tree_view->priv->expanded_collapsed_node, GTK_RBNODE_IS_SEMI_EXPANDED);
+ GTK_RBNODE_UNSET_FLAG (tree_view->priv->expanded_collapsed_node, GTK_RBNODE_IS_SEMI_COLLAPSED);
+
+ tree_view->priv->expanded_collapsed_node = NULL;
+ }
+
if (gtk_tree_view_unref_and_check_selection_tree (tree_view, node->children))
{
_gtk_rbtree_remove (node->children);
@@ -10980,14 +10994,6 @@ gtk_tree_view_real_collapse_row (GtkTreeView *tree_view,
tree_view->priv->expand_collapse_timeout = 0;
}
- if (tree_view->priv->expanded_collapsed_node != NULL)
- {
- GTK_RBNODE_UNSET_FLAG (tree_view->priv->expanded_collapsed_node, GTK_RBNODE_IS_SEMI_EXPANDED);
- GTK_RBNODE_UNSET_FLAG (tree_view->priv->expanded_collapsed_node, GTK_RBNODE_IS_SEMI_COLLAPSED);
-
- tree_view->priv->expanded_collapsed_node = NULL;
- }
-
if (animate)
{
tree_view->priv->expand_collapse_timeout = g_timeout_add (50, expand_collapse_timeout, tree_view);