summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authornagai <nagai@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2008-06-16 18:54:48 +0000
committernagai <nagai@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2008-06-16 18:54:48 +0000
commit9b236f987d4df3a508c2650cc9b1a992923511e8 (patch)
tree1e7f75c13a5f7c0bb296f463154a92900f33afb5
parent5bcfcce7b4c4a87e1af65d2f218e9d8252e16a48 (diff)
* ext/tk/sample/demos-jp/toolber.rb, ext/tk/sample/demos-en/toolber.rb:
fail to back a tear-off marker when reattach the toolbar. * ext/tk/sample/irbtkw.rbw: freezes when receives SIGINT. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_8@17370 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r--ext/tk/sample/demos-en/msgbox2.rb4
-rw-r--r--ext/tk/sample/demos-en/toolbar.rb2
-rw-r--r--ext/tk/sample/demos-jp/msgbox2.rb4
-rw-r--r--ext/tk/sample/demos-jp/toolbar.rb2
-rw-r--r--ext/tk/sample/irbtkw.rbw16
-rw-r--r--ext/tk/tcltklib.c57
6 files changed, 68 insertions, 17 deletions
diff --git a/ext/tk/sample/demos-en/msgbox2.rb b/ext/tk/sample/demos-en/msgbox2.rb
index 6fe6c778b3..136a723c73 100644
--- a/ext/tk/sample/demos-en/msgbox2.rb
+++ b/ext/tk/sample/demos-en/msgbox2.rb
@@ -42,7 +42,7 @@ TkFrame.new(base_frame) {|frame|
TkButton.new(frame) {
text 'Message Box'
- command proc{showMessageBox $msgbox2_demo}
+ command proc{showMessageBox2 $msgbox2_demo}
}.pack('side'=>'left', 'expand'=>'yes')
}.pack('side'=>'bottom', 'fill'=>'x', 'pady'=>'2m')
@@ -79,7 +79,7 @@ $msgboxType = TkVariable.new('ok')
'anchor'=>'w', 'fill'=>'x')
}
-def showMessageBox(w)
+def showMessageBox2(w)
button = Tk.messageBox('icon'=>$msgboxIcon.value, 'type'=>$msgboxType.value,
'title'=>'Message', 'parent'=>w,
'message'=>"\"#{$msgboxType.value}\" Type MessageBox",
diff --git a/ext/tk/sample/demos-en/toolbar.rb b/ext/tk/sample/demos-en/toolbar.rb
index 5cf863717b..633c52c15d 100644
--- a/ext/tk/sample/demos-en/toolbar.rb
+++ b/ext/tk/sample/demos-en/toolbar.rb
@@ -70,7 +70,7 @@ if Tk.windowingsystem != 'aqua'
w.grid_remove
self.wm_manage
# self.wm_title('Toolbar') # if you don't want to use its widget name as a window title.
- self.wm_protocol('WM_DELETE_WINDOW'){ self.untearoff(self) }
+ self.wm_protocol('WM_DELETE_WINDOW'){ self.untearoff(w) }
end
def tbar_base.untearoff(w)
self.wm_forget
diff --git a/ext/tk/sample/demos-jp/msgbox2.rb b/ext/tk/sample/demos-jp/msgbox2.rb
index d61f25129a..e2944c59ed 100644
--- a/ext/tk/sample/demos-jp/msgbox2.rb
+++ b/ext/tk/sample/demos-jp/msgbox2.rb
@@ -41,7 +41,7 @@ TkFrame.new(base_frame) {|frame|
TkButton.new(frame) {
text 'メッセージボックス'
- command proc{showMessageBox $msgbox2_demo}
+ command proc{showMessageBox2 $msgbox2_demo}
}.pack('side'=>'left', 'expand'=>'yes')
}.pack('side'=>'bottom', 'fill'=>'x', 'pady'=>'2m')
@@ -78,7 +78,7 @@ $msgboxType = TkVariable.new('ok')
'anchor'=>'w', 'fill'=>'x')
}
-def showMessageBox(w)
+def showMessageBox2(w)
button = Tk.messageBox('icon'=>$msgboxIcon.value, 'type'=>$msgboxType.value,
'title'=>'Message', 'parent'=>w,
'message'=>"\"#{$msgboxType.value}\"タイプのメッセージボックス",
diff --git a/ext/tk/sample/demos-jp/toolbar.rb b/ext/tk/sample/demos-jp/toolbar.rb
index 9cb3834c34..1bb265d1f8 100644
--- a/ext/tk/sample/demos-jp/toolbar.rb
+++ b/ext/tk/sample/demos-jp/toolbar.rb
@@ -73,7 +73,7 @@ if Tk.windowingsystem != 'aqua'
w.grid_remove
self.wm_manage
# self.wm_title('Toolbar') # もしウィジェット名をウィンドウタイトルにしたくないなら,ここで設定してください
- self.wm_protocol('WM_DELETE_WINDOW'){ self.untearoff(self) }
+ self.wm_protocol('WM_DELETE_WINDOW'){ self.untearoff(w) }
end
def tbar_base.untearoff(w)
self.wm_forget
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 66345bfcb0..ea892f62b3 100644
--- a/ext/tk/tcltklib.c
+++ b/ext/tk/tcltklib.c
@@ -6562,11 +6562,26 @@ ip_eval_real(self, cmd_str, cmd_len)
return rbtk_pending_exception;
}
- if (ptr->return_value == TCL_ERROR) {
+ /* if (ptr->return_value == TCL_ERROR) { */
+ if (ptr->return_value != TCL_OK) {
if (event_loop_abort_on_exc > 0 && !Tcl_InterpDeleted(ptr->ip)) {
volatile VALUE exc;
- exc = create_ip_exc(self, rb_eRuntimeError,
- "%s", Tcl_GetStringResult(ptr->ip));
+
+ switch (ptr->return_value) {
+ case TCL_RETURN:
+ exc = create_ip_exc(self, eTkCallbackReturn,
+ "ip_eval_real receives TCL_RETURN");
+ case TCL_BREAK:
+ exc = create_ip_exc(self, eTkCallbackBreak,
+ "ip_eval_real receives TCL_BREAK");
+ case TCL_CONTINUE:
+ exc = create_ip_exc(self, eTkCallbackContinue,
+ "ip_eval_real receives TCL_CONTINUE");
+ default:
+ exc = create_ip_exc(self, rb_eRuntimeError, "%s",
+ Tcl_GetStringResult(ptr->ip));
+ }
+
rbtk_release_ip(ptr);
rb_thread_critical = thr_crit_bup;
return exc;
@@ -6608,10 +6623,23 @@ ip_eval_real(self, cmd_str, cmd_len)
return rbtk_pending_exception;
}
- if (ptr->return_value == TCL_ERROR) {
+ /* if (ptr->return_value == TCL_ERROR) { */
+ if (ptr->return_value != TCL_OK) {
volatile VALUE exc;
- exc = create_ip_exc(self, rb_eRuntimeError, "%s", ptr->ip->result);
+ switch (ptr->return_value) {
+ case TCL_RETURN:
+ exc = create_ip_exc(self, eTkCallbackReturn,
+ "ip_eval_real receives TCL_RETURN");
+ case TCL_BREAK:
+ exc = create_ip_exc(self, eTkCallbackBreak,
+ "ip_eval_real receives TCL_BREAK");
+ case TCL_CONTINUE:
+ exc = create_ip_exc(self, eTkCallbackContinue,
+ "ip_eval_real receives TCL_CONTINUE");
+ default:
+ exc = create_ip_exc(self, rb_eRuntimeError, "%s", ptr->ip->result);
+ }
rbtk_release_ip(ptr);
return exc;
@@ -7855,11 +7883,24 @@ ip_invoke_core(interp, argc, argv)
rb_thread_critical = thr_crit_bup;
- if (ptr->return_value == TCL_ERROR) {
+ /* if (ptr->return_value == TCL_ERROR) { */
+ if (ptr->return_value != TCL_OK) {
if (event_loop_abort_on_exc > 0 && !Tcl_InterpDeleted(ptr->ip)) {
+ switch (ptr->return_value) {
+ case TCL_RETURN:
+ return create_ip_exc(interp, eTkCallbackReturn,
+ "ip_invoke_core receives TCL_RETURN");
+ case TCL_BREAK:
+ return create_ip_exc(interp, eTkCallbackBreak,
+ "ip_invoke_core receives TCL_BREAK");
+ case TCL_CONTINUE:
+ return create_ip_exc(interp, eTkCallbackContinue,
+ "ip_invoke_core receives TCL_CONTINUE");
+ default:
+ return create_ip_exc(interp, rb_eRuntimeError, "%s",
+ Tcl_GetStringResult(ptr->ip));
+ }
- return create_ip_exc(interp, rb_eRuntimeError,
- "%s", Tcl_GetStringResult(ptr->ip));
} else {
if (event_loop_abort_on_exc < 0) {
rb_warning("%s (ignore)", Tcl_GetStringResult(ptr->ip));