From: Yasushi Shoji <yashi / yashi.com>
Subject: [ruby-ext:00661] Re: (gtk) testgtk/ctree
Date: Fri, 03 Dec 1999 07:57:20 -0500

> まだ、patchを読んだだけなんですが、これだと同じ rowに同じ dataを入れると
> ref countだけ上がって、deleteの時に 消えないんじゃないでしょうか?

patchにすると、こんな感じですかね?

# getterを2回呼ぶのがなんとなく嫌だったので、patchがおおきくなってしまい
# ました。

## あと、CTreeの testのやつで Depth, Books, Pagesを最大にまで上げて
## Rebuild treeを押すと、systemの耐久テストができます(^^;;; Cの方では 
## limiterがあるみたい。(耐久テストはやらない方が良いですよ、たぶん)
--
          yashi

--- rbgtkctree.c 1999/12/03 13:15:52 1.2 +++ rbgtkctree.c 1999/12/03 13:23:20 @@ -1129,24 +1129,31 @@ VALUE self, node, data; { VALUE count; + gpointer old_data; + GtkWidget *gctree = get_widget(self); + GtkCTreeNode *gnode = get_ctree_node(node); - /* increment reference count */ - count = rb_hash_aref(ctree_node_row_data, data); - if (NIL_P(count)) - count = INT2FIX(1); - else { - int i; + old_data = gtk_ctree_node_get_row_data(GTK_CTREE(gctree), gnode); - i = FIX2INT(count) + 1; - count = INT2FIX(i); - } - rb_hash_aset(ctree_node_row_data, data, count); + if (old_data != data) { + /* increment reference count */ + count = rb_hash_aref(ctree_node_row_data, data); + if (NIL_P(count)) + count = INT2FIX(1); + else { + int i; + + i = FIX2INT(count) + 1; + count = INT2FIX(i); + } + rb_hash_aset(ctree_node_row_data, data, count); - gtk_ctree_node_set_row_data_full(GTK_CTREE(get_widget(self)), - get_ctree_node(node), - (gpointer)data, - on_destroy_notice); - bind_ctree_node(self, node); + gtk_ctree_node_set_row_data_full(GTK_CTREE(gctree), + gnode, + (gpointer)data, + on_destroy_notice); + bind_ctree_node(self, node); + } return self; }