summaryrefslogtreecommitdiff
path: root/ext/tk
diff options
context:
space:
mode:
authornagai <nagai@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2008-06-16 16:54:50 +0000
committernagai <nagai@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2008-06-16 16:54:50 +0000
commit5ebf7049532575d8e57677a4e5bf61753c0c35e4 (patch)
tree55160f1e87398f72f93f5d378e2851aa03ef94de /ext/tk
parent1723931102da715e5d9c8e5fbc8ab3756eaa1151 (diff)
* ext/tk/tcltklib.c: SEGV when exit.
* ext/tk/lib/tk.rb: add a check for safety to Tk.exit. * ext/tk/sample/irbtkw.rbw: freezes when receives SIGINT. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@17368 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'ext/tk')
-rw-r--r--ext/tk/lib/tk.rb6
-rw-r--r--ext/tk/sample/irbtkw.rbw16
-rw-r--r--ext/tk/tcltklib.c10
3 files changed, 23 insertions, 9 deletions
diff --git a/ext/tk/lib/tk.rb b/ext/tk/lib/tk.rb
index 88e47626f5..c3401dfadb 100644
--- a/ext/tk/lib/tk.rb
+++ b/ext/tk/lib/tk.rb
@@ -1110,7 +1110,7 @@ module TkCore
extend TkComm
WITH_RUBY_VM = Object.const_defined?(:VM) && ::VM.class == Class
- WITH_ENCODING = defined?(::Encoding.default_external)
+ WITH_ENCODING = defined?(::Encoding.default_external) && true
#WITH_ENCODING = Object.const_defined?(:Encoding) && ::Encoding.class == Class
unless self.const_defined? :RUN_EVENTLOOP_ON_MAIN_THREAD
@@ -2174,7 +2174,7 @@ module Tk
end
def Tk.exit
- tk_call_without_enc('destroy', '.')
+ TkCore::INTERP.has_mainwindow? && tk_call_without_enc('destroy', '.')
end
################################################
@@ -5501,7 +5501,7 @@ TkWidget = TkWindow
#Tk.freeze
module Tk
- RELEASE_DATE = '2008-06-11'.freeze
+ RELEASE_DATE = '2008-06-17'.freeze
autoload :AUTO_PATH, 'tk/variable'
autoload :TCL_PACKAGE_PATH, 'tk/variable'
diff --git a/ext/tk/sample/irbtkw.rbw b/ext/tk/sample/irbtkw.rbw
index 3fb6dde626..04de3a2022 100644
--- a/ext/tk/sample/irbtkw.rbw
+++ b/ext/tk/sample/irbtkw.rbw
@@ -48,10 +48,20 @@ console.yscrollbar(TkScrollbar.new(top, :width=>10).pack(:before=>console,
:side=>:right,
:expand=>false,
:fill=>:y))
+
+# save original I/O
+out = $stdout
+err = $stderr
+
irb_thread = nil
ev_loop = Thread.new{
- Tk.mainloop
- irb_thread.kill if irb_thread
+ begin
+ Tk.mainloop
+ ensure
+ $stdout = out
+ $stderr = err
+ irb_thread.kill if irb_thread
+ end
}
# window position control
@@ -142,5 +152,5 @@ console.bind('Control-c'){
irb_thread.join
# exit
-ev_thread.kill
+ev_loop.kill
Tk.exit
diff --git a/ext/tk/tcltklib.c b/ext/tk/tcltklib.c
index 0297b175cd..9e14fc4f89 100644
--- a/ext/tk/tcltklib.c
+++ b/ext/tk/tcltklib.c
@@ -4,7 +4,7 @@
* Oct. 24, 1997 Y. Matsumoto
*/
-#define TCLTKLIB_RELEASE_DATE "2008-06-12"
+#define TCLTKLIB_RELEASE_DATE "2008-06-17"
#include "ruby.h"
@@ -448,7 +448,7 @@ static int have_rb_thread_waiting_for_value = 0;
#ifdef RUBY_USE_NATIVE_THREAD
#define DEFAULT_EVENT_LOOP_MAX 800/*counts*/
#define DEFAULT_NO_EVENT_TICK 10/*counts*/
-#define DEFAULT_NO_EVENT_WAIT 10/*milliseconds ( 1 -- 999 ) */
+#define DEFAULT_NO_EVENT_WAIT 1/*milliseconds ( 1 -- 999 ) */
#define WATCHDOG_INTERVAL 10/*milliseconds ( 1 -- 999 ) */
#define DEFAULT_TIMER_TICK 0/*milliseconds ( 0 -- 999 ) */
#define NO_THREAD_INTERRUPT_TIME 100/*milliseconds ( 1 -- 999 ) */
@@ -1555,6 +1555,10 @@ eventloop_sleep(dummy)
{
struct timeval t;
+ if (no_event_wait <= 0) {
+ return Qnil;
+ }
+
t.tv_sec = (time_t)0;
t.tv_usec = (time_t)(no_event_wait*1000.0);
@@ -5096,7 +5100,7 @@ ip_finalize(ip)
}
/* delete root widget */
-#if 1
+#if 0 /* cause SEGV on Ruby 1.9 */
DUMP1("check `destroy'");
if (Tcl_GetCommandInfo(ip, "destroy", &info)) {
DUMP1("call `destroy .'");