トップ «前の日記(2002-02-19) 最新 次の日記(2002-02-21)» 月表示 編集

日々の流転


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
Tags: ruby gimp

λ. 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()の方を使っている場合はどうしたら良いのだろう?

Tags: ruby

λ. NFS4 requires UTF-8

いつのまにか、そんな事になってたのね。

λ. 関手の圏

はぅあ。関手(functor)をやっと理解したと思ったら、関手の圏(functor category)なんてのもあるのね。

Tags: 圏論
本日のツッコミ(全3件) [ツッコミを入れる]
ψ むとう (2002-02-21 00:27)

ども。g_main_remove_poll()を使えば良いのですかね。使ったこともないですが。

ψ さかい (2002-02-21 17:03)

う〜ん。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ってライブラリが勝手に設定して良いものなのか疑問かも。

ψ むとう (2002-02-21 21:27)

うーむ。確かに。