[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)
九州工業大学 大学院情報工学研究院 知能情報工学研究系