[#45670] ruby-1.9.1-preview2のruby-tk on OSX — 天野竜太郎 <wn9r-amn@...>

天野です。

40 messages 2008/12/02
[#45673] Re: ruby-1.9.1-preview2のruby-tk on OSX — Nobuyoshi Nakada <nobu@...> 2008/12/03

なかだです。

[#45676] Re: ruby-1.9.1-preview2のruby-tk on OSX — 天野竜太郎 <wn9r-amn@...> 2008/12/03

天野です。

[#45678] Re: ruby-1.9.1-preview2のruby-tk on OSX — Nobuyoshi Nakada <nobu@...> 2008/12/03

なかだです。

[#45680] Re: ruby-1.9.1-preview2のruby-tk on OSX — Hidetoshi NAGAI <nagai@...> 2008/12/03

永井@知能.九工大です.

[#45701] Re: ruby-1.9.1-preview2のruby-tk on OSX — 天野竜太郎 <wn9r-amn@...> 2008/12/04

天野です。報告遅れてすみません。

[#45707] Re: ruby-1.9.1-preview2のruby-tk on OSX — Hidetoshi NAGAI <nagai@...> 2008/12/05

永井@知能.九工大です.

[#45708] Re: ruby-1.9.1-preview2のruby-tk on OSX — 天野竜太郎 <wn9r-amn@...> 2008/12/07

天野です。

[#45709] Re: ruby-1.9.1-preview2のruby-tk on OSX — Hidetoshi NAGAI <nagai@...> 2008/12/07

永井@知能.九工大です.

[#45710] Re: ruby-1.9.1-preview2のruby-tk on OSX — 天野竜太郎 <wn9r-amn@...> 2008/12/08

天野です。

[#45711] Re: ruby-1.9.1-preview2のruby-tk on OSX — Hidetoshi NAGAI <nagai@...> 2008/12/08

永井@知能.九工大です.

[#45712] Re: ruby-1.9.1-preview2のruby-tk on OSX — 天野竜太郎 <wn9r-amn@...> 2008/12/08

天野です。

[#45713] Re: ruby-1.9.1-preview2のruby-tk on OSX — Hidetoshi NAGAI <nagai@...> 2008/12/08

永井@知能.九工大です.

[#45714] Re: ruby-1.9.1-preview2のruby-tk on OSX — 天野竜太郎 <wn9r-amn@...> 2008/12/08

天野です。

[#45715] Re: ruby-1.9.1-preview2のruby-tk on OSX — Hidetoshi NAGAI <nagai@...> 2008/12/08

永井@知能.九工大です.

[#45716] Re: ruby-1.9.1-preview2のruby-tk on OSX — 天野竜太郎 <wn9r-amn@...> 2008/12/08

天野です。

[#45717] Re: ruby-1.9.1-preview2のruby-tk on OSX — Hidetoshi NAGAI <nagai@...> 2008/12/08

永井@知能.九工大です.

[#45721] Re: ruby-1.9.1-preview2のruby-tk on OSX — Hidetoshi NAGAI <nagai@...> 2008/12/17

天野さん,

[#45722] Re: ruby-1.9.1-preview2のruby-tk on OSX — 天野竜太郎 <wn9r-amn@...> 2008/12/17

天野です。

[#45725] Re: ruby-1.9.1-preview2のruby-tk on OSX — Hidetoshi NAGAI <nagai@...> 2008/12/17

永井@知能.九工大です.

[#45726] Re: ruby-1.9.1-preview2のruby-tk on OSX — Hidetoshi NAGAI <nagai@...> 2008/12/18

永井@知能.九工大です.

[#45727] Re: ruby-1.9.1-preview2のruby-tk on OSX — 天野竜太郎 <wn9r-amn@...> 2008/12/19

天野です。

[ruby-list:45738] Re: ruby-1.9.1-preview2のruby-tk on OSX

From: Hidetoshi NAGAI <nagai@...>
Date: 2008-12-21 08:17:19 UTC
List: ruby-list #45738
永井@知能.九工大です.

From: 天野竜太郎 <wn9r-amn@asahi-net.or.jp>
Subject: [ruby-list:45735] Re: ruby-1.9.1-preview2のruby-tk on OSX
Date: Sun, 21 Dec 2008 15:47:44 +0900
Message-ID: <360438E7-EFAF-49EC-9399-416E23FB8427@asahi-net.or.jp>
> ruby-1.9.1-preview2に
> ruby-list:45673の中田さんのpatch+ruby-list:45730の永井さんの 
> patchを当てた状態で、
> buildして
> 
> $ ~/ruby191/bin/ruby ext/tk/sample/demos-jp/widget
> /Users/ryutaro/ruby191/lib/ruby/1.9.1/tk.rb:1863: [BUG] Bus Error

うぅ,厳しいですね...(;_;)

module TkCore; RUN_EVENTLOOP_ON_MAIN_THREAD = true; end
を頭で実行しておけば動くということですから (でしたよね?),
最初に初期化を行った Tcl/Tk インタープリタでなければダメ
ということなのでしょうか...

かなり不細工なことになってしまってますが,以下ではどうでしょう?

Index: tk.rb
===================================================================
--- tk.rb	(revision 20902)
+++ tk.rb	(working copy)
@@ -1112,19 +1112,6 @@
   WITH_RUBY_VM  = Object.const_defined?(:RubyVM) && ::RubyVM.class == Class
   WITH_ENCODING = defined?(::Encoding.default_external) && true
   #WITH_ENCODING = Object.const_defined?(:Encoding) && ::Encoding.class == Class
-  #if TclTkLib::WINDOWING_SYSTEM == 'aqua'
-  #  if (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 
-  #    #   application thread. So, ruby1.9 users must call Tk.mainloop on 
-  #    #   the main application thread.
-  #    RUN_EVENTLOOP_ON_MAIN_THREAD = true
-  #  end
-  #end
-  unless self.const_defined? :RUN_EVENTLOOP_ON_MAIN_THREAD
-    ### Ruby 1.9 !!!!!!!!!!!!!!!!!!!!!!!!!!
-    RUN_EVENTLOOP_ON_MAIN_THREAD = false
-  end
 
   unless self.const_defined? :INTERP
     if self.const_defined? :IP_NAME
@@ -1143,8 +1130,36 @@
       opts = ''
     end
 
+    if WITH_RUBY_VM ### check Ruby 1.9 !!!!!!!
+      # *** NEED TO FIX ***
+      ip = TclTkIp.new(name, opts)
+      if 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 
+        #   application thread. So, ruby1.9 users must call Tk.mainloop on 
+        #   the main application thread.
+        RUN_EVENTLOOP_ON_MAIN_THREAD = true
+        INTERP = ip
+      else
+        unless self.const_defined? :RUN_EVENTLOOP_ON_MAIN_THREAD
+          RUN_EVENTLOOP_ON_MAIN_THREAD = false
+        end
+        if RUN_EVENTLOOP_ON_MAIN_THREAD
+          INTERP = ip
+        else
+          ip.delete
+        end
+      end
+      ip = nil
+    else
+      unless self.const_defined? :RUN_EVENTLOOP_ON_MAIN_THREAD
+        RUN_EVENTLOOP_ON_MAIN_THREAD = false
+      end
+    end
+
     if !WITH_RUBY_VM || RUN_EVENTLOOP_ON_MAIN_THREAD ### check Ruby 1.9 !!!!!!!
-      INTERP = TclTkIp.new(name, opts)
+      INTERP = TclTkIp.new(name, opts) unless self.const_defined? :INTERP
     else
       INTERP_MUTEX = Mutex.new
       INTERP_ROOT_CHECK = ConditionVariable.new
@@ -1316,6 +1331,11 @@
     end
   end
 
+  unless self.const_defined? :RUN_EVENTLOOP_ON_MAIN_THREAD
+    ### Ruby 1.9 !!!!!!!!!!!!!!!!!!!!!!!!!!
+    RUN_EVENTLOOP_ON_MAIN_THREAD = false
+  end
+
   WIDGET_DESTROY_HOOK = '<WIDGET_DESTROY_HOOK>'
   INTERP._invoke_without_enc('event', 'add', 
                              "<#{WIDGET_DESTROY_HOOK}>", '<Destroy>')
@@ -1683,12 +1703,13 @@
       TclTkLib.mainloop(check_root)
 
     elsif TkCore::RUN_EVENTLOOP_ON_MAIN_THREAD
-      #if TclTkLib::WINDOWING_SYSTEM == 'aqua' && 
-      #    Thread.current != Thread.main && 
-      #    (TclTkLib.get_version <=> [8,4,TclTkLib::RELEASE_TYPE::FINAL,9]) > 0
-      #  raise RuntimeError, 
-      #       "eventloop on TkAqua ( > Tk8.4.9 ) works on the main thread only"
-      #end
+      # if TclTkLib::WINDOWING_SYSTEM == 'aqua' && 
+      if TkCore::INTERP._invoke_without_enc('tk','windowingsystem')=='aqua' &&
+          Thread.current != Thread.main && 
+          (TclTkLib.get_version <=> [8,4,TclTkLib::RELEASE_TYPE::FINAL,9]) > 0
+        raise RuntimeError, 
+              "eventloop on TkAqua ( > Tk8.4.9 ) works on the main thread only"
+      end
       TclTkLib.mainloop(check_root)
 
     else ### Ruby 1.9 !!!!!
@@ -5529,7 +5550,7 @@
 #Tk.freeze
 
 module Tk
-  RELEASE_DATE = '2008-12-04'.freeze
+  RELEASE_DATE = '2008-12-21'.freeze
 
   autoload :AUTO_PATH,        'tk/variable'
   autoload :TCL_PACKAGE_PATH, 'tk/variable'

-- 
永井 秀利  (nagai@ai.kyutech.ac.jp)
九州工業大学 大学院情報工学研究院 知能情報工学研究系

In This Thread