師星です。

> 	また、Gtk::CTreeですがスナップショット版でもまだSegmentation fault
> 	を起こす場合があるようです。ただ、こちらは私の使い方の問題かも知れ
> 	ませんのでもう少し調べて見ますが。

Gtk:CTreeですが、
snapshotではrow_dataを使っていなかったはず……と思ったらいつのまにか拙作
のパッチを取り込んでいただいていたのですね。
申し訳ありませんが、あれにはまだバグがありました。
segmentation faultは覚えがないのですが、たまにGCに異様に時間がかかること
と、nodelistを放置していたためにCTreeNodeがGCされないことは観測していま
した(nodelistはsnapshotではbind_ctree_nodeがコメントアウトされていて問題
でなくなっていますが)。

すでに手元では修正し、一週間程度使っていて問題は出ていないのですが、
こちらには出していませんでした。
というわけでsnapshotのrbgtkctree.cに対するパッチです。

 - moro.

--- rbgtkctree.c.orig	Wed Oct 11 20:04:19 2000
+++ rbgtkctree.c	Sun Oct 22 06:30:09 2000
@@ -13,24 +13,15 @@
 
 #include "global.h"
 
-static ID id_nodelist;
 static ID id_marker;
 
 static void
-ctree_node_mark_recursive(node)
-     GtkCTreeNode *node;
-{
+ctree_node_mark(GtkCTree *ctree, GtkCTreeNode *node, gpointer notused) {
     if (node) {
 	GtkCTreeRow *row = GTK_CTREE_ROW(node);
-	if (row) {
-	    GtkCTreeNode *work;
-	    
+	if (row)
 	    if (row->row.data)
 		rb_gc_mark_maybe(row->row.data);
-
-	    for (work=row->children; work; work=GTK_CTREE_NODE_NEXT(work))
-		ctree_node_mark_recursive(work);
-	}
     }
 }
 
@@ -38,14 +29,8 @@
 ctree_marker_mark(ctree)
     GtkCTree *ctree;
 {
-    if (ctree) {
-	GtkCTreeNode *work;
-	work = gtk_ctree_node_nth(ctree, 0);
-	while (work) {
-	    ctree_node_mark_recursive(work);
-	    work = GTK_CTREE_NODE_NEXT(work);
-	}
-    }
+    if (ctree)
+	gtk_ctree_pre_recursive(ctree, NULL, ctree_node_mark, NULL);
 }
 
 VALUE
@@ -67,15 +52,6 @@
     return c_node;
 }
 
-static void
-bind_ctree_node(ctree, node)
-    VALUE ctree, node;
-{
-    VALUE nodelist;
-    nodelist = rb_ivar_get(ctree, id_nodelist);
-    rb_ary_push(nodelist, node);
-}
-
 /*
  * initialize(titles, tree_column)
  *
@@ -91,7 +67,6 @@
      VALUE self, titles, tree_column;
 {
     GtkWidget *widget;
-    VALUE nodelist;
 
     if (TYPE(titles) == T_ARRAY) {
 	char **buf;
@@ -108,8 +83,6 @@
     }
     set_widget(self, widget);
 
-    nodelist = rb_ary_new();
-    rb_ivar_set(self, id_nodelist, nodelist);
     rb_ivar_set(self, id_marker, Data_Wrap_Struct(rb_cData, ctree_marker_mark,
 						  0, widget));
 
@@ -1148,7 +1121,6 @@
     gtk_ctree_node_set_row_data(GTK_CTREE(get_widget(self)),
 				get_ctree_node(node),
 				(gpointer)data);
-    /* bind_ctree_node(self, node); */ /* no needed? */
     return self;
 }
 
@@ -1449,7 +1421,6 @@
     gCTree = rb_define_class_under(mGtk, "CTree", gCList);
     gCTreeNode = rb_define_class_under(mGtk, "CTreeNode", rb_cData);
 
-    id_nodelist = rb_intern("nodelist");
     id_marker = rb_intern("marker");
 
     /* constants */