From: Masahiro S. ()
<sa...@to...> - 2006-05-19 10:12:04
|
酒井です。 From: "Kouhei Sutou" <ko...@co...> Date: Thu, 18 May 2006 14:37:06 +0900 > 須藤です. > > 06/05/18 に 酒井政裕 Masahiro Sakai<sa...@to...> さんは書きました: > > > 例えばgtk側でオブジェクトの参照関係の変更が発生する場合には、 > > 新しい参照関係に対してG_CHILD_ADDしなおす必要がありますよね。 > > うーん,こんな場合ですかねぇ... > > xxx = widget.get_xxx # (*) > xxx.signal_connect("...") {} > xxx = nil > GC.start > > (*): get_xxxはなにかGTK+内部で勝手に作ったウィジェットを返す. 実際に現在のコードで問題が起こる例を探してみました。 fsel = Gtk::FileSelection.new fsel.ok_button.signal_connect('clicked'){} GC.start fsel.ok_button.clicked この場合には返り値との間に親子関係が成立することがあらかじめ分かってい るので、ok_button内でG_CHILD_ADDすれば良いですが、そうでない場合にはよ り悩ましいと思います。 > > ですが、それはgtk側での参照関係の変更がどんなタイミングで発生するかを > > すべて把握していないと不可能で、新たなライブラリや将来のgtkの内部変更 > > も考えると、それが果たして現実的な解なのか...私にはわからないです。 > > 不可能かもしれないですけど,数はそんなに多くないと思うので現実的だと思い > ます.あ,見付けたらそのつど直していくぐらいでいいんじゃないかという意味 > ですけど... ではもう一つ見つけた例を。 view = Gtk::TextView.new iter = view.get_iter_at_location(0,0) iter.buffer.signal_connect('changed'){ puts "changed" } GC.start view.insert_at_cursor("foo") > # あ,widget->parentがあるやつはmarkしておくというのはどうだろう. それは良いと思います。 それと、Gtk::Container(とその派生クラス)ではmark時にgtk_container_forallで 子供を列挙してmarkすべきですね。そうすれば、コンテナの場合の親子関係に ついては個別に対処する必要はなくなると思います。 -- 酒井 政裕 / Masahiro Sakai |