かんだです。
以前流した ruby-gtk パッチの debug と追加です。
-c を付け忘れたみたいで、位置が分からないかもしれません。
ary_push(...) は、signal_setup_args() の "size_request" のところです。
return(make_gdkcolor(color)) は、DEFINE_STYLE_SET_COLOR マクロです。
signal_setup_args() で size_request の部分を GtkRequisition のコピーでな
く、そのまま Data_Wrap_Struct しています。これは以下の理由です。
何か間違ってないか確認下さい。
# markはよく分かってないです。
・signal_setup_args() は GTK signal の処理関数を Ruby のブロックとして割
り当てた場合に、gtk のオブジェクトを Ruby のオブジェクトに変換するために
使われる。
・size_request signal は名前の通り、widget に必要なサイズを聞く為に使われ
るものであって、width, height を受け取る必要がある。その受け渡しは引数
として与える GtkRequisition* のメンバを変更することで実現される。
・以上から、size_request で GtkRequisition をコピーしてしまっては正しく
結果が渡されない。ゆえに、GtkRequisition をそのまま Ruby 側に渡さなけれ
ばならない。
・この場合のオブジェクトは C でいう const でのポインタ引数と同じようなも
のだから、GC しないようにする必要がある。だが、そもそもの引数 Requisition
の生成が C なのか Ruby なのか分からないので mark は使えない(?)
単純に、何もしない関数を free として Data_Wrap_Struct に渡すことにする。
------------------------------------------------------------------------------
1186a1187
> static void nonfree(void *p) { }
1205c1206,1208
< ary_push(args, make_grequisition(GTK_VALUE_POINTER(params[0])));
---
> /* ary_push(args, make_grequisition(GTK_VALUE_POINTER(params[0]))); */
> ary_push(args, Data_Wrap_Struct(gRequisition, 0, nonfree,
> GTK_VALUE_POINTER(params[0])));
5826c5829
< return(make_gdkcolor(*color)); \
---
> return(make_gdkcolor(color)); \
6074a6078,6085
> static VALUE grequisition_new(VALUE self, VALUE w, VALUE h)
> {
> GtkRequisition r;
>
> r.width = NUM2INT(w);
> r.height = NUM2INT(h);
> return make_grequisition(&r);
> }
7317c7328
< rb_define_method(gStyle, "set_background", style_set_background, 1);
---
> rb_define_method(gStyle, "set_background", style_set_background, 2);
7362a7374
> rb_define_singleton_method(gRequisition, "new", grequisition_new, 2);
------------------------------------------------------------------------------