From: Masao M. <mu...@hi...> - 2006-10-14 14:50:26
|
むとうです。 On Sat, 14 Oct 2006 23:06:39 +0900 (JST) Kouhei Sutou <ko...@co...> wrote: > 須藤です. > > 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にウィジェットを残しておく処理も残しておき > ますか? 確かに両方のパターンが考えられますので、両方とも採用しましょう。 ありがとうございます! -- .:% Masao Mutoh<mu...@hi...> |