From: Hidetoshi NAGAI Date: 2009-04-09T06:32:50+09:00 Subject: Re: Ruby 1.9.1 + Tk problem From: Diego.Virasoro@gmail.com Subject: Re: Ruby 1.9.1 + Tk problem Date: Wed, 8 Apr 2009 23:45:08 +0900 Message-ID: <3fe5f7f1-8d30-49eb-ba41-4ad1c1e021f3@l25g2000vba.googlegroups.com> > > First of all, does the following work fine? > Yep. It does. > > Tell me what to test next. :) Well, could you try the following patch? --- tk.rb.orig 2009-04-07 06:04:22.000000000 +0900 +++ tk.rb 2009-04-09 06:27:07.000000000 +0900 @@ -1130,30 +1130,30 @@ 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 + unless self.const_defined? :RUN_EVENTLOOP_ON_MAIN_THREAD + 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 - ip.delete + 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 - end - ip = nil - else - unless self.const_defined? :RUN_EVENTLOOP_ON_MAIN_THREAD + ip = nil + else RUN_EVENTLOOP_ON_MAIN_THREAD = false end end @@ -1202,6 +1202,9 @@ INTERP_THREAD_STATUS = INTERP_THREAD[:status] end + # WINDOWING_SYSTEM = TclTkLib::WINDOWING_SYSTEM + WINDOWING_SYSTEM = INTERP._invoke_without_enc('tk', 'windowingsystem') + def INTERP.__getip self end @@ -1703,12 +1706,15 @@ TclTkLib.mainloop(check_root) elsif TkCore::RUN_EVENTLOOP_ON_MAIN_THREAD - # 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" + if Thread.current != Thread.main + msg = 'eventloop on ' + if TkCore::WINDOWING_SYSTEM == 'aqua' && + (TclTkLib.get_version<=>[8,4,TclTkLib::RELEASE_TYPE::FINAL,9]) > 0 + msg << "TkAqua ( > Tk8.4.9 )" + else + msg << "your current environment (or setting)" + end + raise RuntimeError, msg << " works on the main thread only" end TclTkLib.mainloop(check_root) -- Hidetoshi NAGAI (nagai@ai.kyutech.ac.jp)