Ubuntu 10.10 の Ruby 1.9.1 で Rabbit 0.9.0 を動かす

Rabbit 0.9.0 がリリースされていたので使ってみようと思って、せっかくだから Ruby 1.9.1 で動かそうと試みました。

いろいろやったんですが、たぶん次の手順でいけると思います。

$ sudo aptitude install ruby1.9.1 ruby1.9.1-dev libcairo2-dev
  libpango1.0-dev libatk1.0-dev libgtk2.0-dev librsvg2-dev libpoppler-glib-dev
$ wget http://www.moonwolf.com/ruby/archive/rdtool-0.6.22.tar.gz
$ tar xpvfz rdtool-0.6.22.tar.gz
$ cd rdtool-0.6.22
$ sudo ruby1.9.1 ./setup.rb
$ sudo gem1.9.1 install rabbit

これで /var/lib/gems/1.9.1/bin/rabbit を実行すれば動く… はずなのですが動きません。

% /var/lib/gems/1.9.1/bin/rabbit
/var/lib/gems/1.9.1/gems/rabbit-0.9.0/lib/rabbit/keys.rb:8:in `<module:Keys>': uninitialized constant Gdk::Keyval::GDK_Escape (NameError)
	from /var/lib/gems/1.9.1/gems/rabbit-0.9.0/lib/rabbit/keys.rb:5:in `<module:Rabbit>'
	from /var/lib/gems/1.9.1/gems/rabbit-0.9.0/lib/rabbit/keys.rb:4:in `<top (required)>'
	from <internal:lib/rubygems/custom_require>:29:in `require'
	from <internal:lib/rubygems/custom_require>:29:in `require'
	from /var/lib/gems/1.9.1/gems/rabbit-0.9.0/lib/rabbit/logger/gui.rb:3:in `<top (required)>'
...以下略...

Gdk::Keyval::GDK_Escape なんて定数がないのが原因みたいです。Gdk::Keyval::GDK_KEY_Escape ならあります。

% ruby1.9.1 -rgtk2 -e 'Gdk::Keyval::GDK_Escape'
-e:1:in `<main>': uninitialized constant Gdk::Keyval::GDK_Escape (NameError)
% ruby1.9.1 -rgtk2 -e 'Gdk::Keyval::GDK_KEY_Escape'

Ruby の Gtk ライブラリは、C の Gtk のヘッダファイルにある定数をもとに、Ruby の定数を作っているので、おそらく Gtk のバージョンによるものだと思います。

Gtk ライブラリは gem で勝手にインストールされたものなので、いじるのは面倒だから Rabbit 側をいじって対処してみます。

--- /var/lib/gems/1.9.1/gems/rabbit-0.9.0/lib/rabbit/keys.rb.orig	2010-10-21 19:31:36.375808179 +0900
+++ /var/lib/gems/1.9.1/gems/rabbit-0.9.0/lib/rabbit/keys.rb	2010-10-21 19:48:14.221358661 +0900
@@ -1,6 +1,12 @@
 require "gtk2"
 require "rabbit/utils"
 
+Gdk::Keyval.constants.each do |c|
+  if c.to_s =~ /\AGDK_KEY_(.*)\z/
+    Gdk::Keyval.const_set("GDK_#{$1}", Gdk::Keyval.const_get(c))
+  end
+end
+
 module Rabbit
   module Keys
 

Gdk::Keyval::GDK_KEY_xxx があったら Gdk::Keyval::GDK_xxx を定義しています。どこでも良かったんですが、keys.rb でエラーになったので、その先頭に入れてみました。

これでちゃんと動くようになりました。

…が、全画面表示にするなどウィンドウをリサイズすると、表示が崩れてしまいます。
落ちはしないのですが、端末にはこんなエラー出てます。

/var/lib/gems/1.9.1/gems/rabbit-0.9.0/lib/rabbit/renderer/engine/gdk.rb: line 176
   Gdk-CRITICAL **:IA__gdk_gc_new: assertion `drawable != NULL' failed
[WARNING]
RuntimeError: failed to initialize
/var/lib/gems/1.9.1/gems/rabbit-0.9.0/lib/rabbit/renderer/engine/gdk.rb:176:in `initialize'
/var/lib/gems/1.9.1/gems/rabbit-0.9.0/lib/rabbit/renderer/engine/gdk.rb:176:in `new'
/var/lib/gems/1.9.1/gems/rabbit-0.9.0/lib/rabbit/renderer/engine/gdk.rb:176:in `init_engine_color'
/var/lib/gems/1.9.1/gems/rabbit-0.9.0/lib/rabbit/renderer/display/drawing-area.rb:22:in `init_color'
/var/lib/gems/1.9.1/gems/rabbit-0.9.0/lib/rabbit/renderer/base.rb:228:in `clear_theme'
/var/lib/gems/1.9.1/gems/rabbit-0.9.0/lib/rabbit/canvas.rb:718:in `clear_theme'
/var/lib/gems/1.9.1/gems/rabbit-0.9.0/lib/rabbit/canvas.rb:655:in `_apply_theme'
/var/lib/gems/1.9.1/gems/rabbit-0.9.0/lib/rabbit/canvas.rb:307:in `apply_theme'
/var/lib/gems/1.9.1/gems/rabbit-0.9.0/lib/rabbit/canvas.rb:323:in `reload_theme'
/var/lib/gems/1.9.1/gems/rabbit-0.9.0/lib/rabbit/action/basic.rb:118:in `act_reload_theme'
...以下略...

これはちょっと自分の手には負えないので、あきらめました。リサイズしなければ良いので、全画面表示にしたい場合は -f オプションつきで起動すれば最初から全画面表示になります。