かんだ@楓街です。

Hiroshi Igarashi <igarashi / ueda.info.waseda.ac.jp>さんの書かれた、
	「[ruby-ext:00085] ruby-gtk patch and testgtk.rb」
からの引用です。

> いがらし@早大です。
> 
> ようやく卒論が終ったので、
> やりかけだった testgtk.rb の作業をほんの少し進めました。
> http://www.ueda.info.waseda.ac.jp/~igarashi/ruby/testgtk-19990212.rb.gz
> (最近追加されたSpinButtonも早速利用しています。)

  前はタイミング逃がしちゃって聞けなかったんですけど、これ、Ruby/Gtk 本体
に入れておいてもよろしいでしょうか?


> それにともなって拡張モジュールの方にも
> いくつかメソッドを追加したので、添付しておきます
> (ruby-gtk-0.16からの差分です)。チェックをお願いします。

  focus とかの単純な部分は問題なさそうです。


> メソッドを追加する上で疑問に思ったのですが、
> GList のようなデータは、どのようにRubyプログラム側に
> 見せたらよいでしょうか。
> 例えば Gtk::Tree#selection など、GList をむりやり
> Array に変換してRuby側に返しているのですが、
> これでいいんでしょうか?

  ruby-gtk-0.16 だとなんかコメントアウトされてますね。
  たぶんそのまま ruby へ返すと GC で落ちると思います。
  というのは、selection で返されたものは Gtk::Tree が保持しているわけですが、
この Gtk::Treeオブジェクト自体が selection を返した(=ruby側にオブジェクトが
存在している)ことを関知していないので、勝手に free しちゃう場合が考えられる
からです。こういう場合、簡単な解決方法は、

  ・単にデータとして使われる参照専門の小さいオブジェクトなら、新たに同じ内
   容のオブジェクトを作って、返す Ruby オブジェクトはそれを参照するようにす
   る。この方法は widget_get_requisition() なんかで使っています。

  ・gtk 側でリファレンスカウントしている場合、カウントを増やす。これは style
   とかそうだったと思います。Data_Wrap_Object の free 引数にはカウントを減ら
   す関数を指定してあげること。

  これで解決できない場合は、次のようにすればいいかとは思います。

  ・集約データを参照する新たな Ruby オブジェクト側を作った場合、そのデータを
   集約する Gtk オブジェクトに対応する Ruby オブジェクト(ややこしい) にその新
   たな Rubyオブジェクトを参照させる。

  が、その為には ruby の GC の仕組みを理解するか、その為の関数のような名の
add_relative() を理解することになります。で、add_relative() と ruby と gtk
のオブジェクト同士の参照破壊関係を解析しているところで止まっています(^^;

  というわけで、添付パッチをマージするのはもう少し僕が理解してからになると
思います。そろそろ年度末に向けて忙がしくなりそうな気配がするので、少し遅れ
てしまうかもしれません(__)

-- 
  楓の街のダイ                       「ジョゼットは、体は機械だけれど…
    MAP2303 / mapletown.net              でも、心は人間なの!」
                                                -> Wonder Project J2