やすしです。

From: yamazaki <yamazaki / nal.go.jp>
Subject: [ruby-ext:00706] Re: Gtk::GL
Date: Sun, 12 Dec 1999 21:20:39 +0900 (JST)

> [ruby-ext: 00522] で言ったような問題になるのは、後から追加した
> ウィジェットが、ポインタ型のパラメータのあるシグナルを持っていて、
> それが GtkObject * でない場合です。GtkGLArea には固有のシグナルが
> ないので、問題にはなりません。

なるほど。あと object classが hardcodeされてるのって、
make_gobject_auto_type()で使われてる get_gtk_type()くらいですね。
じゃあ、問題ないのかな‥?

あと、sourceで attrListが解放されてないのがちと、まずそげ。
# glChooseVisualでintの pointerをわざわざ持つとは思えないので‥。

うちの init funcは、T_ARRAYしか受けない様にしてたんですけど、影響されて
変えてしまいました。でも、Rubyでの argumentの数は (たしか) 16以下だった
はずなので、やっぱり、T_FIXNUMか T_ARRAYにしてます。

あとは、GDK_GL_NONEが最後じゃなかった場合だけ、GDK_GL_NONEを入れてます。
# ただ、ここまでする理由があるかは、いつもの様に謎です(笑)
--
           yashi


/* does Ruby or Ruby/Gtk has same func? */ static int* ary2intary(ary) VALUE ary; { int *cary; int i; Check_Type(ary, T_ARRAY); cary = ALLOCA_N(int, RARRAY(ary)->len); for(i=0; i<RARRAY(ary)->len; i++) { cary[i] = NUM2INT(RARRAY(ary)->ptr[0]); } return cary; } static VALUE glarea_init(argc, argv, self) int argc; VALUE *argv; VALUE self; { int *list; VALUE attrlist; int attr, len; rb_scan_args(argc, argv, "01", attrlist); if (attrlist) { switch (TYPE(attrlist)) { case T_ARRAY: len = RARRAY(attrlist)->len; if (list[len] != GDK_GL_NONE) rb_ary_push(attrlist, GDK_GL_NONE); list = ary2intary(attrlist); case T_FIXNUM: if (attr = NUM2INT(attrlist) == GDK_GL_NONE) { list = ALLOCA_N(int, 2); list[0] = attr; list[1] = GDK_GL_NONE; } else { list = alloc(int); list[0] = NUM2INT(attrlist); } default: rb_raise(rb_eTypeError, "Attribute must be integer or array of integer"); } } else { list = alloc(int); list[0] = GDK_GL_NONE; } set_widget(self, gtk_gl_area_new(list)); free(list); return Qnil; }