From: Yasushi Shoji <yashi / yashi.com>
Subject: [ruby-ext:00645] Re: (gtk) testgtk/ctree
Date: Thu, 02 Dec 1999 00:22:02 -0500

> set_row_dataなんて、関係ないですね。makerでしか、markしてない(^^;;

自分で書いたやつを読んで気がつきました(^^;;

set_row_data()された、rowも makerに渡ることありますね。で、そこで、
dataの checkをするために、ctree_node_markを使ったんだと思いますが、
set_row_data_full()に ctree_mark_dataを渡してみました。これでたぶん
markするかどうかを、makerで呼ぶ必要がなくなったんじゃないかなと思います。

test おねがいします。とりあえず、50回の呼び出しには、耐えました。

# これで、どーだー
--
            yashi

--- rbgtkctree.c 1999/11/29 13:55:53 1.1.1.1 +++ rbgtkctree.c 1999/12/02 05:57:28 @@ -2,20 +2,12 @@ static ID id_nodelist; -static void -ctree_node_mark(node) - GtkCTreeNode *node; -{ - if (GTK_CTREE_ROW(node) && GTK_CTREE_ROW(node)->row.data) - rb_gc_mark(GTK_CTREE_ROW(node)->row.data); -} - VALUE make_ctree_node(node) GtkCTreeNode* node; { if (!node) return Qnil; - return Data_Wrap_Struct(gCTreeNode, ctree_node_mark, 0, node); + return Data_Wrap_Struct(gCTreeNode, 0, 0, node); } static GtkCTreeNode* @@ -1093,6 +1085,21 @@ } /* + * ctree_mark_data(data) + * + * Mark data for GC + * + * argument: + * data - VALUE which casted to gpointer + */ +static void +ctree_mark_data(data) + gpointer data; +{ + rb_gc_mark(data); +} + +/* * node_set_row_data(node, data) * * Set the custom data associated with a node. @@ -1105,9 +1112,10 @@ ctree_node_set_row_data(self, node, data) VALUE self, node, data; { - gtk_ctree_node_set_row_data(GTK_CTREE(get_widget(self)), - get_ctree_node(node), - (gpointer)data); + gtk_ctree_node_set_row_data_full(GTK_CTREE(get_widget(self)), + get_ctree_node(node), + (gpointer)data, + ctree_mark_data); bind_ctree_node(self, node); return self; }