かんだです。

> まつもと ゆきひろです
> 
> In message "[ruby-list:9475] gtk"
>     on 98/09/07, "D.Kanda" <MAP2303 / mapletown.net> writes:
> 
> |  かんだです。
> |  以前流した ruby-gtk パッチの debug と追加です。
> |  -c を付け忘れたみたいで、位置が分からないかもしれません。
> 
> えーと,すいません.ed inputは辛すぎるので-cか-uでもう一度お願
> いできませんか? 私へ直接で構いませんので.

  わかりました。
  patch 元は、0.10 か 0.10+旧patch のどちらがいいでしょう? 

> |  signal_setup_args() で size_request の部分を GtkRequisition のコピーでな
> |く、そのまま Data_Wrap_Struct しています。これは以下の理由です。
> |  何か間違ってないか確認下さい。
> 
> そのようにする必要性については分かりました.で,問題になるの
> はGtkRequisitionの寿命ですね.ソースを見る限り渡される
> GtkRequisionはオブジェクトにembedされたものか,auto変数のポ
> インタのようです.後者はハンドラ修了後にそのオブジェクトに触
> れたら即アウトですし,前者でもまずい状況はありえますね.
> 
> これに対して
> 
>         そういうものだ,ハンドラの外に持ち出すな
> 
> というのは確かにそうなんですが,それしきのことでシステム全体
> を落とせるというのもしゃくな気がします.どうしたもんでしょう
> ねえ.perlとかpythonとかどうしてるのかな?

  他の言語は知らないですが、とりあえず思いつく解決策は、signal_set_args()
では従来通りコピーするけれど、元のオブジェクトも覚えておいて、ハンドラから
返ってきたら整合をとるというものです。

  gtk.c の 1210行あたり、rb_apply() の後に、

    if (strcmp(rb_id2name(id), "size_request")) {
      GtkRequisition* r0 = (GtkRequisition*)GTK_VALUE_POINTER(params[0]); 
      GtkRequisition* r1 = get_grequisition(ary_entry(args, ...));
      r0.width  = r1.width;
      r0.height = r0.height;
    }	

  とか入れれば一応はできそうです。
  (r1 を得るための ary_entry の idx はぱっと見ただけでは分からないのでパス)
  (rb_apply は NIL_P(proc) で分かれているけど、どっちに入れるのかもパス)

  ただ、美しくないですね。もっと統一的に、signal_sync_args とかいう関数で
面倒みたいかな。これでできそうなら僕がやってきましょうか? 今週末になると
思いますが。

  あと、Data_Wrap_Struct用に nonfree() なんて宣言してますけれど、mark の指
定みたいに「処理しない」という指定ができるようにはできませんか?  free のと
ころに 0 を指定すると free() が呼ばれますよね。-1とかどうかな。