いがらしです。返事が遅くなり済みません。

At Wed, 26 Apr 2000 13:27:12 +0900,
in Re: Ruby/GTK: define some methods,
Hiroyuki ARAKI <Hiroyuki.Araki / msdw.com> wrote:
> 
> > Gdk::Font#char_width_wcでGdkWCharをFixnumにmappingしていいのか
> > ちょっと自信がないのですが……
> > このへんはたぶんGTK+-1.4に向けて変わってしまうので、
> > できれば使わない方がいいと思います。
> > # 文字列の扱いはまだ考え中です。
> 
> そもそもこのIFが本当に必要か?といわれると考慮の余地があると思います。
> とりあえず char_width だけで充分なのですが、近所のIFを全部 Ruby から
> 利用可能なようについでに書いただけなので(^^;;

どんな目的でchar_widthを使っているのでしょうか?
私の環境ではchar_width_wcは正しい値を返してくれないので
代わりにtext_widthを使ってます。

> > > Gdk::Color::parse
> ……snip……
> 
> Cでの実装に忠実にやる方法も考えたのですが、Ruby からより簡便に利用でき
> る方がいいかと思いその様な実装にしていますが、これは全体のポリシを優先
> すべきでしょうね(^^;

やはりそういう意図だったのですね。それで結局

> > が、どうせGdk::Colorオブジェクトの中身は書き換えられてしまうので、
> > パッチのように外からは渡さずparseメソッド内で生成して返し、
> > 失敗は例外で表現する、というのもありかもしれません。

とすることにしました(RGB成分のsetter/getterを含めて添付)。

> # 将来的に gtk/gtk*.h から自動的にラッパを生成しようと思っていると
> # 伺いましたので、その可能性から考えるとCに忠実であるべきかもしれませ
> # ん。

自動生成の方はあまり進んでいないのですが……
どうせ特別扱いしなくてはならない関数は他にもありますし、
Rubyからの使い勝手を優先して構わないと思います。

> 余談ですが、GtkExtra Widget wrapper は現在 GtkSheet とその付随クラス、
> サンプルが動作するようになっています(^^)。

できたらぜひ公開して下さいね。

--
五十嵐  宏  (Hiroshi IGARASHI)

Index: src/rbgdkcolor.c =================================================================== RCS file: /home/iga/cvsroot/ruby-gtk/src/rbgdkcolor.c,v retrieving revision 1.8 retrieving revision 1.9 diff -u -r1.8 -r1.9 --- src/rbgdkcolor.c 2000/03/30 21:17:43 1.8 +++ src/rbgdkcolor.c 2000/05/11 13:30:25 1.9 @@ -4,7 +4,7 @@ rbgdkcolor.c - $Author: iga $ - $Date: 2000/03/30 21:17:43 $ + $Date: 2000/05/11 13:30:25 $ Copyright (C) 1998-2000 Yukihiro Matsumoto, Daisuke Kanda, @@ -78,6 +78,68 @@ return make_gdkcolor(&c); } +static VALUE +gdkcolor_s_parse(self, name) + VALUE self; + VALUE name; +{ + GdkColor c; + gboolean ret; + ret = gdk_color_parse(STR2CSTR(name), &c); + if (ret) { + return make_gdkcolor(&c); + } else { + rb_raise(rb_eArgError, "can't parse color name `%s'", STR2CSTR(name)); + } +} + +static VALUE +gdkcolor_red(self) + VALUE self; +{ + return INT2FIX(get_gdkcolor(self)->red); +} + +static VALUE +gdkcolor_set_red(self, red) + VALUE self; + VALUE red; +{ + get_gdkcolor(self)->red = NUM2INT(red); + return red; +} + +static VALUE +gdkcolor_green(self) + VALUE self; +{ + return INT2FIX(get_gdkcolor(self)->green); +} + +static VALUE +gdkcolor_set_green(self, green) + VALUE self; + VALUE green; +{ + get_gdkcolor(self)->green = NUM2INT(green); + return green; +} + +static VALUE +gdkcolor_blue(self) + VALUE self; +{ + return INT2FIX(get_gdkcolor(self)->blue); +} + +static VALUE +gdkcolor_set_blue(self, blue) + VALUE self; + VALUE blue; +{ + get_gdkcolor(self)->green = NUM2INT(blue); + return blue; +} /* * Gdk::ColorContext @@ -104,6 +166,13 @@ gdkColor = rb_define_class_under(mGdk, "Color", rb_cData); rb_define_singleton_method(gdkColor, "new", gdkcolor_s_new, 3); + rb_define_singleton_method(gdkColor, "parse", gdkcolor_s_parse, 1); + rb_define_method(gdkColor, "red", gdkcolor_red, 0); + rb_define_method(gdkColor, "red=", gdkcolor_set_red, 1); + rb_define_method(gdkColor, "green", gdkcolor_green, 0); + rb_define_method(gdkColor, "green=", gdkcolor_set_green, 1); + rb_define_method(gdkColor, "blue", gdkcolor_blue, 0); + rb_define_method(gdkColor, "blue=", gdkcolor_set_blue, 1); /* * Gdk::ColorContext