かんだです。 > まつもと ゆきひろです > > 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とかどうかな。