summaryrefslogtreecommitdiff
path: root/gtk/gtktree.c
diff options
context:
space:
mode:
authorTim Janik <timj@src.gnome.org>1998-01-30 23:47:09 +0000
committerTim Janik <timj@src.gnome.org>1998-01-30 23:47:09 +0000
commit4af33fa24df69f335f07f43e5904a766c8d8ec97 (patch)
treeccc23ba16332f44ae45418f6cf9580036c4c76da /gtk/gtktree.c
parentee7038f9fddd0213c65474e5d59609107caed7c6 (diff)
downloadgdk-pixbuf-4af33fa24df69f335f07f43e5904a766c8d8ec97.tar.gz
hm, initital refcount revolution commit ;)
still some gnits left, but keep working on it ;) -timj
Diffstat (limited to 'gtk/gtktree.c')
-rw-r--r--gtk/gtktree.c47
1 files changed, 32 insertions, 15 deletions
diff --git a/gtk/gtktree.c b/gtk/gtktree.c
index c0f994398..bf6daded7 100644
--- a/gtk/gtktree.c
+++ b/gtk/gtktree.c
@@ -33,8 +33,8 @@ typedef void (*GtkTreeSignal) (GtkObject *object,
gpointer data);
-static void gtk_tree_class_init (GtkTreeClass *klass);
-static void gtk_tree_init (GtkTree *tree);
+static void gtk_tree_class_init (GtkTreeClass *klass);
+static void gtk_tree_init (GtkTree *tree);
static void gtk_tree_destroy (GtkObject *object);
static void gtk_tree_map (GtkWidget *widget);
static void gtk_tree_unmap (GtkWidget *widget);
@@ -388,16 +388,24 @@ gtk_tree_destroy (GtkObject *object)
{
child = children->data;
children = children->next;
-
- child->parent = NULL;
- gtk_object_unref (GTK_OBJECT (child));
+
+ gtk_widget_ref (child);
+ gtk_widget_unparent (child);
gtk_widget_destroy (child);
+ gtk_widget_unref (child);
}
g_list_free (tree->children);
+ tree->children = NULL;
- if(tree->root_tree == NULL)
- g_list_free (tree->selection);
+ if (tree->root_tree == tree)
+ {
+ GList *node;
+ for (node = tree->selection; node; node = node->next)
+ gtk_widget_unref ((GtkWidget *)node->data);
+ g_list_free (tree->selection);
+ tree->selection = NULL;
+ }
if (GTK_OBJECT_CLASS (parent_class)->destroy)
(* GTK_OBJECT_CLASS (parent_class)->destroy) (object);
@@ -626,7 +634,7 @@ gtk_tree_remove (GtkContainer *container,
item_list->data = widget;
gtk_tree_remove_items (GTK_TREE (container), item_list);
-
+
g_list_free (item_list);
}
@@ -675,6 +683,7 @@ gtk_tree_remove_items (GtkTree *tree,
gtk_widget_unmap (GTK_TREE_ITEM(widget)->subtree);
gtk_widget_unparent (GTK_TREE_ITEM(widget)->subtree);
+ GTK_TREE_ITEM(widget)->subtree = NULL;
}
/* remove really widget for this item */
@@ -891,7 +900,7 @@ gtk_real_tree_select_child (GtkTree *tree,
g_return_if_fail (GTK_IS_TREE_ITEM (child));
root_selection = tree->root_tree->selection;
-
+
switch (tree->root_tree->selection_mode)
{
case GTK_SELECTION_SINGLE:
@@ -911,7 +920,8 @@ gtk_real_tree_select_child (GtkTree *tree,
selection = selection->next;
root_selection = g_list_remove_link (root_selection, tmp_list);
-
+ gtk_widget_unref (tmp_item);
+
g_list_free (tmp_list);
}
else
@@ -922,14 +932,16 @@ gtk_real_tree_select_child (GtkTree *tree,
{
gtk_tree_item_select (GTK_TREE_ITEM (child));
root_selection = g_list_prepend (root_selection, child);
+ gtk_widget_ref (child);
}
else if (child->state == GTK_STATE_SELECTED)
{
gtk_tree_item_deselect (GTK_TREE_ITEM (child));
root_selection = g_list_remove (root_selection, child);
+ gtk_widget_unref (child);
}
- tree->root_tree->selection= root_selection;
+ tree->root_tree->selection = root_selection;
gtk_signal_emit (GTK_OBJECT (tree->root_tree),
tree_signals[SELECTION_CHANGED]);
@@ -949,6 +961,7 @@ gtk_real_tree_select_child (GtkTree *tree,
selection = selection->next;
root_selection = g_list_remove_link (root_selection, tmp_list);
+ gtk_widget_unref (tmp_item);
g_list_free (tmp_list);
}
@@ -956,13 +969,14 @@ gtk_real_tree_select_child (GtkTree *tree,
selection = selection->next;
}
- tree->root_tree->selection= root_selection;
+ tree->root_tree->selection = root_selection;
if (child->state == GTK_STATE_NORMAL)
{
gtk_tree_item_select (GTK_TREE_ITEM (child));
root_selection = g_list_prepend (root_selection, child);
- tree->root_tree->selection= root_selection;
+ gtk_widget_ref (child);
+ tree->root_tree->selection = root_selection;
gtk_signal_emit (GTK_OBJECT (tree->root_tree),
tree_signals[SELECTION_CHANGED]);
}
@@ -973,7 +987,8 @@ gtk_real_tree_select_child (GtkTree *tree,
{
gtk_tree_item_select (GTK_TREE_ITEM (child));
root_selection = g_list_prepend (root_selection, child);
- tree->root_tree->selection= root_selection;
+ gtk_widget_ref (child);
+ tree->root_tree->selection = root_selection;
gtk_signal_emit (GTK_OBJECT (tree->root_tree),
tree_signals[SELECTION_CHANGED]);
}
@@ -981,7 +996,8 @@ gtk_real_tree_select_child (GtkTree *tree,
{
gtk_tree_item_deselect (GTK_TREE_ITEM (child));
root_selection = g_list_remove (root_selection, child);
- tree->root_tree->selection= root_selection;
+ gtk_widget_unref (child);
+ tree->root_tree->selection = root_selection;
gtk_signal_emit (GTK_OBJECT (tree->root_tree),
tree_signals[SELECTION_CHANGED]);
}
@@ -1012,6 +1028,7 @@ gtk_real_tree_unselect_child (GtkTree *tree,
GtkTree* root_tree = GTK_TREE_ROOT_TREE(tree);
gtk_tree_item_deselect (GTK_TREE_ITEM (child));
root_tree->selection = g_list_remove (root_tree->selection, child);
+ gtk_widget_unref (child);
gtk_signal_emit (GTK_OBJECT (tree->root_tree),
tree_signals[SELECTION_CHANGED]);
}