2002-02-20 [長年日記]
λ. Gimp-Rubyのembedモジュール
お遊びで作ってるやつ。結局ffcallのtrampolineを使うのは面倒そうなので止めた。代わりに、Ruby/DL方式でコールバック関数をあらかじめ用意しておくことにした。で、サクっと実装。ColorDisplayはdepricatedみたいだし速度的にもRubyじゃきついので、実際に使うとしたらColorSelectorくらいだろう。
インターフェースはまだ固まっていないけど、とりあえず~/.gimp-1.2/ruby/modules/にある.rbファイルをファイル毎に匿名のモジュールでmodule_evelして、それをモジュールとして扱うことにした。例えば、以下のようなファイルを~/.gimp-1.2/ruby/modules/hoge.rbとして置くと、Gimpに標準で入っているカラーセレクターとほぼ同じものになる。う〜む、callbackはダサイな。observer.rbを使うか?
require 'gtk' class TestColorSelection < Gtk::ColorSelection def initialize(r, g, b, callback) super() setcolor(r, g, b) signal_connect('color_changed'){ c = self.get_color callback.call(c[0] * 255, c[1] * 255, c[2] * 255) } end def setcolor(r, g, b, set_current = true) self.set_color([r/255.0, g/255.0, b/255.0]) end end def init @@handle = Gimp::Mod::ColorSelector.register("Gimp-Ruby Test", nil, TestColorSelection) end def unload Gimp::Mod::ColorSelector.unregister(@@handle) if @@handle end module_function :init, :unload
λ. Ruby/GTKのアプリケーションへの組み込み
gtk+のメインループ内でRubyのスレッドを回してあげるために、Ruby/Gtkではg_main_set_poll_func()又はgtk_idle_add()を使ってハンドラーを登録している。
だけど、アプリケーションへの組み込みを考えるならば、Rubyインタプリタが終了したあともgtk+は動き続けている可能性もあるわけで、rb_set_end_proc()を使ってgtk_idle_removes()等を呼ぶ必要がありそうだ。
でも、g_main_set_poll_func()の方を使っている場合はどうしたら良いのだろう?
λ. NFS4 requires UTF-8
いつのまにか、そんな事になってたのね。
λ. 関手の圏
はぅあ。関手(functor)をやっと理解したと思ったら、関手の圏(functor category)なんてのもあるのね。
ども。g_main_remove_poll()を使えば良いのですかね。使ったこともないですが。
う〜ん。g_main_remove_poll()はg_main_add_poll()で追加したのを削除する関数っぽいので、多分それじゃ無理だと思います。<br> glib-2.0ならば、g_main_context_get_poll_func()があるので、元のGPollFuncを保存しておいて、g_main_context_set_poll_func()し直すという事が出来るのですが……<br> というか、そもそもpoll_funcってライブラリが勝手に設定して良いものなのか疑問かも。
うーむ。確かに。