From: Kouhei S. <ko...@co...> - 2006-10-14 14:06:46
|
須藤です. In <200...@hi...> "Re: [ruby-gnome2-devel-ja] libglade2のパッチ" on Sat, 14 Oct 2006 21:24:19 +0900, Masao Mutoh <mu...@hi...> wrote: > > ところで,「ハンドラを設定しているウィジェット」の参照を保持 > > する場所ですが,GladeXMLオブジェクト内に持たせるよりも,どこ > > か別の場所に持たせた方がよいでしょうか? > > 可能性という意味では、先の例があげられますので、 > グローバルに持たせた方が良いような気がします。 違うアイディアを思い付きました. --- libglade2.rb.~1.14.~ 2006-10-12 22:50:17.000000000 +0900 +++ libglade2.rb 2006-10-14 22:59:00.000000000 +0900 @@ -40,10 +40,9 @@ class GladeXML end if signal_proc - @sources ||= {} - @sources[source.object_id] = source - source.signal_connect("destroy") do |object| - @sources.delete(object.object_id) + parent = source.parent + while parent + parent = parent.parent end case signal_proc.arity when 0 Gtk::Window(とかGtk::Dialogとか)はdestroyされるまでGCされ ない仕組みを利用します. パッチのように,ハンドラが設定されるウィジェットの親を辿りま くって,全ての親ウィジェットのRubyのオブジェクトを作っておき ます.一度作られたGtk::WidgetはGCされないで,さらに,ハンド ラを設定したウィジェットを辿るまでのウィジェット用のRubyのオ ブジェクトも存在するので,ハンドラが設定されるウィジェットは (もし親にいれば)Gtk::WindowがGCされるまで生き続けます. で,これはGladeを使っていない普通のRuby/GTK+アプリケーション と同じ動作になります. どうでしょうか? 念のため,例えば,親ウィジェットにGtk::Windowがいない場合, のために,@sourcesにウィジェットを残しておく処理も残しておき ますか? |