From: Masahiro S. ()
<sa...@to...> - 2007-07-15 09:27:46
|
酒井です。 昔のメールを見返していると、全然覚えてなくて困ります(汗 昔と意見が変わっている点も多いと思いますが、すみません。 From: Masao Mutoh <mu...@hi...> Date: Mon, 23 Feb 2004 02:07:34 +0900 > むとうです。 > > 以前、直すと宣言していたものの中で、以下の件に > ついて対応しました。 > > On Wed, 31 Dec 2003 04:46:29 +0900 > Masao Mutoh <mu...@hi...> wrote: > > > ■ GDKのFactory関連 > > GDKでは、実装がWin32の時やX11の時でそれぞれ別々のGTypeを > > 持ちます。 > > で、実は、いくつかのGdk関連のクラスで現在問題になっている > > のですが、Ruby側から登録されていないGTypeがあるために、 > > 無名クラスとして値が返されるメソッドが結構あったりして > > そのままでは使えない状態になっています。 > > たとえば、Gdk::Screen.defaultなど。 そもそも、これって無名クラスだと何か問題があるのでしたっけ? 単にinspectで無名クラスが表示されてイヤということであれば、inspectに細 工して少し分かりやすい文字列を返せばよいのではないかと思いました。 何故、こんなことを言い出したかというと、現在G_DEF_CLASS3が以下のような 使われ方をしていますが、これだとgtk側の内部実装が変わったり、新しいバッ クエンドが追加されただけで、Ruby-GNOME2側も変更しなくてはならなくなって しまうためです。 #ifdef GDK_WINDOWING_X11 G_DEF_CLASS3("GdkGCX11", "GCX11", mGdk); #elif defined(GDK_WINDOWING_WIN32) G_DEF_CLASS3("GdkGCWin32", "GCWin32", mGdk); #elif defined(GDK_WINDOWING_FB) G_DEF_CLASS3("GdkGCFB", "GCFB", mGdk); #endif > > で、以下の2つの対応方法を考えてみました。 > > > > 1. GdkGCX11やGdkGCWin32はGdk::GCとして見えるようにする > > 2. GdkGCX11はGdk::GCX11に、GdkGCWin32はGdk::GCWin32にする > > > > 1.の場合、GOBJ2RVAL2(val, gtype)というのを作って明示的にRuby化 > > されるときのクラスを決定してしまう、という比較的安易な対応が > > できると思います。 > > > > 2.の場合、すべて手作業でG_DEF_CLASSをするという手もありますが > > 結構面倒くさいかなーと。 > > プラッガブルに追加されるようなものを想定すると、 > > 自動でクラスとgtypeのマッピングを生成するようなことを考える > > 必要がありますが、タイミング的にそれはちと難しいかなぁと > > 思っています。 > > > > 実装の問題は置いておいて、本来どっちであるべきかというのも > > 実は悩ましいです。 > > > > GTK+は一つの環境には基本的に1つの実装(X11 or Win32 or linuxfb) > > がインストールされると思うのですが、その場合、rbbrなどで見たときに > > すべてのGdkクラス群が1つのサブクラス(というか実体)を持つという > > 感じになるのがちょっと冗長かな、と。 > > ドキュメント書くのも面倒くさいし(ホンネ)。 > > > > あー、でもここまで書いてきて思ったのですが、 > > やっぱり2の方が良さそうだなぁ。手動でもそんなに数が多いわけでも > > ないし。 > > 結局、2.の案を採用しました。 > > 具体的には、 > G_DEF_CLASS3(gtype_name, ruby_name, module); > というのを用意しました。 > > G_DEF_CLASS3("GdkScreenX11", "ScreenX11", Gdk); > のように使います。 > これで、Gdk::Screen.defaultを呼び出すとClassの代わりにGdk::ScreenX11 > が呼び出されるようになり、その後はGdk::ScreenX11を使うことができます。 From: Masao Mutoh <mu...@hi...> Date: Mon, 23 Feb 2004 02:20:31 +0900 > むとうです。 > > 補足です。 > > G_DEF_CLASS3は基本的にはfoo_get_type()メソッドが非公開のものに > 対して使います。 > foo_get_type()を明示的に呼び出すことができないために、foo_get_type() > が呼び出されたであろう直後(実際はruby側からGDKの関数を呼び出した後)に > Rubyのクラスを生成するようにしています。 > そのときGdkScreenX11等の文字列を利用してgtypeを取得します。 foo_get_type() が非公開ということは、 その型をユーザーに直接扱って欲しくないということだと思います。 本当にGdkScreenX11等を直接扱う必要があるのでしょうか? -- 酒井 政裕 / Masahiro Sakai |