diff options
author | nagai <nagai@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2004-07-15 01:18:57 +0000 |
---|---|---|
committer | nagai <nagai@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2004-07-15 01:18:57 +0000 |
commit | ce1b23b7a5a496f4b6d3ad4627a161b1dc6945fe (patch) | |
tree | d7dca8b035286a8a852c021318fa04a4efa43aa8 /ext/tk/tkutil.c | |
parent | 6c6a24826c5fda68e04e71ac17620b0e70bca265 (diff) |
* ext/tk/, ext/tcltklib/: bug fix
* ext/tk/lib/tk.rb: better operation for SIGINT when processing callbacks.
* ext/tk/lib/tk/msgcat.rb: ditto.
* ext/tk/lib/tk/variable.rb: ditto.
* ext/tk/lib/tk/timer.rb: ditto.
* ext/tk/lib/tk/validation.rb: add Tk::ValidateConfigure.__def_validcmd()
to define validatecommand methods easier
* ext/tk/lib/tk.rb (_genobj_for_tkwidget): support autoload Tk ext classes
* ext/tk/lib/tk/canvas.rb and so on: remove the parent widget type check
for items (e.g. canvas items; depends on the class) to avoid some troubles
on Tk extension widget class definition.
* ext/tk/lib/tkextlib/: add Iwidget and TkTable extension support
* ext/tk/sample/tkextlib/: add samples of Iwidget and TkTable
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@6630 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'ext/tk/tkutil.c')
-rw-r--r-- | ext/tk/tkutil.c | 40 |
1 files changed, 28 insertions, 12 deletions
diff --git a/ext/tk/tkutil.c b/ext/tk/tkutil.c index 4654619169..37af36b049 100644 --- a/ext/tk/tkutil.c +++ b/ext/tk/tkutil.c @@ -436,11 +436,13 @@ assoc2kv_enc(assoc, ary, self) } static int -push_kv(key, val, ary) +push_kv(key, val, args) VALUE key; VALUE val; - VALUE ary; + VALUE args; { + volatile VALUE ary = RARRAY(args)->ptr[0]; + if (key == Qundef) return ST_CONTINUE; #if 0 rb_ary_push(ary, key2keyname(key)); @@ -448,7 +450,10 @@ push_kv(key, val, ary) #endif RARRAY(ary)->ptr[RARRAY(ary)->len++] = key2keyname(key); - if (val != TK_None) RARRAY(ary)->ptr[RARRAY(ary)->len++] = val; + if (val == TK_None) return ST_CONTINUE; + + RARRAY(ary)->ptr[RARRAY(ary)->len++] + = get_eval_string_core(val, Qnil, RARRAY(args)->ptr[1]); return ST_CONTINUE; } @@ -459,16 +464,20 @@ hash2kv(hash, ary, self) VALUE ary; VALUE self; { + volatile VALUE args = rb_ary_new2(2); volatile VALUE dst = rb_ary_new2(2 * RHASH(hash)->tbl->num_entries); RARRAY(dst)->len = 0; - st_foreach(RHASH(hash)->tbl, push_kv, dst); + RARRAY(args)->ptr[0] = dst; + RARRAY(args)->ptr[1] = self; + RARRAY(args)->len = 2; + st_foreach(RHASH(hash)->tbl, push_kv, args); if (NIL_P(ary)) { return dst; } else { - return rb_ary_plus(ary, dst); + return rb_ary_concat(ary, dst); } } @@ -517,7 +526,7 @@ hash2kv_enc(hash, ary, self) if (NIL_P(ary)) { return dst; } else { - return rb_ary_plus(ary, dst); + return rb_ary_concat(ary, dst); } } @@ -773,6 +782,10 @@ tcl2rb_bool(self, value) } } + if (TYPE(value) == T_TRUE || TYPE(value) == T_FALSE) { + return value; + } + rb_check_type(value, T_STRING); value = rb_funcall(value, ID_downcase, 0); @@ -1040,6 +1053,7 @@ cbsubst_table_setup(self, key_inf, proc_inf) struct cbsubst_info *subst_inf; int idx; int len = RARRAY(key_inf)->len; + int real_len = 0; char *key = ALLOC_N(char, len + 1); char *type = ALLOC_N(char, len + 1); ID *ivar = ALLOC_N(ID, len + 1); @@ -1048,7 +1062,7 @@ cbsubst_table_setup(self, key_inf, proc_inf) /* init */ subst_inf = ALLOC(struct cbsubst_info); - subst_inf->size = len; + /* subst_inf->size = len; */ subst_inf->key = key; subst_inf->type = type; subst_inf->ivar = ivar; @@ -1063,10 +1077,10 @@ cbsubst_table_setup(self, key_inf, proc_inf) for(idx = 0; idx < len; idx++) { inf = RARRAY(key_inf)->ptr[idx]; if (TYPE(inf) != T_ARRAY) continue; - *(key + idx) = (char)NUM2INT(RARRAY(inf)->ptr[0]); - *(type + idx) = (char)NUM2INT(RARRAY(inf)->ptr[1]); + *(key + real_len) = (char)NUM2INT(RARRAY(inf)->ptr[0]); + *(type + real_len) = (char)NUM2INT(RARRAY(inf)->ptr[1]); - *(ivar + idx) + *(ivar + real_len) = rb_intern( RSTRING( rb_str_cat2(rb_str_new2("@"), @@ -1075,9 +1089,11 @@ cbsubst_table_setup(self, key_inf, proc_inf) ); rb_attr(self, SYM2ID(RARRAY(inf)->ptr[2]), 1, 0, Qtrue); + real_len++; } - *(key + len) = '\0'; - *(type + len) = '\0'; + *(key + real_len) = '\0'; + *(type + real_len) = '\0'; + subst_inf->size = real_len; /* * procs : array of [type, proc] |