From: Hidetoshi NAGAI Date: 2003-10-26T16:27:11+09:00 Subject: [ruby-list:38674] Re: Ruby/Tkの終了時の挙動 永井@知能.九工大です. From: Shigeaki Kinoshita Subject: [ruby-list:38673] Re: Ruby/Tkの終了時の挙動 Date: Sun, 26 Oct 2003 13:05:27 +0900 Message-ID: <20031026124552.4C94.QZT05560@nifty.ne.jp> > 『Rubyアプリケーションプログラム』を読んで勉強しています。 お読みいただき,ありがとうございます. > > root widget を破壊するには例えば TkRoot.new.destroy > > ですが,この場合にやりたいことにイメージとして近いのは > > Tk.exit (実体は Tk 上での 'destry .' の実行) でしょうね. > proc{exit} を proc{TkRoot.new.destroy} と proc{Tk.exit} の > それぞれに変更して試してみました。 > 結果、mswin版、cygwin版どちらも正常終了するようになりました。 そうですか.それは良かったです. では,ちょっとお願いがあるのですが, 次の修正を ext/tcltklib/tcltklib.c の ip_ruby() 関数に 適用した上で proc{exit} の形式を試してみていただけますか. 予想が正しければ,この修正で proc{exit} でも 正常終了するのではないかと思います. テストがうまくいったなら,修正を取り込むようにします. --- tcltklib.c.orig 2003-07-30 14:38:21.000000000 +0900 +++ tcltklib.c 2003-10-26 16:24:29.000000000 +0900 @@ -590,7 +590,8 @@ rb_trap_immediate = 0; res = rb_rescue2(rb_eval_string, (VALUE)arg, ip_eval_rescue, (VALUE)&failed, - rb_eStandardError, rb_eScriptError, (VALUE)0); + rb_eStandardError, rb_eScriptError, rb_eSystemExit, + (VALUE)0); rb_trap_immediate = old_trapflg; Tcl_ResetResult(interp); @@ -601,6 +602,9 @@ return TCL_BREAK; } else if (eclass == eTkCallbackContinue) { return TCL_CONTINUE; + } else if (eclass == rb_eSystemExit) { + Tcl_Eval(interp, "destroy ."); + rb_raise(rb_eSystemExit, StringValuePtr(failed)); } else { return TCL_ERROR; } -- 永井 秀利 (九工大 知能情報) nagai@ai.kyutech.ac.jp