From bf0e2520d7103948427adc520047335f55038907 Mon Sep 17 00:00:00 2001 From: nagai Date: Sun, 19 Oct 2014 08:38:35 +0000 Subject: * ext/tk/tcltklib.c: support Tcl/Tk8.6. * ext/tk/lib/tk.rb: ditto. * ext/tk/extconf.rb: ditto. * ext/tk/lib/tk_mac.rb: add new features of Tcl/Tk8.6. * ext/tk/lib/tkextlib/tile/treeview.rb: ditto. * ext/tk/lib/tkextlib/tile/fontchooser.rb: add an alias. * ext/tk/lib/tk/autoload.rb: ditto. * ext/tk/lib/tkextlib/tcllib/validator.rb: add a new feature of tklib extension. * ext/tk/lib/tkextlib/tkimg/dted.rb: a new supported format of Img extension. * ext/tk/lib/tkextlib/tkimg/raw.rb: ditto. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@48018 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ext/tk/extconf.rb | 4 +- ext/tk/lib/tk.rb | 22 ++++- ext/tk/lib/tk/autoload.rb | 2 + ext/tk/lib/tk/fontchooser.rb | 4 + ext/tk/lib/tk/tk_mac.rb | 158 ++++++++++++++++++++++++++++++++ ext/tk/lib/tkextlib/tcllib/validator.rb | 65 +++++++++++++ ext/tk/lib/tkextlib/tile/treeview.rb | 30 ++++++ ext/tk/lib/tkextlib/tkimg/dted.rb | 33 +++++++ ext/tk/lib/tkextlib/tkimg/raw.rb | 33 +++++++ ext/tk/tcltklib.c | 40 +++++--- 10 files changed, 374 insertions(+), 17 deletions(-) create mode 100644 ext/tk/lib/tk/tk_mac.rb create mode 100644 ext/tk/lib/tkextlib/tcllib/validator.rb create mode 100644 ext/tk/lib/tkextlib/tkimg/dted.rb create mode 100644 ext/tk/lib/tkextlib/tkimg/raw.rb (limited to 'ext') diff --git a/ext/tk/extconf.rb b/ext/tk/extconf.rb index 8e20e42ea1..c6a2dd52ff 100644 --- a/ext/tk/extconf.rb +++ b/ext/tk/extconf.rb @@ -9,10 +9,10 @@ TkLib_Config['search_versions'] = # %w[8.9 8.8 8.7 8.6 8.5 8.4 8.3 8.2 8.1 8.0 7.6 4.2] # %w[8.7 8.6 8.5 8.4 8.3 8.2 8.1 8.0] # %w[8.7 8.6 8.5 8.4 8.0] # to shorten search steps - %w[8.5 8.4 8.6] # Tcl/Tk8.6 support is experimental. + %w[8.6 8.5 8.4] TkLib_Config['unsupported_versions'] = - %w[8.8 8.7] # Tcl/Tk8.6 support is experimental. + %w[8.8 8.7] TkLib_Config['major_nums'] = '87' diff --git a/ext/tk/lib/tk.rb b/ext/tk/lib/tk.rb index 5bac92e47c..45f86a9253 100644 --- a/ext/tk/lib/tk.rb +++ b/ext/tk/lib/tk.rb @@ -1309,8 +1309,12 @@ EOS end unless interp.deleted? - #Thread.current[:status].value = TclTkLib.mainloop(false) - Thread.current[:status].value = interp.mainloop(false) + begin + #Thread.current[:status].value = TclTkLib.mainloop(false) + Thread.current[:status].value = interp.mainloop(false) + rescue Exception=>e + puts "ignore exception on interp: #{e.inspect}\n" if $DEBUG + end end ensure @@ -1569,7 +1573,15 @@ EOS EOL =end - at_exit{ INTERP.remove_tk_procs(TclTkLib::FINALIZE_PROC_NAME) } + if !WITH_RUBY_VM || RUN_EVENTLOOP_ON_MAIN_THREAD ### check Ruby 1.9 !!!!!!! + at_exit{ INTERP.remove_tk_procs(TclTkLib::FINALIZE_PROC_NAME) } + else + at_exit{ + Tk.root.destroy + INTERP.remove_tk_procs(TclTkLib::FINALIZE_PROC_NAME) + INTERP_THREAD.kill.join + } + end EventFlag = TclTkLib::EventFlag @@ -5197,6 +5209,8 @@ class TkWindow= 8 static int ip_rbNamespaceObjCmd _((ClientData, Tcl_Interp *, int, @@ -6026,8 +6029,8 @@ ip_rbNamespaceObjCmd(clientData, interp, objc, objv) DUMP2("objc = %d", objc); DUMP2("objv[0] = '%s'", Tcl_GetString(objv[0])); DUMP2("objv[1] = '%s'", Tcl_GetString(objv[1])); - if (!Tcl_GetCommandInfo(interp, "__orig_namespace_command__", &(info))) { - DUMP1("fail to get __orig_namespace_command__"); + if (!Tcl_GetCommandInfo(interp, ORIG_NAMESPACE_CMD, &(info))) { + DUMP1("fail to get "ORIG_NAMESPACE_CMD); Tcl_ResetResult(interp); Tcl_AppendResult(interp, "invalid command name \"namespace\"", (char*)NULL); @@ -6045,7 +6048,7 @@ ip_rbNamespaceObjCmd(clientData, interp, objc, objv) /* Tcl8.6 or later */ int i; Tcl_Obj **cp_objv; - char org_ns_cmd_name[] = "__orig_namespace_command__"; + char org_ns_cmd_name[] = ORIG_NAMESPACE_CMD; DUMP1("call a native-object-proc for tcl8.6 or later"); cp_objv = RbTk_ALLOC_N(Tcl_Obj *, (objc + 1)); @@ -6056,7 +6059,8 @@ ip_rbNamespaceObjCmd(clientData, interp, objc, objv) } cp_objv[objc] = (Tcl_Obj *)NULL; - ret = Tcl_EvalObjv(interp, objc, cp_objv, TCL_EVAL_DIRECT); + /* ret = Tcl_EvalObjv(interp, objc, cp_objv, TCL_EVAL_DIRECT); */ + ret = Tcl_EvalObjv(interp, objc, cp_objv, 0); ckfree((char*)cp_objv); #endif @@ -6115,17 +6119,17 @@ ip_wrap_namespace_command(interp) } if (orig_info.isNativeObjectProc) { - Tcl_CreateObjCommand(interp, "__orig_namespace_command__", + Tcl_CreateObjCommand(interp, ORIG_NAMESPACE_CMD, orig_info.objProc, orig_info.objClientData, orig_info.deleteProc); } else { - Tcl_CreateCommand(interp, "__orig_namespace_command__", + Tcl_CreateCommand(interp, ORIG_NAMESPACE_CMD, orig_info.proc, orig_info.clientData, orig_info.deleteProc); } #else /* tcl8.6 or later */ - Tcl_Eval(interp, "rename namespace __orig_namespace_command__"); + Tcl_Eval(interp, "rename namespace "ORIG_NAMESPACE_CMD); #endif @@ -8493,16 +8497,26 @@ invoke_tcl_proc(arg) #endif { struct invoke_info *inf = (struct invoke_info *)arg; +#if TCL_MAJOR_VERSION >= 8 && TCL_MINOR_VERSION < 6 int i, len; -#if TCL_MAJOR_VERSION >= 8 int argc = inf->objc; char **argv = (char **)NULL; #endif DUMP1("call invoke_tcl_proc"); +#if TCL_MAJOR_VERSION > 8 || (TCL_MAJOR_VERSION == 8 && TCL_MINOR_VERSION >= 6) + /* Tcl/Tk 8.6 or later */ + + /* eval */ + inf->ptr->return_value = Tcl_EvalObjv(inf->ptr->ip, inf->objc, inf->objv, TCL_EVAL_DIRECT); + /* inf->ptr->return_value = Tcl_EvalObjv(inf->ptr->ip, inf->objc, inf->objv, 0); */ + +#else /* Tcl/Tk 7.x, 8.0 -- 8.5 */ + /* memory allocation for arguments of this command */ -#if TCL_MAJOR_VERSION >= 8 +#if TCL_MAJOR_VERSION == 8 + /* Tcl/Tk 8.0 -- 8.5 */ if (!inf->cmdinfo.isNativeObjectProc) { DUMP1("called proc is not a native-obj-proc"); /* string interface */ @@ -8522,7 +8536,8 @@ invoke_tcl_proc(arg) Tcl_ResetResult(inf->ptr->ip); /* Invoke the C procedure */ -#if TCL_MAJOR_VERSION >= 8 +#if TCL_MAJOR_VERSION == 8 + /* Tcl/Tk 8.0 -- 8.5 */ if (inf->cmdinfo.isNativeObjectProc) { DUMP1("call tcl_proc as a native-obj-proc"); inf->ptr->return_value @@ -8532,7 +8547,8 @@ invoke_tcl_proc(arg) else #endif { -#if TCL_MAJOR_VERSION >= 8 +#if TCL_MAJOR_VERSION == 8 + /* Tcl/Tk 8.0 -- 8.5 */ DUMP1("call tcl_proc as not a native-obj-proc"); inf->ptr->return_value = (*(inf->cmdinfo.proc))(inf->cmdinfo.clientData, inf->ptr->ip, @@ -8556,6 +8572,8 @@ invoke_tcl_proc(arg) #endif } +#endif /* Tcl/Tk 8.6 or later || Tcl 7.x, 8.0 -- 8.5 */ + DUMP1("end of invoke_tcl_proc"); return Qnil; } -- cgit v1.2.3