From: Daisuke Furukawa <dfuru / suenaga.cse.nagoya-u.ac.jp>
Subject: [ruby-ext:00986] Re: ruby-gtkglarea patch
Date: Fri, 17 Mar 2000 12:42:04 +0900 (JST)

> # 週末が潰れることになったので、次のお返事は月、火曜日になります。

ゆっくりいきましょう(^^

> すみません、不勉強で意味を取り違えていたら
> ごめんないさい。extension にするということは拡張ライブラリにして
> require 'trackball' で呼び出すようにしようということであってますか。

あってます。

> こういうことだとすれば、私の考えは現状のままでも拡張ライブラリにしても
> いいかなあ、というぐらいです。
> ただ trackball.rb, lw.rb はすでにできてるが、一方拡張ライブラリは
> 作る手間がかかる ...

ふむ‥。たしかにそうなんですが‥。とりあえず、これはそのままにしておきま
しょう。

> >う〜ん、個人的には share_newは methodにしたいかなぁ‥。
> 
> 一つ確認させて下さい(というか、教えて下さい)。共有されるのは
> GtkGLArea のウィジェット (?) ではなくて、生成したレンダリング
> コンテキストに対するディスプレイリストですよね。

ですね。

> すると、
> 
> >area_a = Gtk::GLArea.new(attrlist)
> >area_b = area.share_new(another_list)
> >     or
> >area_b = area.dup(another_list)とか (これはだめか‥‥)
> 
> は、何かおかしい気がするのですが、どうでしょう。

う〜ん、そうですか?(^^; じゃ、

glarea = Gtk::GLArea.new(list, share)

に、しましょう(^^;;

initializeの functionと、rbgtk_fixary_2_intary()をこれに付けますね。

rbgtk_fixary_2_intary()は、第二引き数に int *を要求させてみました。これ
は free()をわざわざしたくなかったからなんですが、内部で mallocさせて、使
いおわったら free()する方が綺麗?

コメントしていただければ幸いです。
--
           yashi


static int * rbgtk_fixary_2_intary(fixary, intary) VALUE fixary; int *intary; { int len, i; if (TYPE(fixary) != T_ARRAY) { g_print("%d\n", TYPE(fixary)); rb_raise(rb_eTypeError, "rbgtk_fixary_2_intary: not an array"); } len = RARRAY(fixary)->len; for (i=0; i<len; i++) { intary[i] = NUM2INT(RARRAY(fixary)->ptr[i]); } return intary; }
static VALUE glarea_init(argc, argv, self) int argc; VALUE *argv; VALUE self; { int *list; GtkWidget *widget; GtkGLArea *glarea; VALUE attrlist, share; rb_scan_args(argc, argv, "11", &attrlist, &share); if (TYPE(attrlist) != T_ARRAY) { g_print("%d\n", TYPE(attrlist)); rb_raise(rb_eTypeError, "Attribute must be an array of intergers"); } list = rbgtk_fixary_2_intary(attrlist, ALLOCA_N(int, RARRAY(attrlist)->len)); glarea = get_gtkglarea(share); widget = gtk_gl_area_share_new(list, glarea); if (!widget) rb_raise(rb_eFatal, "GLArea: failed to create new GtkGLArea widget." ); set_widget(self, widget); return Qnil; }