* ext/tcltklib/tcltklib.c: fix SEGV bug; trouble on canceling remained

after scripts [ruby-dev:25479]: NULL current namespce when deleting
  Tk interpreter [ruby-talk:126225]
* ext/tcltklib/extconf.rb: bug fix; TCL_ENABLE_THREAD flag is inverted
  [ruby-talk:126360]
* ext/tcltklib/extconf.rb: add yet another native-thread check
* ext/tk/tkutil.c: fix SEGV bug; NULL string pointer when finalize
  Ruby interpreter
* ext/tk/lib/multi-tk.rb: avoid warning for deleted safeTk ip frame
* ext/tk/lib/tk/bindtag.rb: bug fix; new method of named bindtag
  doesn't return the created object [ruby-dev:25479]
* ext/tk/lib/tk/menu.rb: bug on treating arguments [ruby-dev:25479]
* ext/tk/lib/tk.rb: bug fix; cannot accept a callback ID string for
  a command argument [ruby-dev:25479]
* ext/tk/lib/multi-tk.rb: ditto
* ext/tk/lib/tk/*.rb: ditto
* ext/tk/lib/tkextlib/*.rb: ditto
* ext/tk/sample/demos-jp/anilabel.rb: new demo script
* ext/tk/sample/demos-en/anilabel.rb: ditto
* ext/tk/sample/tkHTML/ss.rb: local variable scope bug fix
  [ruby-dev:25479]


git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@7821 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
nagai 2005-01-25 05:09:22 +00:00
parent 586d308ecf
commit 10484e5c95
31 changed files with 639 additions and 105 deletions

View File

@ -1,3 +1,40 @@
Tue Jan 25 14:05:52 2005 Hidetoshi NAGAI <nagai@ai.kyutech.ac.jp>
* ext/tcltklib/tcltklib.c: fix SEGV bug; trouble on canceling remained
after scripts [ruby-dev:25479]: NULL current namespce when deleting
Tk interpreter [ruby-talk:126225]
* ext/tcltklib/extconf.rb: bug fix; TCL_ENABLE_THREAD flag is inverted
[ruby-talk:126360]
* ext/tcltklib/extconf.rb: add yet another native-thread check
* ext/tk/tkutil.c: fix SEGV bug; NULL string pointer when finalize
Ruby interpreter
* ext/tk/lib/multi-tk.rb: avoid warning for deleted safeTk ip frame
* ext/tk/lib/tk/bindtag.rb: bug fix; new method of named bindtag
doesn't return the created object [ruby-dev:25479]
* ext/tk/lib/tk/menu.rb: bug on treating arguments [ruby-dev:25479]
* ext/tk/lib/tk.rb: bug fix; cannot accept a callback ID string for
a command argument [ruby-dev:25479]
* ext/tk/lib/multi-tk.rb: ditto
* ext/tk/lib/tk/*.rb: ditto
* ext/tk/lib/tkextlib/*.rb: ditto
* ext/tk/sample/demos-jp/anilabel.rb: new demo script
* ext/tk/sample/demos-en/anilabel.rb: ditto
* ext/tk/sample/tkHTML/ss.rb: local variable scope bug fix
[ruby-dev:25479]
Mon Jan 24 16:00:53 2005 NARUSE, Yui <naruse@ruby-lang.org> Mon Jan 24 16:00:53 2005 NARUSE, Yui <naruse@ruby-lang.org>
* ext/nkf/lib/kconv.rb (guess_old): not use NKF.guess_old * ext/nkf/lib/kconv.rb (guess_old): not use NKF.guess_old

View File

@ -166,6 +166,15 @@ def pthread_check()
# tcl-thread is unknown # tcl-thread is unknown
if try_run(<<EOF) if try_run(<<EOF)
#include <tcl.h> #include <tcl.h>
int main() {
Tcl_Interp *ip;
ip = Tcl_CreateInterp();
exit((Tcl_Eval(ip, "set tcl_platform(threaded)") == TCL_OK)? 0: 1);
}
EOF
tcl_enable_thread = true
elsif try_run(<<EOF)
#include <tcl.h>
static Tcl_ThreadDataKey dataKey; static Tcl_ThreadDataKey dataKey;
int main() { exit((Tcl_GetThreadData(&dataKey, 1) == dataKey)? 1: 0); } int main() { exit((Tcl_GetThreadData(&dataKey, 1) == dataKey)? 1: 0); }
EOF EOF
@ -230,11 +239,11 @@ EOF
** **
***************************************************************************** *****************************************************************************
') ')
$CPPFLAGS += ' -DWITH_TCL_ENABLE_THREAD=0' $CPPFLAGS += ' -DWITH_TCL_ENABLE_THREAD=1'
return false return false
else else
# ruby -> disable && tcl -> disable # ruby -> disable && tcl -> disable
$CPPFLAGS += ' -DWITH_TCL_ENABLE_THREAD=1' $CPPFLAGS += ' -DWITH_TCL_ENABLE_THREAD=0'
return true return true
end end
end end

View File

@ -4,7 +4,7 @@
* Oct. 24, 1997 Y. Matsumoto * Oct. 24, 1997 Y. Matsumoto
*/ */
#define TCLTKLIB_RELEASE_DATE "2004-12-27" #define TCLTKLIB_RELEASE_DATE "2005-01-25"
#include "ruby.h" #include "ruby.h"
#include "rubysig.h" #include "rubysig.h"
@ -74,8 +74,8 @@ const char tcltklib_release_date[] = TCLTKLIB_RELEASE_DATE;
static char *finalize_hook_name = "INTERP_FINALIZE_HOOK"; static char *finalize_hook_name = "INTERP_FINALIZE_HOOK";
/* to cancel remained after-scripts when deleting IP */ /* to cancel remained after-scripts when deleting IP */
#define REMAINED_AFTER_IDS_VAR "__ruby_tcltklib_remained_after_script_list__" #define CANCEL_AFTER_SCRIPTS "__ruby_tcltklib_cancel_after_scripts__"
#define CANCEL_REMAINED_AFTER_IDS "foreach id $__ruby_tcltklib_remained_after_script_list__ {after cancel $id}" #define DEF_CANCEL_AFTER_SCRIPTS_PROC "proc __ruby_tcltklib_cancel_after_scripts__ {} {foreach id [after info] {after cancel $id}}"
/* for callback break & continue */ /* for callback break & continue */
static VALUE eTkCallbackReturn; static VALUE eTkCallbackReturn;
@ -204,6 +204,14 @@ static int ip_ruby_eval _((ClientData, Tcl_Interp *, int, char **));
static int ip_ruby_cmd _((ClientData, Tcl_Interp *, int, char **)); static int ip_ruby_cmd _((ClientData, Tcl_Interp *, int, char **));
#endif #endif
static int ip_null_namespace _((Tcl_Interp *));
#if TCL_MAJOR_VERSION >= 8
#ifndef Tcl_GetCurrentNamespace
EXTERN Tcl_Namespace * Tcl_GetCurrentNamespace _((Tcl_Interp *));
#endif
#endif
/*---- class TclTkIp ----*/ /*---- class TclTkIp ----*/
struct tcltkip { struct tcltkip {
Tcl_Interp *ip; /* the interpreter */ Tcl_Interp *ip; /* the interpreter */
@ -1881,7 +1889,7 @@ ip_InterpExitCommand(clientData, interp, argc, argv)
char *argv[]; char *argv[];
#endif #endif
{ {
if (!Tcl_InterpDeleted(interp)) { if (!Tcl_InterpDeleted(interp) && !ip_null_namespace(interp)) {
Tcl_Preserve(interp); Tcl_Preserve(interp);
Tcl_Eval(interp, "interp eval {} {destroy .}; interp delete {}"); Tcl_Eval(interp, "interp eval {} {destroy .}; interp delete {}");
Tcl_Release(interp); Tcl_Release(interp);
@ -3261,10 +3269,13 @@ VALUE del_root(ip)
if (!Tcl_InterpDeleted(ip)) { if (!Tcl_InterpDeleted(ip)) {
Tcl_Preserve(ip); Tcl_Preserve(ip);
while((main_win = Tk_MainWindow(ip)) != (Tk_Window)NULL) {
if ( (main_win = Tk_MainWindow(ip)) != (Tk_Window)NULL
&& !(((Tk_FakeWin*)main_win)->flags & TK_ALREADY_DEAD) ) {
DUMP1("wait main_win is destroyed"); DUMP1("wait main_win is destroyed");
Tk_DestroyWindow(main_win); Tk_DestroyWindow(main_win);
} }
Tcl_Release(ip); Tcl_Release(ip);
} }
return Qnil; return Qnil;
@ -3277,9 +3288,15 @@ delete_slaves(ip)
{ {
Tcl_Interp *slave; Tcl_Interp *slave;
Tcl_Obj *slave_list, *elem; Tcl_Obj *slave_list, *elem;
Tcl_CmdInfo info;
char *slave_name; char *slave_name;
int i, len; int i, len;
if (Tcl_InterpDeleted(ip) || ip_null_namespace(ip)) {
DUMP2("call delete_slaves() for deleted ip(%lx)", ip);
return;
}
DUMP2("delete slaves of ip(%lx)", ip); DUMP2("delete slaves of ip(%lx)", ip);
Tcl_Preserve(ip); Tcl_Preserve(ip);
@ -3316,14 +3333,18 @@ delete_slaves(ip)
Tcl_Preserve(slave); Tcl_Preserve(slave);
if (!Tcl_InterpDeleted(slave)) { if (!Tcl_InterpDeleted(slave) && !ip_null_namespace(slave)) {
if (Tcl_Eval(slave, "after info") == TCL_OK if (Tcl_Eval(slave, DEF_CANCEL_AFTER_SCRIPTS_PROC) == TCL_OK) {
&& Tcl_SetVar(slave, if (Tcl_GetCommandInfo(slave, CANCEL_AFTER_SCRIPTS, &info)) {
REMAINED_AFTER_IDS_VAR, DUMP2("call cancel after scripts proc '%s'",
Tcl_GetStringResult(slave), CANCEL_AFTER_SCRIPTS);
TCL_GLOBAL_ONLY) != (char *)NULL) { Tcl_Eval(slave, CANCEL_AFTER_SCRIPTS);
DUMP1("cancel after scripts"); }
Tcl_Eval(slave, CANCEL_REMAINED_AFTER_IDS); }
if (Tcl_GetCommandInfo(slave, finalize_hook_name, &info)) {
DUMP2("call finalize hook proc '%s'", finalize_hook_name);
Tcl_Eval(slave, finalize_hook_name);
} }
} }
@ -3332,12 +3353,16 @@ delete_slaves(ip)
/* delete slave */ /* delete slave */
del_root(slave); del_root(slave);
while(!Tcl_InterpDeleted(slave)) { /* while(!rbtk_InterpDeleted(slave)) { */
if (!Tcl_InterpDeleted(slave)) {
DUMP1("wait ip is deleted"); DUMP1("wait ip is deleted");
Tcl_DeleteInterp(slave); Tcl_DeleteInterp(slave);
} }
Tcl_Release(slave); Tcl_Release(slave);
/* delete slave_name command */
Tcl_DeleteCommand(ip, slave_name);
} }
Tcl_DecrRefCount(slave_list); Tcl_DecrRefCount(slave_list);
@ -3359,7 +3384,7 @@ ip_free(ptr)
DUMP2("IP ref_count = %d", ptr->ref_count); DUMP2("IP ref_count = %d", ptr->ref_count);
if (!Tcl_InterpDeleted(ptr->ip)) { if (!Tcl_InterpDeleted(ptr->ip) && !ip_null_namespace(ptr->ip)) {
DUMP2("IP(%lx) is not deleted", ptr->ip); DUMP2("IP(%lx) is not deleted", ptr->ip);
/* Tcl_Preserve(ptr->ip); */ /* Tcl_Preserve(ptr->ip); */
rbtk_preserve_ip(ptr); rbtk_preserve_ip(ptr);
@ -3368,13 +3393,12 @@ ip_free(ptr)
Tcl_ResetResult(ptr->ip); Tcl_ResetResult(ptr->ip);
if (Tcl_Eval(ptr->ip, "after info") == TCL_OK if (Tcl_Eval(ptr->ip, DEF_CANCEL_AFTER_SCRIPTS_PROC) == TCL_OK) {
&& Tcl_SetVar(ptr->ip, if (Tcl_GetCommandInfo(ptr->ip, CANCEL_AFTER_SCRIPTS, &info)) {
REMAINED_AFTER_IDS_VAR, DUMP2("call cancel after scripts proc '%s'",
Tcl_GetStringResult(ptr->ip), CANCEL_AFTER_SCRIPTS);
TCL_GLOBAL_ONLY) != (char *)NULL) { Tcl_Eval(ptr->ip, CANCEL_AFTER_SCRIPTS);
DUMP1("cancel after scripts"); }
Tcl_Eval(ptr->ip, CANCEL_REMAINED_AFTER_IDS);
} }
if (Tcl_GetCommandInfo(ptr->ip, finalize_hook_name, &info)) { if (Tcl_GetCommandInfo(ptr->ip, finalize_hook_name, &info)) {
@ -3382,10 +3406,11 @@ ip_free(ptr)
Tcl_Eval(ptr->ip, finalize_hook_name); Tcl_Eval(ptr->ip, finalize_hook_name);
} }
del_root(ptr->ip); /* del_root(ptr->ip); */
DUMP1("delete interp"); DUMP1("delete interp");
while(!Tcl_InterpDeleted(ptr->ip)) { /* while(!rbtk_InterpDeleted(ptr->ip)) { */
if (!Tcl_InterpDeleted(ptr->ip)) {
DUMP1("wait ip is deleted"); DUMP1("wait ip is deleted");
Tcl_DeleteInterp(ptr->ip); Tcl_DeleteInterp(ptr->ip);
} }
@ -3843,24 +3868,34 @@ static VALUE
ip_delete(self) ip_delete(self)
VALUE self; VALUE self;
{ {
Tcl_CmdInfo info;
struct tcltkip *ptr = get_ip(self); struct tcltkip *ptr = get_ip(self);
/* Tcl_Preserve(ptr->ip); */ /* Tcl_Preserve(ptr->ip); */
rbtk_preserve_ip(ptr); rbtk_preserve_ip(ptr);
if (Tcl_Eval(ptr->ip, "after info") == TCL_OK DUMP1("delete slaves");
&& Tcl_SetVar(ptr->ip, delete_slaves(ptr->ip);
REMAINED_AFTER_IDS_VAR,
Tcl_GetStringResult(ptr->ip), DUMP1("finalize operation");
TCL_GLOBAL_ONLY) != (char *)NULL) { if (Tcl_Eval(ptr->ip, DEF_CANCEL_AFTER_SCRIPTS_PROC) == TCL_OK) {
DUMP1("cancel after scripts"); if (Tcl_GetCommandInfo(ptr->ip, CANCEL_AFTER_SCRIPTS, &info)) {
Tcl_Eval(ptr->ip, CANCEL_REMAINED_AFTER_IDS); DUMP2("call cancel after scripts proc '%s'",
CANCEL_AFTER_SCRIPTS);
Tcl_Eval(ptr->ip, CANCEL_AFTER_SCRIPTS);
}
}
if (Tcl_GetCommandInfo(ptr->ip, finalize_hook_name, &info)) {
DUMP2("call finalize hook proc '%s'", finalize_hook_name);
Tcl_Eval(ptr->ip, finalize_hook_name);
} }
del_root(ptr->ip); del_root(ptr->ip);
DUMP1("delete interp"); DUMP1("delete interp");
while(!Tcl_InterpDeleted(ptr->ip)) { /* while(!rbtk_InterpDeleted(ptr->ip)) { */
if (!Tcl_InterpDeleted(ptr->ip)) {
DUMP1("wait ip is deleted"); DUMP1("wait ip is deleted");
Tcl_DeleteInterp(ptr->ip); Tcl_DeleteInterp(ptr->ip);
} }
@ -3872,6 +3907,30 @@ ip_delete(self)
} }
/* is deleted? */ /* is deleted? */
static int
ip_null_namespace(interp)
Tcl_Interp *interp;
{
#if TCL_MAJOR_VERSION < 8
return 0;
#else /* support Namespace */
return ( Tcl_GetCurrentNamespace(interp) == (Tcl_Namespace *)NULL );
#endif
}
static VALUE
ip_has_null_namespace_p(self)
VALUE self;
{
struct tcltkip *ptr = get_ip(self);
if (ip_null_namespace(ptr->ip)) {
return Qtrue;
} else {
return Qfalse;
}
}
static VALUE static VALUE
ip_is_deleted_p(self) ip_is_deleted_p(self)
VALUE self; VALUE self;
@ -3922,7 +3981,11 @@ ip_get_result_string_obj(interp)
# if TCL_MAJOR_VERSION == 8 && TCL_MINOR_VERSION == 0 # if TCL_MAJOR_VERSION == 8 && TCL_MINOR_VERSION == 0
s = Tcl_GetStringFromObj(Tcl_GetObjResult(interp), &len); s = Tcl_GetStringFromObj(Tcl_GetObjResult(interp), &len);
return(rb_tainted_str_new(s, len)); if (s == (char*)NULL) {
return rb_tainted_str_new2("");
} else {
return(rb_tainted_str_new(s, len));
}
# else /* TCL_VERSION >= 8.1 */ # else /* TCL_VERSION >= 8.1 */
volatile VALUE strval; volatile VALUE strval;
@ -3937,12 +4000,20 @@ ip_get_result_string_obj(interp)
if (Tcl_GetCharLength(retobj) != Tcl_UniCharLen(Tcl_GetUnicode(retobj))) { if (Tcl_GetCharLength(retobj) != Tcl_UniCharLen(Tcl_GetUnicode(retobj))) {
/* possibly binary string */ /* possibly binary string */
s = Tcl_GetByteArrayFromObj(retobj, &len); s = Tcl_GetByteArrayFromObj(retobj, &len);
strval = rb_tainted_str_new(s, len); if (s == (char*)NULL) {
strval = rb_tainted_str_new2("");
} else {
strval = rb_tainted_str_new(s, len);
}
rb_ivar_set(strval, ID_at_enc, rb_str_new2("binary")); rb_ivar_set(strval, ID_at_enc, rb_str_new2("binary"));
} else { } else {
/* possibly text string */ /* possibly text string */
s = Tcl_GetStringFromObj(retobj, &len); s = Tcl_GetStringFromObj(retobj, &len);
strval = rb_tainted_str_new(s, len); if (s == (char*)NULL) {
strval = rb_tainted_str_new2("");
} else {
strval = rb_tainted_str_new(s, len);
}
} }
rb_thread_critical = thr_crit_bup; rb_thread_critical = thr_crit_bup;
@ -3982,7 +4053,7 @@ ip_eval_real(self, cmd_str, cmd_len)
Tcl_IncrRefCount(cmd); Tcl_IncrRefCount(cmd);
/* ip is deleted? */ /* ip is deleted? */
if (Tcl_InterpDeleted(ptr->ip)) { if (Tcl_InterpDeleted(ptr->ip) || ip_null_namespace(ptr->ip)) {
DUMP1("ip is deleted"); DUMP1("ip is deleted");
Tcl_DecrRefCount(cmd); Tcl_DecrRefCount(cmd);
rb_thread_critical = thr_crit_bup; rb_thread_critical = thr_crit_bup;
@ -4023,7 +4094,7 @@ ip_eval_real(self, cmd_str, cmd_len)
DUMP2("Tcl_Eval(%s)", cmd_str); DUMP2("Tcl_Eval(%s)", cmd_str);
/* ip is deleted? */ /* ip is deleted? */
if (Tcl_InterpDeleted(ptr->ip)) { if (Tcl_InterpDeleted(ptr->ip) || ip_null_namespace(ptr->ip)) {
DUMP1("ip is deleted"); DUMP1("ip is deleted");
ptr->return_value = TCL_OK; ptr->return_value = TCL_OK;
return rb_tainted_str_new2(""); return rb_tainted_str_new2("");
@ -4228,7 +4299,7 @@ lib_restart(self)
rb_secure(4); rb_secure(4);
/* ip is deleted? */ /* ip is deleted? */
if (Tcl_InterpDeleted(ptr->ip)) { if (Tcl_InterpDeleted(ptr->ip) || ip_null_namespace(ptr->ip)) {
DUMP1("ip is deleted"); DUMP1("ip is deleted");
rb_raise(rb_eRuntimeError, "interpreter is deleted"); rb_raise(rb_eRuntimeError, "interpreter is deleted");
} }
@ -4717,7 +4788,7 @@ ip_invoke_core(interp, argc, argv)
ptr = get_ip(interp); ptr = get_ip(interp);
/* ip is deleted? */ /* ip is deleted? */
if (Tcl_InterpDeleted(ptr->ip)) { if (Tcl_InterpDeleted(ptr->ip) || ip_null_namespace(ptr->ip)) {
DUMP1("ip is deleted"); DUMP1("ip is deleted");
return rb_tainted_str_new2(""); return rb_tainted_str_new2("");
} }
@ -5199,7 +5270,7 @@ ip_get_variable(self, varname_arg, flag_arg)
Tcl_IncrRefCount(nameobj); Tcl_IncrRefCount(nameobj);
/* ip is deleted? */ /* ip is deleted? */
if (Tcl_InterpDeleted(ptr->ip)) { if (Tcl_InterpDeleted(ptr->ip) || ip_null_namespace(ptr->ip)) {
DUMP1("ip is deleted"); DUMP1("ip is deleted");
Tcl_DecrRefCount(nameobj); Tcl_DecrRefCount(nameobj);
rb_thread_critical = thr_crit_bup; rb_thread_critical = thr_crit_bup;
@ -5263,7 +5334,7 @@ ip_get_variable(self, varname_arg, flag_arg)
char *ret; char *ret;
/* ip is deleted? */ /* ip is deleted? */
if (Tcl_InterpDeleted(ptr->ip)) { if (Tcl_InterpDeleted(ptr->ip) || ip_null_namespace(ptr->ip)) {
DUMP1("ip is deleted"); DUMP1("ip is deleted");
return rb_tainted_str_new2(""); return rb_tainted_str_new2("");
} else { } else {
@ -5335,7 +5406,7 @@ ip_get_variable2(self, varname_arg, index_arg, flag_arg)
Tcl_IncrRefCount(idxobj); Tcl_IncrRefCount(idxobj);
/* ip is deleted? */ /* ip is deleted? */
if (Tcl_InterpDeleted(ptr->ip)) { if (Tcl_InterpDeleted(ptr->ip) || ip_null_namespace(ptr->ip)) {
DUMP1("ip is deleted"); DUMP1("ip is deleted");
Tcl_DecrRefCount(nameobj); Tcl_DecrRefCount(nameobj);
Tcl_DecrRefCount(idxobj); Tcl_DecrRefCount(idxobj);
@ -5400,7 +5471,7 @@ ip_get_variable2(self, varname_arg, index_arg, flag_arg)
char *ret; char *ret;
/* ip is deleted? */ /* ip is deleted? */
if (Tcl_InterpDeleted(ptr->ip)) { if (Tcl_InterpDeleted(ptr->ip) || ip_null_namespace(ptr->ip)) {
DUMP1("ip is deleted"); DUMP1("ip is deleted");
return rb_tainted_str_new2(""); return rb_tainted_str_new2("");
} else { } else {
@ -5447,7 +5518,7 @@ ip_set_variable(self, varname_arg, value_arg, flag_arg)
varname = varname_arg; varname = varname_arg;
value = value_arg; value = value_arg;
flag = flag_arg; flag = flag_arg;
StringValue(varname); StringValue(varname);
StringValue(value); StringValue(value);
@ -5497,7 +5568,7 @@ ip_set_variable(self, varname_arg, value_arg, flag_arg)
# endif # endif
/* ip is deleted? */ /* ip is deleted? */
if (Tcl_InterpDeleted(ptr->ip)) { if (Tcl_InterpDeleted(ptr->ip) || ip_null_namespace(ptr->ip)) {
DUMP1("ip is deleted"); DUMP1("ip is deleted");
Tcl_DecrRefCount(nameobj); Tcl_DecrRefCount(nameobj);
Tcl_DecrRefCount(valobj); Tcl_DecrRefCount(valobj);
@ -5564,7 +5635,7 @@ ip_set_variable(self, varname_arg, value_arg, flag_arg)
CONST char *ret; CONST char *ret;
/* ip is deleted? */ /* ip is deleted? */
if (Tcl_InterpDeleted(ptr->ip)) { if (Tcl_InterpDeleted(ptr->ip) || ip_null_namespace(ptr->ip)) {
DUMP1("ip is deleted"); DUMP1("ip is deleted");
return rb_tainted_str_new2(""); return rb_tainted_str_new2("");
} else { } else {
@ -5661,7 +5732,7 @@ ip_set_variable2(self, varname_arg, index_arg, value_arg, flag_arg)
Tcl_IncrRefCount(valobj); Tcl_IncrRefCount(valobj);
/* ip is deleted? */ /* ip is deleted? */
if (Tcl_InterpDeleted(ptr->ip)) { if (Tcl_InterpDeleted(ptr->ip) || ip_null_namespace(ptr->ip)) {
DUMP1("ip is deleted"); DUMP1("ip is deleted");
Tcl_DecrRefCount(nameobj); Tcl_DecrRefCount(nameobj);
Tcl_DecrRefCount(idxobj); Tcl_DecrRefCount(idxobj);
@ -5722,7 +5793,7 @@ ip_set_variable2(self, varname_arg, index_arg, value_arg, flag_arg)
CONST char *ret; CONST char *ret;
/* ip is deleted? */ /* ip is deleted? */
if (Tcl_InterpDeleted(ptr->ip)) { if (Tcl_InterpDeleted(ptr->ip) || ip_null_namespace(ptr->ip)) {
DUMP1("ip is deleted"); DUMP1("ip is deleted");
return rb_tainted_str_new2(""); return rb_tainted_str_new2("");
} else { } else {
@ -5766,7 +5837,7 @@ ip_unset_variable(self, varname_arg, flag_arg)
StringValue(varname); StringValue(varname);
/* ip is deleted? */ /* ip is deleted? */
if (Tcl_InterpDeleted(ptr->ip)) { if (Tcl_InterpDeleted(ptr->ip) || ip_null_namespace(ptr->ip)) {
DUMP1("ip is deleted"); DUMP1("ip is deleted");
return Qtrue; return Qtrue;
} }
@ -5808,7 +5879,7 @@ ip_unset_variable2(self, varname_arg, index_arg, flag_arg)
StringValue(index); StringValue(index);
/* ip is deleted? */ /* ip is deleted? */
if (Tcl_InterpDeleted(ptr->ip)) { if (Tcl_InterpDeleted(ptr->ip) || ip_null_namespace(ptr->ip)) {
DUMP1("ip is deleted"); DUMP1("ip is deleted");
return Qtrue; return Qtrue;
} }
@ -6401,6 +6472,7 @@ Init_tcltklib()
rb_define_method(ip, "allow_ruby_exit=", ip_allow_ruby_exit_set, 1); rb_define_method(ip, "allow_ruby_exit=", ip_allow_ruby_exit_set, 1);
rb_define_method(ip, "delete", ip_delete, 0); rb_define_method(ip, "delete", ip_delete, 0);
rb_define_method(ip, "deleted?", ip_is_deleted_p, 0); rb_define_method(ip, "deleted?", ip_is_deleted_p, 0);
rb_define_method(ip, "null_namespace?", ip_has_null_namespace_p, 0);
rb_define_method(ip, "_eval", ip_eval, 1); rb_define_method(ip, "_eval", ip_eval, 1);
rb_define_method(ip, "_toUTF8", ip_toUTF8, -1); rb_define_method(ip, "_toUTF8", ip_toUTF8, -1);
rb_define_method(ip, "_fromUTF8", ip_fromUTF8, -1); rb_define_method(ip, "_fromUTF8", ip_fromUTF8, -1);

View File

@ -1,3 +1,33 @@
2005-01-25 Hidetoshi NAGAI <nagai@ai.kyutech.ac.jp>
* ext/tk/lib/tkextlib/blt/component.rb: bug fix. cannot accept
a callback ID string for a command argument. [ruby-dev:25479]
* ext/tk/lib/tkextlib/blt/tabset.rb: ditto
* ext/tk/lib/tkextlib/blt/treeview.rb: ditto
* ext/tk/lib/tkextlib/bwidget/labelentry.rb: ditto
* ext/tk/lib/tkextlib/bwidget/listbox.rb: ditto
* ext/tk/lib/tkextlib/bwidget/notebook.rb: ditto
* ext/tk/lib/tkextlib/bwidget/spinbox.rb: ditto
* ext/tk/lib/tkextlib/bwidget/tree.rb: ditto
* ext/tk/lib/tkextlib/itk/incr_tk.rb: ditto
* ext/tk/lib/tkextlib/iwidgets/scrolledcanvas.rb: ditto
* ext/tk/lib/tkextlib/tkDND/tkdnd.rb: ditto
* ext/tk/lib/tkextlib/treectrl/tktreectrl.rb: ditto
* ext/tk/sample/tkHTML/ss.rb: local variable scope bug fix
[ruby-dev:25479]
2004-12-24 Hidetoshi NAGAI <nagai@ai.kyutech.ac.jp> 2004-12-24 Hidetoshi NAGAI <nagai@ai.kyutech.ac.jp>
* add BLT extension support * add BLT extension support

View File

@ -762,7 +762,11 @@ class MultiTkIp
#slave_ip.delete #slave_ip.delete
slave_ip._eval_without_enc('exit') slave_ip._eval_without_enc('exit')
end end
top.destroy if top.winfo_exist? begin
top.destroy if top.winfo_exist?
rescue
# ignore
end
} }
tag = TkBindTag.new.bind('Destroy', slave_delete_proc) tag = TkBindTag.new.bind('Destroy', slave_delete_proc)
@ -1560,10 +1564,14 @@ class << MultiTkIp
__getip.delete __getip.delete
end end
def deleteed? def deleted?
__getip.deleted? __getip.deleted?
end end
def null_namespace?
__getip.null_namespace?
end
def abort(msg = nil) def abort(msg = nil)
__getip.abort(msg) __getip.abort(msg)
end end
@ -1886,6 +1894,10 @@ class MultiTkIp
@interp.deleted? @interp.deleted?
end end
def null_namespace?
@interp.null_namespace?
end
def abort(msg = nil) def abort(msg = nil)
if master? if master?
if msg if msg
@ -2217,7 +2229,7 @@ class MultiTkIp
def set_bgerror_handler(cmd = Proc.new, slave = nil, &b) def set_bgerror_handler(cmd = Proc.new, slave = nil, &b)
unless TkComm._callback_entry?(cmd) unless TkComm._callback_entry?(cmd)
unless slave if !slave && b
slave = cmd slave = cmd
cmd = Proc.new(&b) cmd = Proc.new(&b)
end end

View File

@ -282,6 +282,10 @@ class RemoteTkIp
end end
end end
def null_namespace?
false
end
def restart def restart
fail RuntimeError, 'cannot restart the remote interpreter' fail RuntimeError, 'cannot restart the remote interpreter'
end end

View File

@ -913,7 +913,7 @@ module TkComm
#end #end
def bind(tagOrClass, context, *args) def bind(tagOrClass, context, *args)
# if args[0].kind_of?(Proc) || args[0].kind_of?(Method) # if args[0].kind_of?(Proc) || args[0].kind_of?(Method)
if TkComm._callback_entry?(args[0]) if TkComm._callback_entry?(args[0]) || !block_given?
cmd = args.shift cmd = args.shift
else else
cmd = Proc.new cmd = Proc.new
@ -928,7 +928,7 @@ module TkComm
#end #end
def bind_append(tagOrClass, context, *args) def bind_append(tagOrClass, context, *args)
# if args[0].kind_of?(Proc) || args[0].kind_of?(Method) # if args[0].kind_of?(Proc) || args[0].kind_of?(Method)
if TkComm._callback_entry?(args[0]) if TkComm._callback_entry?(args[0]) || !block_given?
cmd = args.shift cmd = args.shift
else else
cmd = Proc.new cmd = Proc.new
@ -952,7 +952,7 @@ module TkComm
#end #end
def bind_all(context, *args) def bind_all(context, *args)
# if args[0].kind_of?(Proc) || args[0].kind_of?(Method) # if args[0].kind_of?(Proc) || args[0].kind_of?(Method)
if TkComm._callback_entry?(args[0]) if TkComm._callback_entry?(args[0]) || !block_given?
cmd = args.shift cmd = args.shift
else else
cmd = Proc.new cmd = Proc.new
@ -967,7 +967,7 @@ module TkComm
#end #end
def bind_append_all(context, *args) def bind_append_all(context, *args)
# if args[0].kind_of?(Proc) || args[0].kind_of?(Method) # if args[0].kind_of?(Proc) || args[0].kind_of?(Method)
if TkComm._callback_entry?(args[0]) if TkComm._callback_entry?(args[0]) || !block_given?
cmd = args.shift cmd = args.shift
else else
cmd = Proc.new cmd = Proc.new
@ -2131,7 +2131,7 @@ module TkBindCore
#end #end
def bind(context, *args) def bind(context, *args)
# if args[0].kind_of?(Proc) || args[0].kind_of?(Method) # if args[0].kind_of?(Proc) || args[0].kind_of?(Method)
if TkComm._callback_entry?(args[0]) if TkComm._callback_entry?(args[0]) || !block_given?
cmd = args.shift cmd = args.shift
else else
cmd = Proc.new cmd = Proc.new
@ -2144,7 +2144,7 @@ module TkBindCore
#end #end
def bind_append(context, *args) def bind_append(context, *args)
# if args[0].kind_of?(Proc) || args[0].kind_of?(Method) # if args[0].kind_of?(Proc) || args[0].kind_of?(Method)
if TkComm._callback_entry?(args[0]) if TkComm._callback_entry?(args[0]) || !block_given?
cmd = args.shift cmd = args.shift
else else
cmd = Proc.new cmd = Proc.new
@ -3940,7 +3940,7 @@ end
#Tk.freeze #Tk.freeze
module Tk module Tk
RELEASE_DATE = '2004-12-27'.freeze RELEASE_DATE = '2005-01-25'.freeze
autoload :AUTO_PATH, 'tk/variable' autoload :AUTO_PATH, 'tk/variable'
autoload :TCL_PACKAGE_PATH, 'tk/variable' autoload :TCL_PACKAGE_PATH, 'tk/variable'

View File

@ -23,6 +23,7 @@ class TkBindTag
@id = name @id = name
BTagID_TBL[@id] = self BTagID_TBL[@id] = self
bind(*args, &b) if args != [] bind(*args, &b) if args != []
self
} }
end end

View File

@ -100,7 +100,7 @@ class TkCanvas<TkWindow
#end #end
def itembind(tag, context, *args) def itembind(tag, context, *args)
# if args[0].kind_of?(Proc) || args[0].kind_of?(Method) # if args[0].kind_of?(Proc) || args[0].kind_of?(Method)
if TkComm._callback_entry?(args[0]) if TkComm._callback_entry?(args[0]) || !block_given?
cmd = args.shift cmd = args.shift
else else
cmd = Proc.new cmd = Proc.new
@ -115,7 +115,7 @@ class TkCanvas<TkWindow
#end #end
def itembind_append(tag, context, *args) def itembind_append(tag, context, *args)
# if args[0].kind_of?(Proc) || args[0].kind_of?(Method) # if args[0].kind_of?(Proc) || args[0].kind_of?(Method)
if TkComm._callback_entry?(args[0]) if TkComm._callback_entry?(args[0]) || !block_given?
cmd = args.shift cmd = args.shift
else else
cmd = Proc.new cmd = Proc.new

View File

@ -27,7 +27,7 @@ module TkcTagAccess
#end #end
def bind(seq, *args) def bind(seq, *args)
# if args[0].kind_of?(Proc) || args[0].kind_of?(Method) # if args[0].kind_of?(Proc) || args[0].kind_of?(Method)
if TkComm._callback_entry?(args[0]) if TkComm._callback_entry?(args[0]) || !block_given?
cmd = args.shift cmd = args.shift
else else
cmd = Proc.new cmd = Proc.new
@ -42,7 +42,7 @@ module TkcTagAccess
#end #end
def bind_append(seq, *args) def bind_append(seq, *args)
# if args[0].kind_of?(Proc) || args[0].kind_of?(Method) # if args[0].kind_of?(Proc) || args[0].kind_of?(Method)
if TkComm._callback_entry?(args[0]) if TkComm._callback_entry?(args[0]) || !block_given?
cmd = args.shift cmd = args.shift
else else
cmd = Proc.new cmd = Proc.new

View File

@ -438,6 +438,7 @@ class TkOptionMenubutton<TkMenubutton
parent = nil parent = nil
if args[0].kind_of?(TkWindow) || args[0] == nil if args[0].kind_of?(TkWindow) || args[0] == nil
keys.delete('parent') # ignore
parent = args.shift parent = args.shift
else else
parent = keys.delete('parent') parent = keys.delete('parent')
@ -445,6 +446,7 @@ class TkOptionMenubutton<TkMenubutton
@variable = nil @variable = nil
if args[0].kind_of?(TkVariable) || args[0] == nil if args[0].kind_of?(TkVariable) || args[0] == nil
keys.delete('variable') # ignore
@variable = args.shift @variable = args.shift
else else
@variable = keys.delete('variable') @variable = keys.delete('variable')

View File

@ -589,7 +589,7 @@ class TkText<TkTextWin
#end #end
def tag_bind(tag, seq, *args) def tag_bind(tag, seq, *args)
# if args[0].kind_of?(Proc) || args[0].kind_of?(Method) # if args[0].kind_of?(Proc) || args[0].kind_of?(Method)
if TkComm._callback_entry?(args[0]) if TkComm._callback_entry?(args[0]) || !block_given?
cmd = args.shift cmd = args.shift
else else
cmd = Proc.new cmd = Proc.new
@ -604,7 +604,7 @@ class TkText<TkTextWin
#end #end
def tag_bind_append(tag, seq, *args) def tag_bind_append(tag, seq, *args)
# if args[0].kind_of?(Proc) || args[0].kind_of?(Method) # if args[0].kind_of?(Proc) || args[0].kind_of?(Method)
if TkComm._callback_entry?(args[0]) if TkComm._callback_entry?(args[0]) || !block_given?
cmd = args.shift cmd = args.shift
else else
cmd = Proc.new cmd = Proc.new

View File

@ -173,7 +173,7 @@ class TkTextTag<TkObject
#end #end
def bind(seq, *args) def bind(seq, *args)
# if args[0].kind_of?(Proc) || args[0].kind_of?(Method) # if args[0].kind_of?(Proc) || args[0].kind_of?(Method)
if TkComm._callback_entry?(args[0]) if TkComm._callback_entry?(args[0]) || !block_given?
cmd = args.shift cmd = args.shift
else else
cmd = Proc.new cmd = Proc.new
@ -188,7 +188,7 @@ class TkTextTag<TkObject
#end #end
def bind_append(seq, *args) def bind_append(seq, *args)
# if args[0].kind_of?(Proc) || args[0].kind_of?(Method) # if args[0].kind_of?(Proc) || args[0].kind_of?(Method)
if TkComm._callback_entry?(args[0]) if TkComm._callback_entry?(args[0]) || !block_given?
cmd = args.shift cmd = args.shift
else else
cmd = Proc.new cmd = Proc.new

View File

@ -899,7 +899,7 @@ module Tk::BLT
end end
def _component_bind(target, tag, context, *args) def _component_bind(target, tag, context, *args)
if TkComm._callback_entry?(args[0]) if TkComm._callback_entry?(args[0]) || !block_given?
cmd = args.shift cmd = args.shift
else else
cmd = Proc.new cmd = Proc.new
@ -908,7 +908,7 @@ module Tk::BLT
self self
end end
def _component_bind_append(target, tag, context, *args) def _component_bind_append(target, tag, context, *args)
if TkComm._callback_entry?(args[0]) if TkComm._callback_entry?(args[0]) || !block_given?
cmd = args.shift cmd = args.shift
else else
cmd = Proc.new cmd = Proc.new

View File

@ -78,7 +78,7 @@ module Tk::BLT
#end #end
def bind(context, *args) def bind(context, *args)
# if args[0].kind_of?(Proc) || args[0].kind_of?(Method) # if args[0].kind_of?(Proc) || args[0].kind_of?(Method)
if TkComm._callback_entry?(args[0]) if TkComm._callback_entry?(args[0]) || !block_given?
cmd = args.shift cmd = args.shift
else else
cmd = Proc.new cmd = Proc.new
@ -92,7 +92,7 @@ module Tk::BLT
#end #end
def bind_append(context, *args) def bind_append(context, *args)
# if args[0].kind_of?(Proc) || args[0].kind_of?(Method) # if args[0].kind_of?(Proc) || args[0].kind_of?(Method)
if TkComm._callback_entry?(args[0]) if TkComm._callback_entry?(args[0]) || !block_given?
cmd = args.shift cmd = args.shift
else else
cmd = Proc.new cmd = Proc.new
@ -243,7 +243,7 @@ module Tk::BLT
#end #end
def tabbind(tag, context, *args) def tabbind(tag, context, *args)
# if args[0].kind_of?(Proc) || args[0].kind_of?(Method) # if args[0].kind_of?(Proc) || args[0].kind_of?(Method)
if TkComm._callback_entry?(args[0]) if TkComm._callback_entry?(args[0]) || !block_given?
cmd = args.shift cmd = args.shift
else else
cmd = Proc.new cmd = Proc.new
@ -257,7 +257,7 @@ module Tk::BLT
#end #end
def tabbind_append(tag, context, *args) def tabbind_append(tag, context, *args)
# if args[0].kind_of?(Proc) || args[0].kind_of?(Method) # if args[0].kind_of?(Proc) || args[0].kind_of?(Method)
if TkComm._callback_entry?(args[0]) if TkComm._callback_entry?(args[0]) || !block_given?
cmd = args.shift cmd = args.shift
else else
cmd = Proc.new cmd = Proc.new

View File

@ -292,7 +292,7 @@ class Tk::BLT::Treeview
end end
def tag_bind(tag, seq, *args) def tag_bind(tag, seq, *args)
if TkComm._callback_entry?(args[0]) if TkComm._callback_entry?(args[0]) || !block_given?
cmd = args.shift cmd = args.shift
else else
cmd = Proc.new cmd = Proc.new
@ -301,7 +301,7 @@ class Tk::BLT::Treeview
self self
end end
def tag_bind_append(tag, seq, *args) def tag_bind_append(tag, seq, *args)
if TkComm._callback_entry?(args[0]) if TkComm._callback_entry?(args[0]) || !block_given?
cmd = args.shift cmd = args.shift
else else
cmd = Proc.new cmd = Proc.new
@ -323,7 +323,7 @@ class Tk::BLT::Treeview
end end
def button_bind(tag, seq, *args) def button_bind(tag, seq, *args)
if TkComm._callback_entry?(args[0]) if TkComm._callback_entry?(args[0]) || !block_given?
cmd = args.shift cmd = args.shift
else else
cmd = Proc.new cmd = Proc.new
@ -332,7 +332,7 @@ class Tk::BLT::Treeview
self self
end end
def button_bind_append(tag, seq, *args) def button_bind_append(tag, seq, *args)
if TkComm._callback_entry?(args[0]) if TkComm._callback_entry?(args[0]) || !block_given?
cmd = args.shift cmd = args.shift
else else
cmd = Proc.new cmd = Proc.new

View File

@ -29,7 +29,7 @@ class Tk::BWidget::LabelEntry
#end #end
def entrybind(context, *args) def entrybind(context, *args)
# if args[0].kind_of?(Proc) || args[0].kind_of?(Method) # if args[0].kind_of?(Proc) || args[0].kind_of?(Method)
if TkComm._callback_entry?(args[0]) if TkComm._callback_entry?(args[0]) || !block_given?
cmd = args.shift cmd = args.shift
else else
cmd = Proc.new cmd = Proc.new
@ -44,7 +44,7 @@ class Tk::BWidget::LabelEntry
#end #end
def entrybind_append(context, *args) def entrybind_append(context, *args)
#if args[0].kind_of?(Proc) || args[0].kind_of?(Method) #if args[0].kind_of?(Proc) || args[0].kind_of?(Method)
if TkComm._callback_entry?(args[0]) if TkComm._callback_entry?(args[0]) || !block_given?
cmd = args.shift cmd = args.shift
else else
cmd = Proc.new cmd = Proc.new

View File

@ -50,7 +50,7 @@ class Tk::BWidget::ListBox
#end #end
def imagebind(context, *args) def imagebind(context, *args)
#if args[0].kind_of?(Proc) || args[0].kind_of?(Method) #if args[0].kind_of?(Proc) || args[0].kind_of?(Method)
if TkComm._callback_entry?(args[0]) if TkComm._callback_entry?(args[0]) || !block_given?
cmd = args.shift cmd = args.shift
else else
cmd = Proc.new cmd = Proc.new
@ -66,7 +66,7 @@ class Tk::BWidget::ListBox
#end #end
def imagebind_append(context, *args) def imagebind_append(context, *args)
#if args[0].kind_of?(Proc) || args[0].kind_of?(Method) #if args[0].kind_of?(Proc) || args[0].kind_of?(Method)
if TkComm._callback_entry?(args[0]) if TkComm._callback_entry?(args[0]) || !block_given?
cmd = args.shift cmd = args.shift
else else
cmd = Proc.new cmd = Proc.new
@ -91,7 +91,7 @@ class Tk::BWidget::ListBox
#end #end
def textbind(context, *args) def textbind(context, *args)
#if args[0].kind_of?(Proc) || args[0].kind_of?(Method) #if args[0].kind_of?(Proc) || args[0].kind_of?(Method)
if TkComm._callback_entry?(args[0]) if TkComm._callback_entry?(args[0]) || !block_given?
cmd = args.shift cmd = args.shift
else else
cmd = Proc.new cmd = Proc.new
@ -107,7 +107,7 @@ class Tk::BWidget::ListBox
#end #end
def textbind_append(context, *args) def textbind_append(context, *args)
#if args[0].kind_of?(Proc) || args[0].kind_of?(Method) #if args[0].kind_of?(Proc) || args[0].kind_of?(Method)
if TkComm._callback_entry?(args[0]) if TkComm._callback_entry?(args[0]) || !block_given?
cmd = args.shift cmd = args.shift
else else
cmd = Proc.new cmd = Proc.new

View File

@ -47,7 +47,7 @@ class Tk::BWidget::NoteBook
#end #end
def tabbind(context, *args) def tabbind(context, *args)
#if args[0].kind_of?(Proc) || args[0].kind_of?(Method) #if args[0].kind_of?(Proc) || args[0].kind_of?(Method)
if TkComm._callback_entry?(args[0]) if TkComm._callback_entry?(args[0]) || !block_given?
cmd = args.shift cmd = args.shift
else else
cmd = Proc.new cmd = Proc.new
@ -63,7 +63,7 @@ class Tk::BWidget::NoteBook
#end #end
def tabbind_append(context, *args) def tabbind_append(context, *args)
#if args[0].kind_of?(Proc) || args[0].kind_of?(Method) #if args[0].kind_of?(Proc) || args[0].kind_of?(Method)
if TkComm._callback_entry?(args[0]) if TkComm._callback_entry?(args[0]) || !block_given?
cmd = args.shift cmd = args.shift
else else
cmd = Proc.new cmd = Proc.new

View File

@ -28,7 +28,7 @@ class Tk::BWidget::SpinBox
#end #end
def entrybind(context, *args) def entrybind(context, *args)
#if args[0].kind_of?(Proc) || args[0].kind_of?(Method) #if args[0].kind_of?(Proc) || args[0].kind_of?(Method)
if TkComm._callback_entry?(args[0]) if TkComm._callback_entry?(args[0]) || !block_given?
cmd = args.shift cmd = args.shift
else else
cmd = Proc.new cmd = Proc.new
@ -43,7 +43,7 @@ class Tk::BWidget::SpinBox
#end #end
def entrybind_append(context, *args) def entrybind_append(context, *args)
#if args[0].kind_of?(Proc) || args[0].kind_of?(Method) #if args[0].kind_of?(Proc) || args[0].kind_of?(Method)
if TkComm._callback_entry?(args[0]) if TkComm._callback_entry?(args[0]) || !block_given?
cmd = args.shift cmd = args.shift
else else
cmd = Proc.new cmd = Proc.new

View File

@ -47,7 +47,7 @@ class Tk::BWidget::Tree
#end #end
def imagebind(context, *args) def imagebind(context, *args)
#if args[0].kind_of?(Proc) || args[0].kind_of?(Method) #if args[0].kind_of?(Proc) || args[0].kind_of?(Method)
if TkComm._callback_entry?(args[0]) if TkComm._callback_entry?(args[0]) || !block_given?
cmd = args.shift cmd = args.shift
else else
cmd = Proc.new cmd = Proc.new
@ -63,7 +63,7 @@ class Tk::BWidget::Tree
#end #end
def imagebind_append(context, *args) def imagebind_append(context, *args)
#if args[0].kind_of?(Proc) || args[0].kind_of?(Method) #if args[0].kind_of?(Proc) || args[0].kind_of?(Method)
if TkComm._callback_entry?(args[0]) if TkComm._callback_entry?(args[0]) || !block_given?
cmd = args.shift cmd = args.shift
else else
cmd = Proc.new cmd = Proc.new
@ -88,7 +88,7 @@ class Tk::BWidget::Tree
#end #end
def textbind(context, *args) def textbind(context, *args)
#if args[0].kind_of?(Proc) || args[0].kind_of?(Method) #if args[0].kind_of?(Proc) || args[0].kind_of?(Method)
if TkComm._callback_entry?(args[0]) if TkComm._callback_entry?(args[0]) || !block_given?
cmd = args.shift cmd = args.shift
else else
cmd = Proc.new cmd = Proc.new
@ -104,7 +104,7 @@ class Tk::BWidget::Tree
#end #end
def textbind_append(context, *args) def textbind_append(context, *args)
#if args[0].kind_of?(Proc) || args[0].kind_of?(Method) #if args[0].kind_of?(Proc) || args[0].kind_of?(Method)
if TkComm._callback_entry?(args[0]) if TkComm._callback_entry?(args[0]) || !block_given?
cmd = args.shift cmd = args.shift
else else
cmd = Proc.new cmd = Proc.new

View File

@ -351,7 +351,7 @@ module Tk
end end
end end
# if args[0].kind_of?(Proc) || args[0].kind_of?(Method) # if args[0].kind_of?(Proc) || args[0].kind_of?(Method)
if TkComm._callback_entry?(args[0]) if TkComm._callback_entry?(args[0]) || !block_given?
cmd = args.shift cmd = args.shift
else else
cmd = Proc.new cmd = Proc.new
@ -380,7 +380,7 @@ module Tk
end end
end end
# if args[0].kind_of?(Proc) || args[0].kind_of?(Method) # if args[0].kind_of?(Proc) || args[0].kind_of?(Method)
if TkComm._callback_entry?(args[0]) if TkComm._callback_entry?(args[0]) || !block_given?
cmd = args.shift cmd = args.shift
else else
cmd = Proc.new cmd = Proc.new

View File

@ -103,7 +103,7 @@ class Tk::Iwidgets::Scrolledcanvas
#end #end
def itembind(tag, context, *args) def itembind(tag, context, *args)
# if args[0].kind_of?(Proc) || args[0].kind_of?(Method) # if args[0].kind_of?(Proc) || args[0].kind_of?(Method)
if TkComm._callback_entry?(args[0]) if TkComm._callback_entry?(args[0]) || !block_given?
cmd = args.shift cmd = args.shift
else else
cmd = Proc.new cmd = Proc.new
@ -118,7 +118,7 @@ class Tk::Iwidgets::Scrolledcanvas
#end #end
def itembind_append(tag, context, *args) def itembind_append(tag, context, *args)
# if args[0].kind_of?(Proc) || args[0].kind_of?(Method) # if args[0].kind_of?(Proc) || args[0].kind_of?(Method)
if TkComm._callback_entry?(args[0]) if TkComm._callback_entry?(args[0]) || !block_given?
cmd = args.shift cmd = args.shift
else else
cmd = Proc.new cmd = Proc.new

View File

@ -89,7 +89,7 @@ module Tk
#end #end
def dnd_bindtarget(type, event, *args) def dnd_bindtarget(type, event, *args)
# if args[0].kind_of?(Proc) || args[0].kind_of?(Method) # if args[0].kind_of?(Proc) || args[0].kind_of?(Method)
if TkComm._callback_entry?(args[0]) if TkComm._callback_entry?(args[0]) || !block_given?
cmd = args.shift cmd = args.shift
else else
cmd = Proc.new cmd = Proc.new
@ -129,7 +129,7 @@ module Tk
#end #end
def dnd_bindsource(type, *args) def dnd_bindsource(type, *args)
# if args[0].kind_of?(Proc) || args[0].kind_of?(Method) # if args[0].kind_of?(Proc) || args[0].kind_of?(Method)
if TkComm._callback_entry?(args[0]) if TkComm._callback_entry?(args[0]) || !block_given?
cmd = args.shift cmd = args.shift
else else
cmd = Proc.new cmd = Proc.new

View File

@ -749,7 +749,7 @@ class Tk::TreeCtrl
#end #end
def notify_bind(obj, event, *args) def notify_bind(obj, event, *args)
# if args[0].kind_of?(Proc) || args[0].kind_of?(Method) # if args[0].kind_of?(Proc) || args[0].kind_of?(Method)
if TkComm._callback_entry?(args[0]) if TkComm._callback_entry?(args[0]) || !block_given?
cmd = args.shift cmd = args.shift
else else
cmd = Proc.new cmd = Proc.new
@ -764,7 +764,7 @@ class Tk::TreeCtrl
#end #end
def notify_bind_append(obj, event, *args) def notify_bind_append(obj, event, *args)
# if args[0].kind_of?(Proc) || args[0].kind_of?(Method) # if args[0].kind_of?(Proc) || args[0].kind_of?(Method)
if TkComm._callback_entry?(args[0]) if TkComm._callback_entry?(args[0]) || !block_given?
cmd = args.shift cmd = args.shift
else else
cmd = Proc.new cmd = Proc.new

View File

@ -0,0 +1,172 @@
#
# animated label widget demo (called by 'widget')
#
# based on Tcl/Tk8.5a2 widget demos
if defined?($anilabel_demo) && $anilabel_demo
$anilabel_demo.destroy
$anilabel_demo = nil
end
# demo toplevel widget
$anilabel_demo = TkToplevel.new {|w|
title("Animated Label Demonstration")
iconname("anilabel")
positionWindow(w)
}
# label
msg = TkLabel.new($anilabel_demo) {
font $font
wraplength '4i'
justify 'left'
text "Four animated labels are displayed below; each of the labels on the left is animated by making the text message inside it appear to scroll, and the label on the right is animated by animating the image that it displays."
}
msg.pack('side'=>'top')
# frame
TkFrame.new($anilabel_demo) {|frame|
TkButton.new(frame) {
text 'Dismiss'
command proc{
tmppath = $anilabel_demo
$anilabel_demo = nil
tmppath.destroy
}
}.pack('side'=>'left', 'expand'=>'yes')
TkButton.new(frame) {
text 'See Code'
command proc{showCode 'label'}
}.pack('side'=>'left', 'expand'=>'yes')
}.pack('side'=>'bottom', 'fill'=>'x', 'pady'=>'2m')
# create frame for label demo
f_left = TkLabelFrame.new($anilabel_demo, :text=>'Scrolling Texts')
f_right = TkLabelFrame.new($anilabel_demo, :text=>'GIF Image')
Tk.pack(f_left, f_right, 'side'=>'left', 'expand'=>'yes', 'fill'=>'both',
'padx'=>10, 'pady'=>10)
# animated label
class AnimatedTextLabel < TkLabel
def initialize(*args)
super(*args)
@timer = TkTimer.new{ _animation_callback }
@timer.loop_exec = -1
# bind('Destroy'){ @timer.stop }
@btag = TkBindTag.new('Destroy'){ @timer.stop }
self.bindtags_unshift(@btag)
end
def _animation_callback()
txt = self.text
self.text = (txt[1..-1] << txt[0])
end
private :_animation_callback
def start(interval)
@timer.set_interval(interval)
@timer.start
end
def stop
@timer.stop
end
end
# animated image
class AnimatedImageLabel < AnimatedTextLabel
def initialize(*args)
super(*args)
@destroy_image = false
@btag.bind_append('Destroy'){
if @destroy_image
begin
self.image.delete
rescue
end
end
}
end
attr_accessor :destroy_image
def _animation_callback()
img = self.image
fmt = img.format
if fmt.kind_of?(Array)
if fmt[1].kind_of?(Hash)
# fmt == ['GIF', {'index'=>idx}]
idx = fmt[1]['index']
else
# fmt == ['GIF', '-index', idx] :: Ruby1.8.2 returns this.
idx = fmt[2]
end
elsif fmt.kind_of?(String) && fmt =~ /GIF -index (\d+)/
idx = $1.to_i
else
idx = -1
end
begin
img.format("GIF -index #{idx + 1}")
rescue => e
img.format("GIF -index 0")
end
end
private :_animation_callback
end
# create labels
l1 = AnimatedTextLabel.new(f_left, :borderwidth=>4, :relief=>:ridge,
:font=>{:family=>'Courier', :size=>10})
l2 = AnimatedTextLabel.new(f_left, :borderwidth=>4, :relief=>:groove,
:font=>{:family=>'Courier', :size=>10})
l3 = AnimatedTextLabel.new(f_left, :borderwidth=>4, :relief=>:flat,
:font=>{:family=>'Courier', :size=>10}, :width=>18)
Tk.pack(l1, l2, l3,
:side=>:top, :expand=>true, :anchor=>:w, :padx=>10, :pady=>10)
limg = AnimatedImageLabel.new(f_right, :borderwidth=>0)
limg.pack(:side=>:top, :expand=>true, :padx=>10, :pady=>10)
# base64-encoded animated GIF file
tclPowerdData = <<EOD
R0lGODlhKgBAAPQAAP//////zP//AP/MzP/Mmf/MAP+Zmf+ZZv+ZAMz//8zM
zMyZmcyZZsxmZsxmAMwzAJnMzJmZzJmZmZlmmZlmZplmM5kzM2aZzGZmzGZm
mWZmZmYzZmYzMzNmzDMzZgAzmSH+IE1hZGUgd2l0aCBHSU1QIGJ5IExARGVt
YWlsbHkuY29tACH5BAVkAAEALAAAAAAqAEAAAAX+YCCOZEkyTKM2jOm66yPP
dF03bx7YcuHIDkGBR7SZeIyhTID4FZ+4Es8nQyCe2EeUNJ0peY2s9mi7PhAM
ngEAMGRbUpvzSxskLh1J+Hkg134OdDIDEB+GHxtYMEQMTjMGEYeGFoomezaC
DZGSHFmLXTQKkh8eNQVpZ2afmDQGHaOYSoEyhhcklzVmMpuHnaZmDqiGJbg0
qFqvh6UNAwB7VA+OwydEjgujkgrPNhbTI8dFvNgEYcHcHx0lB1kX2IYeA2G6
NN0YfkXJ2BsAMuAzHB9cZMk3qoEbRzUACsRCUBK5JxsC3iMiKd8GN088SIyT
0RAFSROyeEg38caDiB/+JEgqxsODrZJ1BkT0oHKSmI0ceQxo94HDpg0qsuDk
UmRAMgu8OgwQ+uIJgUMVeGXA+IQkzEeHGvD8cIGlDXsLiRjQ+EHroQhea7xY
8IQBSgYYDi1IS+OFBCgaDMGVS3fGi5BPJpBaENdQ0EomKGD56IHwO39EXiSC
Ysgxor5+Xfgq0qByYUpiXmwuoredB2aYH4gWWda0B7SeNENpEJHC1ghi+pS4
AJpIAwWvKPBi+8YEht5EriEqpFfMlhEdkBNpx0HUhwypx5T4IB1MBg/Ws2sn
wV3MSQOkzI8fUd48Aw3dOZto71x85hHtHijYv18Gf/3GqCdDCXHNoICBobSo
IqBqJLyCoH8JPrLgdh88CKCFD0CGmAiGYPgffwceZh6FC2ohIIklnkhehTNY
4CIHHGzgwYw01ujBBhvAqKOLLq5AAk9kuSPkkKO40NB+h1gnypJIIvkBf09a
N5QIRz5p5ZJXJpmlIVhOGQA2TmIJZZhKKmmll2BqyWSXWUrZpQtpatlmk1c2
KaWRHeTZEJF8SqLDn/hhsOeQgBbqAh6DGqronxeARUIIACH5BAUeAAAALAUA
LgAFAAUAAAUM4CeKz/OV5YmqaRkCACH5BAUeAAEALAUALgAKAAUAAAUUICCK
z/OdJVCaa7p+7aOWcDvTZwgAIfkEBR4AAQAsCwAuAAkABQAABRPgA4zP95zA
eZqoWqqpyqLkZ38hACH5BAUKAAEALAcALgANAA4AAAU7ICA+jwiUJEqeKau+
r+vGaTmac63v/GP9HM7GQyx+jsgkkoRUHJ3Qx0cK/VQVTKtWwbVKn9suNunc
WkMAIfkEBQoAAAAsBwA3AAcABQAABRGgIHzk842j+Yjlt5KuO8JmCAAh+QQF
CgAAACwLADcABwAFAAAFEeAnfN9TjqP5oOWziq05lmUIACH5BAUKAAAALA8A
NwAHAAUAAAUPoPCJTymS3yiQj4qOcPmEACH5BAUKAAAALBMANwAHAAUAAAUR
oCB+z/MJX2o+I2miKimiawgAIfkEBQoAAAAsFwA3AAcABQAABRGgIHzfY47j
Q4qk+aHl+pZmCAAh+QQFCgAAACwbADcABwAFAAAFEaAgfs/zCV9qPiNJouo7
ll8IACH5BAUKAAAALB8ANwADAAUAAAUIoCB8o0iWZggAOw==
EOD
l1.text('* Slow Animation *').start(300)
l2.text('* Fast Animation *').start(80)
l3.text('This is a longer scrolling text in a widget that will not show the whole message at once. ').start(150)
limg.destroy_image = true
limg.image(TkPhotoImage.new(:format=>'GIF', :data=>tclPowerdData)).start(100)

View File

@ -388,6 +388,11 @@ txt.insert('end', " \n ", tag_demospace)
txt.insert('end', "3. Color picker.\n", tag_demo, "demo-clrpick") txt.insert('end', "3. Color picker.\n", tag_demo, "demo-clrpick")
txt.insert('end', " \n ", tag_demospace) txt.insert('end', " \n ", tag_demospace)
txt.insert('end', "\n")
txt.insert('end', "Animation\n", tag_title)
txt.insert('end', " \n ", tag_demospace)
txt.insert('end', "1. Animated labels (if supported)\n", tag_demo, "demo-anilabel")
txt.insert('end', "\n") txt.insert('end', "\n")
txt.insert('end', "Miscellaneous\n", tag_title) txt.insert('end', "Miscellaneous\n", tag_title)
txt.insert('end', " \n ", tag_demospace) txt.insert('end', " \n ", tag_demospace)
@ -780,7 +785,7 @@ end
# #
def aboutBox def aboutBox
Tk.messageBox('icon'=>'info', 'type'=>'ok', 'title'=>'About Widget Demo', Tk.messageBox('icon'=>'info', 'type'=>'ok', 'title'=>'About Widget Demo',
'message'=>"Ruby/Tk widget demonstration Ver.1.4.4-en\n\n" + 'message'=>"Ruby/Tk widget demonstration Ver.1.5.0-en\n\n" +
"based on demos of Tk8.1 -- 8.5 " + "based on demos of Tk8.1 -- 8.5 " +
"( Copyright:: " + "( Copyright:: " +
"(c) 1996-1997 Sun Microsystems, Inc. / " + "(c) 1996-1997 Sun Microsystems, Inc. / " +

View File

@ -0,0 +1,174 @@
#
# animated label widget demo (called by 'widget')
#
# based on Tcl/Tk8.5a2 widget demos
# toplevel widget が存在すれば削除する
if defined?($anilabel_demo) && $anilabel_demo
$anilabel_demo.destroy
$anilabel_demo = nil
end
# demo 用の toplevel widget を生成
$anilabel_demo = TkToplevel.new {|w|
title("Animated Label Demonstration")
iconname("anilabel")
positionWindow(w)
}
# label 生成
msg = TkLabel.new($anilabel_demo) {
font $font
wraplength '4i'
justify 'left'
text "下には4つのアニメーションラベルが表示されています。左側にあるラベルは、内部のテキストメッセージをスクロールしたように見せることで動きを付けています。右側のラベルは、表示するイメージを変化させることで動きを与えています。"
}
msg.pack('side'=>'top')
# frame 生成
TkFrame.new($anilabel_demo) {|frame|
TkButton.new(frame) {
#text '了解'
text '閉じる'
command proc{
tmppath = $anilabel_demo
$anilabel_demo = nil
tmppath.destroy
}
}.pack('side'=>'left', 'expand'=>'yes')
TkButton.new(frame) {
text 'コード参照'
command proc{showCode 'label'}
}.pack('side'=>'left', 'expand'=>'yes')
}.pack('side'=>'bottom', 'fill'=>'x', 'pady'=>'2m')
# label demo 用フレーム生成
f_left = TkLabelFrame.new($anilabel_demo, :text=>'Scrolling Texts')
f_right = TkLabelFrame.new($anilabel_demo, :text=>'GIF Image')
Tk.pack(f_left, f_right, 'side'=>'left', 'expand'=>'yes', 'fill'=>'both',
'padx'=>10, 'pady'=>10)
# animated label
class AnimatedTextLabel < TkLabel
def initialize(*args)
super(*args)
@timer = TkTimer.new{ _animation_callback }
@timer.loop_exec = -1
# bind('Destroy'){ @timer.stop }
@btag = TkBindTag.new('Destroy'){ @timer.stop }
self.bindtags_unshift(@btag)
end
def _animation_callback()
txt = self.text
self.text = (txt[1..-1] << txt[0])
end
private :_animation_callback
def start(interval)
@timer.set_interval(interval)
@timer.start
end
def stop
@timer.stop
end
end
# animated image
class AnimatedImageLabel < AnimatedTextLabel
def initialize(*args)
super(*args)
@destroy_image = false
@btag.bind_append('Destroy'){
if @destroy_image
begin
self.image.delete
rescue
end
end
}
end
attr_accessor :destroy_image
def _animation_callback()
img = self.image
fmt = img.format
if fmt.kind_of?(Array)
if fmt[1].kind_of?(Hash)
# fmt == ['GIF', {'index'=>idx}]
idx = fmt[1]['index']
else
# fmt == ['GIF', '-index', idx] :: Ruby1.8.2 returns this.
idx = fmt[2]
end
elsif fmt.kind_of?(String) && fmt =~ /GIF -index (\d+)/
idx = $1.to_i
else
idx = -1
end
begin
img.format("GIF -index #{idx + 1}")
rescue => e
img.format("GIF -index 0")
end
end
private :_animation_callback
end
# label 生成
l1 = AnimatedTextLabel.new(f_left, :borderwidth=>4, :relief=>:ridge,
:font=>{:family=>'Courier', :size=>10})
l2 = AnimatedTextLabel.new(f_left, :borderwidth=>4, :relief=>:groove,
:font=>{:family=>'Courier', :size=>10})
l3 = AnimatedTextLabel.new(f_left, :borderwidth=>4, :relief=>:flat,
:font=>{:family=>'Courier', :size=>10}, :width=>18)
Tk.pack(l1, l2, l3,
:side=>:top, :expand=>true, :anchor=>:w, :padx=>10, :pady=>10)
limg = AnimatedImageLabel.new(f_right, :borderwidth=>0)
limg.pack(:side=>:top, :expand=>true, :padx=>10, :pady=>10)
# base64-encoded animated GIF file
tclPowerdData = <<EOD
R0lGODlhKgBAAPQAAP//////zP//AP/MzP/Mmf/MAP+Zmf+ZZv+ZAMz//8zM
zMyZmcyZZsxmZsxmAMwzAJnMzJmZzJmZmZlmmZlmZplmM5kzM2aZzGZmzGZm
mWZmZmYzZmYzMzNmzDMzZgAzmSH+IE1hZGUgd2l0aCBHSU1QIGJ5IExARGVt
YWlsbHkuY29tACH5BAVkAAEALAAAAAAqAEAAAAX+YCCOZEkyTKM2jOm66yPP
dF03bx7YcuHIDkGBR7SZeIyhTID4FZ+4Es8nQyCe2EeUNJ0peY2s9mi7PhAM
ngEAMGRbUpvzSxskLh1J+Hkg134OdDIDEB+GHxtYMEQMTjMGEYeGFoomezaC
DZGSHFmLXTQKkh8eNQVpZ2afmDQGHaOYSoEyhhcklzVmMpuHnaZmDqiGJbg0
qFqvh6UNAwB7VA+OwydEjgujkgrPNhbTI8dFvNgEYcHcHx0lB1kX2IYeA2G6
NN0YfkXJ2BsAMuAzHB9cZMk3qoEbRzUACsRCUBK5JxsC3iMiKd8GN088SIyT
0RAFSROyeEg38caDiB/+JEgqxsODrZJ1BkT0oHKSmI0ceQxo94HDpg0qsuDk
UmRAMgu8OgwQ+uIJgUMVeGXA+IQkzEeHGvD8cIGlDXsLiRjQ+EHroQhea7xY
8IQBSgYYDi1IS+OFBCgaDMGVS3fGi5BPJpBaENdQ0EomKGD56IHwO39EXiSC
Ysgxor5+Xfgq0qByYUpiXmwuoredB2aYH4gWWda0B7SeNENpEJHC1ghi+pS4
AJpIAwWvKPBi+8YEht5EriEqpFfMlhEdkBNpx0HUhwypx5T4IB1MBg/Ws2sn
wV3MSQOkzI8fUd48Aw3dOZto71x85hHtHijYv18Gf/3GqCdDCXHNoICBobSo
IqBqJLyCoH8JPrLgdh88CKCFD0CGmAiGYPgffwceZh6FC2ohIIklnkhehTNY
4CIHHGzgwYw01ujBBhvAqKOLLq5AAk9kuSPkkKO40NB+h1gnypJIIvkBf09a
N5QIRz5p5ZJXJpmlIVhOGQA2TmIJZZhKKmmll2BqyWSXWUrZpQtpatlmk1c2
KaWRHeTZEJF8SqLDn/hhsOeQgBbqAh6DGqronxeARUIIACH5BAUeAAAALAUA
LgAFAAUAAAUM4CeKz/OV5YmqaRkCACH5BAUeAAEALAUALgAKAAUAAAUUICCK
z/OdJVCaa7p+7aOWcDvTZwgAIfkEBR4AAQAsCwAuAAkABQAABRPgA4zP95zA
eZqoWqqpyqLkZ38hACH5BAUKAAEALAcALgANAA4AAAU7ICA+jwiUJEqeKau+
r+vGaTmac63v/GP9HM7GQyx+jsgkkoRUHJ3Qx0cK/VQVTKtWwbVKn9suNunc
WkMAIfkEBQoAAAAsBwA3AAcABQAABRGgIHzk842j+Yjlt5KuO8JmCAAh+QQF
CgAAACwLADcABwAFAAAFEeAnfN9TjqP5oOWziq05lmUIACH5BAUKAAAALA8A
NwAHAAUAAAUPoPCJTymS3yiQj4qOcPmEACH5BAUKAAAALBMANwAHAAUAAAUR
oCB+z/MJX2o+I2miKimiawgAIfkEBQoAAAAsFwA3AAcABQAABRGgIHzfY47j
Q4qk+aHl+pZmCAAh+QQFCgAAACwbADcABwAFAAAFEaAgfs/zCV9qPiNJouo7
ll8IACH5BAUKAAAALB8ANwADAAUAAAUIoCB8o0iWZggAOw==
EOD
l1.text('* Slow Animation *').start(300)
l2.text('* Fast Animation *').start(80)
l3.text('This is a longer scrolling text in a widget that will not show the whole message at once. ').start(150)
limg.destroy_image = true
limg.image(TkPhotoImage.new(:format=>'GIF', :data=>tclPowerdData)).start(100)

View File

@ -437,6 +437,12 @@ txt.insert('end', " \n ", tag_demospace)
txt.insert('end', "3. 色選択ダイアログ\n", tag_demo, "demo-clrpick") txt.insert('end', "3. 色選択ダイアログ\n", tag_demo, "demo-clrpick")
txt.insert('end', " \n ", tag_demospace) txt.insert('end', " \n ", tag_demospace)
txt.insert('end', "\n")
#txt.insert('end', "アニメーション\n", tag_middle)
txt.insert('end', "アニメーション\n", tag_kanji_title)
txt.insert('end', " \n ", tag_demospace)
txt.insert('end', "1. アニメーションラベル (機能に対応したバージョンのTkが必要)\n", tag_demo, "demo-anilabel")
txt.insert('end', "\n") txt.insert('end', "\n")
#txt.insert('end', "その他\n", tag_middle) #txt.insert('end', "その他\n", tag_middle)
txt.insert('end', "その他\n", tag_kanji_title) txt.insert('end', "その他\n", tag_kanji_title)
@ -807,7 +813,7 @@ end
# #
def aboutBox def aboutBox
Tk.messageBox('icon'=>'info', 'type'=>'ok', 'title'=>'About Widget Demo', Tk.messageBox('icon'=>'info', 'type'=>'ok', 'title'=>'About Widget Demo',
'message'=>"Ruby/Tk ウィジェットデモ Ver.1.4.4-jp\n\n" + 'message'=>"Ruby/Tk ウィジェットデモ Ver.1.5.0-jp\n\n" +
"based on demos of Tk8.1 -- 8.5 " + "based on demos of Tk8.1 -- 8.5 " +
"( Copyright:: " + "( Copyright:: " +
"(c) 1996-1997 Sun Microsystems, Inc. / " + "(c) 1996-1997 Sun Microsystems, Inc. / " +

View File

@ -159,6 +159,8 @@ href_binding = proc{|w, x, y|
# #
# #
last_dir = Dir.pwd last_dir = Dir.pwd
load_file = nil
sel_load = proc{ sel_load = proc{
filetypes = [ filetypes = [
['Html Files', ['.html', '.htm']], ['Html Files', ['.html', '.htm']],

View File

@ -8,7 +8,7 @@
************************************************/ ************************************************/
#define TKUTIL_RELEASE_DATE "2004-12-23" #define TKUTIL_RELEASE_DATE "2005-01-25"
#include "ruby.h" #include "ruby.h"
#include "rubysig.h" #include "rubysig.h"
@ -824,6 +824,8 @@ tcl2rb_bool(self, value)
value = rb_funcall(value, ID_downcase, 0); value = rb_funcall(value, ID_downcase, 0);
if (RSTRING(value)->ptr == (char*)NULL) return Qnil;
if (RSTRING(value)->ptr[0] == '\0' if (RSTRING(value)->ptr[0] == '\0'
|| strcmp(RSTRING(value)->ptr, "0") == 0 || strcmp(RSTRING(value)->ptr, "0") == 0
|| strcmp(RSTRING(value)->ptr, "no") == 0 || strcmp(RSTRING(value)->ptr, "no") == 0
@ -880,6 +882,8 @@ tkstr_to_number(value)
{ {
rb_check_type(value, T_STRING); rb_check_type(value, T_STRING);
if (RSTRING(value)->ptr == (char*)NULL) return INT2FIX(0);
return rb_rescue2(tkstr_to_int, value, return rb_rescue2(tkstr_to_int, value,
tkstr_rescue_float, value, tkstr_rescue_float, value,
rb_eArgError, 0); rb_eArgError, 0);
@ -916,6 +920,8 @@ tcl2rb_string(self, value)
{ {
rb_check_type(value, T_STRING); rb_check_type(value, T_STRING);
if (RSTRING(value)->ptr == (char*)NULL) return rb_tainted_str_new2("");
return tkstr_to_str(value); return tkstr_to_str(value);
} }
@ -926,6 +932,8 @@ tcl2rb_num_or_str(self, value)
{ {
rb_check_type(value, T_STRING); rb_check_type(value, T_STRING);
if (RSTRING(value)->ptr == (char*)NULL) return rb_tainted_str_new2("");
return rb_rescue2(tkstr_to_number, value, return rb_rescue2(tkstr_to_number, value,
tkstr_to_str, value, tkstr_to_str, value,
rb_eArgError, 0); rb_eArgError, 0);