From: "D.Kanda" Date: 1998-09-07T13:45:05+09:00 Subject: [ruby-list:9475] gtk かんだです。 以前流した 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); ------------------------------------------------------------------------------