ayucat.ch 2015-16

id:ayucatのぶろぐ (Nexus 5 (2015) / iPhone 6s / Galaxy S6 edge / iOS 9 / Ubuntu Trusty / Android 6.0 Marshmallow / Thunderbird / AWS / クラブ / 祭り / 花火 / 海 / 野外フェス)

Ruby/Tkがさっぱり動かない on Ruby 1.9.1-mswin32

今回は公式バイナリRuby 1.9.1-p129を使ってみることにした。C:\ruby19に展開。

require 'tk'

が固まる。
つまり、

>irb -rtk

でプロンプトさえ出てこないってことさ。

仕方がないので、ググったら、
|ruby-dev:38752| Re: |1.8.7||1.9.1||tk| 自前実装の拡張 widget を使いたい場合 (2009-07-08)
が見つかったけど、当てにならず。
もうちょっとスレッドを追うと、たった15時間ほど前にMLに投稿されたばかりの、cygwin上のruby/tk w/ ruby 1.9.1のトラブル
|ruby-dev:38805| Re: |1.8.7||1.9.1||tk| 自前実装の拡張 widget を使いたい場合 (2009-07-16)
が見つかって、解決しそうな雰囲気、未定。
cygwinでなくても、mswin32なら、逃げさせるように修正:

>diff -u c:\ruby19\lib\ruby\1.9.1\tk.rb.orig c:\ruby19\lib\ruby\1.9.1\tk.rb
--- c:\ruby19\lib\ruby\1.9.1\tk.rb.orig Fri Jan 16 00:35:58 2009
+++ c:\ruby19\lib\ruby\1.9.1\tk.rb      Fri Jul 17 04:54:49 2009
@@ -1133,7 +1133,10 @@
     if WITH_RUBY_VM ### check Ruby 1.9 !!!!!!!
       # *** NEED TO FIX ***
       ip = TclTkIp.new(name, opts)
-      if ip._invoke_without_enc('tk', 'windowingsystem') == 'aqua' &&
+      if RUBY_PLATFORM =~ /cygwin|mswin32/
+        RUN_EVENTLOOP_ON_MAIN_THREAD = true
+        INTERP = ip
+      elsif ip._invoke_without_enc('tk', 'windowingsystem') == 'aqua' &&
           (TclTkLib.get_version <=> [8,4,TclTkLib::RELEASE_TYPE::FINAL,9]) > 0
         # *** KNOWN BUG ***
         #   Main event loop thread of TkAqua (> Tk8.4.9) must be the main

って具合。
これで、なんとか固まらなくなったよ、やっと。
なんとタイムリーなお話なんだ。。。ったく。