1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00

* 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>
* 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
if try_run(<<EOF)
#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;
int main() { exit((Tcl_GetThreadData(&dataKey, 1) == dataKey)? 1: 0); }
EOF
@ -230,11 +239,11 @@ EOF
**
*****************************************************************************
')
$CPPFLAGS += ' -DWITH_TCL_ENABLE_THREAD=0'
$CPPFLAGS += ' -DWITH_TCL_ENABLE_THREAD=1'
return false
else
# ruby -> disable && tcl -> disable
$CPPFLAGS += ' -DWITH_TCL_ENABLE_THREAD=1'
$CPPFLAGS += ' -DWITH_TCL_ENABLE_THREAD=0'
return true
end
end

View file

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

View file

@ -762,7 +762,11 @@ class MultiTkIp
#slave_ip.delete
slave_ip._eval_without_enc('exit')
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)
@ -1560,10 +1564,14 @@ class << MultiTkIp
__getip.delete
end
def deleteed?
def deleted?
__getip.deleted?
end
def null_namespace?
__getip.null_namespace?
end
def abort(msg = nil)
__getip.abort(msg)
end
@ -1886,6 +1894,10 @@ class MultiTkIp
@interp.deleted?
end
def null_namespace?
@interp.null_namespace?
end
def abort(msg = nil)
if master?
if msg
@ -2217,7 +2229,7 @@ class MultiTkIp
def set_bgerror_handler(cmd = Proc.new, slave = nil, &b)
unless TkComm._callback_entry?(cmd)
unless slave
if !slave && b
slave = cmd
cmd = Proc.new(&b)
end

View file

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

View file

@ -913,7 +913,7 @@ module TkComm
#end
def bind(tagOrClass, context, *args)
# 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
else
cmd = Proc.new
@ -928,7 +928,7 @@ module TkComm
#end
def bind_append(tagOrClass, context, *args)
# 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
else
cmd = Proc.new
@ -952,7 +952,7 @@ module TkComm
#end
def bind_all(context, *args)
# 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
else
cmd = Proc.new
@ -967,7 +967,7 @@ module TkComm
#end
def bind_append_all(context, *args)
# 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
else
cmd = Proc.new
@ -2131,7 +2131,7 @@ module TkBindCore
#end
def bind(context, *args)
# 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
else
cmd = Proc.new
@ -2144,7 +2144,7 @@ module TkBindCore
#end
def bind_append(context, *args)
# 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
else
cmd = Proc.new
@ -3940,7 +3940,7 @@ end
#Tk.freeze
module Tk
RELEASE_DATE = '2004-12-27'.freeze
RELEASE_DATE = '2005-01-25'.freeze
autoload :AUTO_PATH, 'tk/variable'
autoload :TCL_PACKAGE_PATH, 'tk/variable'

View file

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

View file

@ -100,7 +100,7 @@ class TkCanvas<TkWindow
#end
def itembind(tag, context, *args)
# 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
else
cmd = Proc.new
@ -115,7 +115,7 @@ class TkCanvas<TkWindow
#end
def itembind_append(tag, context, *args)
# 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
else
cmd = Proc.new

View file

@ -27,7 +27,7 @@ module TkcTagAccess
#end
def bind(seq, *args)
# 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
else
cmd = Proc.new
@ -42,7 +42,7 @@ module TkcTagAccess
#end
def bind_append(seq, *args)
# 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
else
cmd = Proc.new

View file

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

View file

@ -589,7 +589,7 @@ class TkText<TkTextWin
#end
def tag_bind(tag, seq, *args)
# 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
else
cmd = Proc.new
@ -604,7 +604,7 @@ class TkText<TkTextWin
#end
def tag_bind_append(tag, seq, *args)
# 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
else
cmd = Proc.new

View file

@ -173,7 +173,7 @@ class TkTextTag<TkObject
#end
def bind(seq, *args)
# 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
else
cmd = Proc.new
@ -188,7 +188,7 @@ class TkTextTag<TkObject
#end
def bind_append(seq, *args)
# 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
else
cmd = Proc.new

View file

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

View file

@ -78,7 +78,7 @@ module Tk::BLT
#end
def bind(context, *args)
# 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
else
cmd = Proc.new
@ -92,7 +92,7 @@ module Tk::BLT
#end
def bind_append(context, *args)
# 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
else
cmd = Proc.new
@ -243,7 +243,7 @@ module Tk::BLT
#end
def tabbind(tag, context, *args)
# 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
else
cmd = Proc.new
@ -257,7 +257,7 @@ module Tk::BLT
#end
def tabbind_append(tag, context, *args)
# 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
else
cmd = Proc.new

View file

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

View file

@ -29,7 +29,7 @@ class Tk::BWidget::LabelEntry
#end
def entrybind(context, *args)
# 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
else
cmd = Proc.new
@ -44,7 +44,7 @@ class Tk::BWidget::LabelEntry
#end
def entrybind_append(context, *args)
#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
else
cmd = Proc.new

View file

@ -50,7 +50,7 @@ class Tk::BWidget::ListBox
#end
def imagebind(context, *args)
#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
else
cmd = Proc.new
@ -66,7 +66,7 @@ class Tk::BWidget::ListBox
#end
def imagebind_append(context, *args)
#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
else
cmd = Proc.new
@ -91,7 +91,7 @@ class Tk::BWidget::ListBox
#end
def textbind(context, *args)
#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
else
cmd = Proc.new
@ -107,7 +107,7 @@ class Tk::BWidget::ListBox
#end
def textbind_append(context, *args)
#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
else
cmd = Proc.new

View file

@ -47,7 +47,7 @@ class Tk::BWidget::NoteBook
#end
def tabbind(context, *args)
#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
else
cmd = Proc.new
@ -63,7 +63,7 @@ class Tk::BWidget::NoteBook
#end
def tabbind_append(context, *args)
#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
else
cmd = Proc.new

View file

@ -28,7 +28,7 @@ class Tk::BWidget::SpinBox
#end
def entrybind(context, *args)
#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
else
cmd = Proc.new
@ -43,7 +43,7 @@ class Tk::BWidget::SpinBox
#end
def entrybind_append(context, *args)
#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
else
cmd = Proc.new

View file

@ -47,7 +47,7 @@ class Tk::BWidget::Tree
#end
def imagebind(context, *args)
#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
else
cmd = Proc.new
@ -63,7 +63,7 @@ class Tk::BWidget::Tree
#end
def imagebind_append(context, *args)
#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
else
cmd = Proc.new
@ -88,7 +88,7 @@ class Tk::BWidget::Tree
#end
def textbind(context, *args)
#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
else
cmd = Proc.new
@ -104,7 +104,7 @@ class Tk::BWidget::Tree
#end
def textbind_append(context, *args)
#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
else
cmd = Proc.new

View file

@ -351,7 +351,7 @@ module Tk
end
end
# 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
else
cmd = Proc.new
@ -380,7 +380,7 @@ module Tk
end
end
# 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
else
cmd = Proc.new

View file

@ -103,7 +103,7 @@ class Tk::Iwidgets::Scrolledcanvas
#end
def itembind(tag, context, *args)
# 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
else
cmd = Proc.new
@ -118,7 +118,7 @@ class Tk::Iwidgets::Scrolledcanvas
#end
def itembind_append(tag, context, *args)
# 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
else
cmd = Proc.new

View file

@ -89,7 +89,7 @@ module Tk
#end
def dnd_bindtarget(type, event, *args)
# 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
else
cmd = Proc.new
@ -129,7 +129,7 @@ module Tk
#end
def dnd_bindsource(type, *args)
# 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
else
cmd = Proc.new

View file

@ -749,7 +749,7 @@ class Tk::TreeCtrl
#end
def notify_bind(obj, event, *args)
# 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
else
cmd = Proc.new
@ -764,7 +764,7 @@ class Tk::TreeCtrl
#end
def notify_bind_append(obj, event, *args)
# 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
else
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', " \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', "Miscellaneous\n", tag_title)
txt.insert('end', " \n ", tag_demospace)
@ -780,7 +785,7 @@ end
#
def aboutBox
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 " +
"( Copyright:: " +
"(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', " \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", tag_middle)
txt.insert('end', "その他\n", tag_kanji_title)
@ -807,7 +813,7 @@ end
#
def aboutBox
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 " +
"( Copyright:: " +
"(c) 1996-1997 Sun Microsystems, Inc. / " +

View file

@ -159,6 +159,8 @@ href_binding = proc{|w, x, y|
#
#
last_dir = Dir.pwd
load_file = nil
sel_load = proc{
filetypes = [
['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 "rubysig.h"
@ -824,6 +824,8 @@ tcl2rb_bool(self, value)
value = rb_funcall(value, ID_downcase, 0);
if (RSTRING(value)->ptr == (char*)NULL) return Qnil;
if (RSTRING(value)->ptr[0] == '\0'
|| strcmp(RSTRING(value)->ptr, "0") == 0
|| strcmp(RSTRING(value)->ptr, "no") == 0
@ -880,6 +882,8 @@ tkstr_to_number(value)
{
rb_check_type(value, T_STRING);
if (RSTRING(value)->ptr == (char*)NULL) return INT2FIX(0);
return rb_rescue2(tkstr_to_int, value,
tkstr_rescue_float, value,
rb_eArgError, 0);
@ -916,6 +920,8 @@ tcl2rb_string(self, value)
{
rb_check_type(value, T_STRING);
if (RSTRING(value)->ptr == (char*)NULL) return rb_tainted_str_new2("");
return tkstr_to_str(value);
}
@ -926,6 +932,8 @@ tcl2rb_num_or_str(self, value)
{
rb_check_type(value, T_STRING);
if (RSTRING(value)->ptr == (char*)NULL) return rb_tainted_str_new2("");
return rb_rescue2(tkstr_to_number, value,
tkstr_to_str, value,
rb_eArgError, 0);