goocanvas 0.90.9のサンプルを動かしてみる

gnomecanvasがdeprecatedになってしまったらしいので、
goocanvasを試してみることにしたらサンプルの実行でいきなりつまづいた。

c:\ruby\lib\ruby\gems\1.9.1\gems\goocanvas-0.90.9-x86-mingw32\sample>ruby demo.r
b
<internal:lib/rubygems/custom_require>:29:in `require': no such file to load --
goocanvas.so (LoadError)
        from <internal:lib/rubygems/custom_require>:29:in `require'
        from c:/ruby/lib/ruby/gems/1.9.1/gems/goocanvas-0.90.9-x86-mingw32/lib/g
oocanvas.rb:3:in `<top (required)>'
        from <internal:lib/rubygems/custom_require>:33:in `require'
        from <internal:lib/rubygems/custom_require>:33:in `rescue in require'
        from <internal:lib/rubygems/custom_require>:29:in `require'
        from demo.rb:39:in `<main>'

これは多分gtk2と同じようなことをしてやれば良いのだろうということでlib/goocanvas.rbを修正してみた。

--- C:/ruby/lib/ruby/gems/1.9.1/gems/goocanvas-0.90.9-x86-mingw32/lib/goocanvas.rb.orig	Sat Jun 11 21:07:33 2011
+++ C:/ruby/lib/ruby/gems/1.9.1/gems/goocanvas-0.90.9-x86-mingw32/lib/goocanvas.rb	Sat Jul 09 00:59:02 2011
@@ -1,6 +1,16 @@
 require 'gtk2'
 require 'cairo'
-require 'goocanvas.so'
+
+base_dir = Pathname.new(__FILE__).dirname.dirname.expand_path
+vendor_dir = base_dir + "vendor" + "local"
+vendor_bin_dir = vendor_dir + "bin"
+GLib.prepend_environment_path(vendor_bin_dir)
+begin
+  major, minor, micro, = RUBY_VERSION.split(/\./)
+  require "#{major}.#{minor}/goocanvas.so"
+rescue LoadError
+  require "goocanvas.so"
+end
 
 module Goo
   LOG_DOMAIN="Goo"

これでとりあえずサンプルを動かすことができるようになった。

demo-fifteen.rbについては1.8だと問題ないけど、1.9だと159行目あたりでuptoのブロック内でretry使っているのが、ひっかかる。