From: Matthias V. <mat...@ya...> - 2002-07-07 12:51:25
|
>>>> MM == Masao Mutoh <mu...@hi...> wrote: MM> I think Ruby/GTK's implement is bad now, because it can't keep MM> object strictly as follows: MM> 1. When ruby wrapper is finalized, gtk-object should be MM> finalized(destroyed). MM> 2. When gtk-object is destroyed(finalized), ruby wrapper MM> shuold be finalized. MM> MM> > - then a simple ref, before delete is a fast solution. MM> MM> ref/unref system is too complicated. MM> I want to hide them from Ruby/GTK's user. MM> So I will not support ref/unref methods obviously in Ruby/GTK an Ruby/GTK2. MM> MM> > PS: simple test script is attached - a click on 'press me' will fail MM> MM> Hmm, I think Gtk::Container#remove destroy child is strange. MM> MM> button1.signal_connect('clicked') { |*args| MM> hbox.remove(button2) MM> puts button2.clicked() #<- Destroyed? why? MM> } MM> MM> Any comments/ideas? MM> Hi Masao, Reference counting should not be the task of ruby/gtk users - I agree. I just think, that the C-Wrapper has to deal with those tasks: If a widget is removed via gtk_container_remove, the widget will be destroyed (this is the valid behavior of gtk). To prevent this (the ruby reference is still valid) a gtk_widget_ref must be invoked before - what is a common approach in the plain C-world. rbgtkcontainer.c line 53 ff: static VALUE cont_remove(self, other) VALUE self, other; { gtk_widget_ref(GTK_WIDGET(get_widget(other))); // <-- important!!! gtk_container_remove(GTK_CONTAINER(get_widget(self)), get_widget(other)); return self; } The example above will now work, but the gtk-widgets reference counter will never touch zero again... A more general solution could be to increment the reference counter, whenever a ruby/gtk-widget is created (via gtk_widget_ref). The reference counter must be decremented (gtk_widget_unref) via finalization - in my opinion the most versatile approach. I don't know a lot of ruby/gtk, if this is a problem - what is your opinion? Best Regards, Matthias _________________________________________________________ Do You Yahoo!? Get your free @yahoo.com address at http://mail.yahoo.com |