| In: |
tk/lib/tk/variable.rb
|
| Parent: | Object |
| TkCommandNames | = | ['vwait'.freeze].freeze |
| TkCommandNames = [‘tkwait’.freeze].freeze | ||
| TkVar_CB_TBL | = | TkCore::INTERP.create_table |
| TkVar_CB_TBL = {} TkVar_ID_TBL = {} | ||
| TkVar_ID_TBL | = | TkCore::INTERP.create_table |
| Tk_VARIABLE_ID | = | ["v".freeze, "00000".taint].freeze |
| USE_TCLs_SET_VARIABLE_FUNCTIONS | = | true |
def TkVariable.callback(args)
# File tk/lib/tk/variable.rb, line 45 def TkVariable.callback(name1, name2, op) #name1,name2,op = tk_split_list(args) #name1,name2,op = tk_split_simplelist(args) if TkVar_CB_TBL[name1] #_get_eval_string(TkVar_CB_TBL[name1].trace_callback(name2,op)) begin _get_eval_string(TkVar_CB_TBL[name1].trace_callback(name2, op)) rescue Exception => e begin msg = _toUTF8(e.class.inspect) + ': ' + _toUTF8(e.message) + "\n" + "\n---< backtrace of Ruby side >-----\n" + _toUTF8(e.backtrace.join("\n")) + "\n---< backtrace of Tk side >-------" msg.instance_variable_set(:@encoding, 'utf-8') rescue Exception msg = e.class.inspect + ': ' + e.message + "\n" + "\n---< backtrace of Ruby side >-----\n" + e.backtrace.join("\n") + "\n---< backtrace of Tk side >-------" end fail(e, msg) end ?? else '' end end
# File tk/lib/tk/variable.rb, line 88 def initialize(val="") @id = Tk_VARIABLE_ID.join('') Tk_VARIABLE_ID[1].succ! TkVar_ID_TBL[@id] = self @trace_var = nil @trace_elem = nil @trace_opts = nil begin INTERP._unset_global_var(@id) rescue end # teach Tk-ip that @id is global var INTERP._invoke_without_enc('global', @id) #INTERP._invoke('global', @id) self.value = val ?? ?? end
# File tk/lib/tk/variable.rb, line 494 def %(other) begin number(self.value) % other rescue self.value % other end end
# File tk/lib/tk/variable.rb, line 449 def &(other) if other.kind_of?(Array) self.to_a & other.to_a else self.to_i & other.to_i end end
# File tk/lib/tk/variable.rb, line 484 def *(other) begin number(self.value) * other rescue self.value * other end end
# File tk/lib/tk/variable.rb, line 463 def +(other) case other when Array self.to_a + other when String self.value + other else begin number(self.value) + other rescue self.value + other.to_s end end end
# File tk/lib/tk/variable.rb, line 477 def -(other) if other.kind_of?(Array) self.to_a - other else number(self.value) - other end end
# File tk/lib/tk/variable.rb, line 536 def <=>(other) if other.kind_of?(TkVariable) begin val = other.numeric other = val rescue other = other.value end end if other.kind_of?(Numeric) begin return self.numeric <=> other rescue return self.value <=> other.to_s end else return self.value <=> other end end
# File tk/lib/tk/variable.rb, line 508 def ==(other) case other when TkVariable self.equal?(other) when String self.to_s == other when Symbol self.to_sym == other when Integer self.to_i == other when Float self.to_f == other when Array self.to_a == other when Hash self.value == other else false end end
# File tk/lib/tk/variable.rb, line 249 def [](index) #_fromUTF8(INTERP._get_global_var2(@id, _toUTF8(_get_eval_string(index)))) _fromUTF8(INTERP._get_global_var2(@id, _get_eval_string(index, true))) end
# File tk/lib/tk/variable.rb, line 343 def [](index) INTERP._eval(Kernel.format('global %s; set %s(%s)', @id, @id, _get_eval_string(index))) #INTERP._eval(Kernel.format('set %s(%s)', @id, _get_eval_string(index))) #INTERP._eval('set ' + @id + '(' + _get_eval_string(index) + ')') end
# File tk/lib/tk/variable.rb, line 350 def []=(index,val) INTERP._eval(Kernel.format('global %s; set %s(%s) %s', @id, @id, _get_eval_string(index), _get_eval_string(val))) #INTERP._eval(Kernel.format('set %s(%s) %s', @id, # _get_eval_string(index), _get_eval_string(val))) #INTERP._eval('set ' + @id + '(' + _get_eval_string(index) + ') ' + # _get_eval_string(val)) end
# File tk/lib/tk/variable.rb, line 254 def []=(index,val) #_fromUTF8(INTERP._set_global_var2(@id, _toUTF8(_get_eval_string(index)), # _toUTF8(_get_eval_string(val)))) _fromUTF8(INTERP._set_global_var2(@id, _get_eval_string(index, true), _get_eval_string(val, true))) end
# File tk/lib/tk/variable.rb, line 430 def coerce(other) case other when TkVariable [other.value, self.value] when String [other, self.to_s] when Symbol [other, self.to_sym] when Integer [other, self.to_i] when Float [other, self.to_f] when Array [other, self.to_a] else [other, self.value] end end
# File tk/lib/tk/variable.rb, line 166 def eventloop_wait(check_root = false) wait(false, check_root) end
# File tk/lib/tk/variable.rb, line 425 def inspect #Kernel.format "#<TkVariable: %s>", @id '#<TkVariable: ' + @id + '>' end
# File tk/lib/tk/variable.rb, line 186 def is_hash? #ITNERP._eval("global #{@id}; array exist #{@id}") == '1' ITNERP._invoke_without_enc('array', 'exist', @id) == '1' end
# File tk/lib/tk/variable.rb, line 195 def keys if (is_scalar?) fail RuntimeError, 'cannot get keys from a scalar variable' end #tk_split_simplelist(INTERP._eval("global #{@id}; array get #{@id}")) tk_split_simplelist(INTERP._fromUTF8(INTERP._invoke_without_enc('array', 'get', @id))) end
# File tk/lib/tk/variable.rb, line 407 def list #tk_split_list(value) tk_split_simplelist(value) end
# File tk/lib/tk/variable.rb, line 413 def list=(val) case val when Array self.value=(val) when TkVariable self.value=(val.list) else raise ArgumentError, "Array is expected" end val end
# File tk/lib/tk/variable.rb, line 378 def numeric=(val) case val when Numeric self.value=(val) when TkVariable self.value=(val.numeric) else raise ArgumentError, "Numeric is expected" end val end
# File tk/lib/tk/variable.rb, line 169 def thread_wait(check_root = false) wait(true, check_root) end
# File tk/lib/tk/variable.rb, line 571 def trace(opts, cmd = Proc.new) @trace_var = [] if @trace_var == nil opts = ['r','w','u'].find_all{|c| opts.index(c)}.join('') @trace_var.unshift([opts,cmd]) if @trace_opts == nil TkVar_CB_TBL[@id] = self @trace_opts = opts.dup Tk.tk_call_without_enc('trace', 'variable', @id, @trace_opts, 'rb_var') ?? else newopts = @trace_opts.dup opts.each_byte{|c| newopts += c.chr unless newopts.index(c)} if newopts != @trace_opts Tk.tk_call_without_enc('trace', 'vdelete', @id, @trace_opts, 'rb_var') @trace_opts.replace(newopts) Tk.tk_call_without_enc('trace', 'variable', @id, @trace_opts, 'rb_var') ?? end end self end
# File tk/lib/tk/variable.rb, line 560 def trace_callback(elem, op) if @trace_var.kind_of? Array @trace_var.each{|m,e| e.call(self,elem,op) if m.index(op)} end if elem.kind_of?(String) && elem != '' if @trace_elem.kind_of?(Hash) && @trace_elem[elem].kind_of?(Array) @trace_elem[elem].each{|m,e| e.call(self,elem,op) if m.index(op)} end end end
# File tk/lib/tk/variable.rb, line 618 def trace_element(elem, opts, cmd = Proc.new) @trace_elem = {} if @trace_elem == nil @trace_elem[elem] = [] if @trace_elem[elem] == nil opts = ['r','w','u'].find_all{|c| opts.index(c)}.join('') @trace_elem[elem].unshift([opts,cmd]) if @trace_opts == nil TkVar_CB_TBL[@id] = self @trace_opts = opts.dup Tk.tk_call_without_enc('trace', 'variable', @id, @trace_opts, 'rb_var') ?? else newopts = @trace_opts.dup opts.each_byte{|c| newopts += c.chr unless newopts.index(c)} if newopts != @trace_opts Tk.tk_call_without_enc('trace', 'vdelete', @id, @trace_opts, 'rb_var') @trace_opts.replace(newopts) Tk.tk_call_without_enc('trace', 'variable', @id, @trace_opts, 'rb_var') ?? end end self end
# File tk/lib/tk/variable.rb, line 677 def trace_vdelete(opts,cmd) return self unless @trace_var.kind_of? Array opts = ['r','w','u'].find_all{|c| opts.index(c)}.join('') idx = -1 newopts = '' @trace_var.each_with_index{|e,i| if idx < 0 && e[0] == opts && e[1] == cmd idx = i next end e[0].each_byte{|c| newopts += c.chr unless newopts.index(c)} } if idx >= 0 @trace_var.delete_at(idx) else return self end @trace_elem.each{|elem| @trace_elem[elem].each{|e| e[0].each_byte{|c| newopts += c.chr unless newopts.index(c)} } } newopts = ['r','w','u'].find_all{|c| newopts.index(c)}.join('') if newopts != @trace_opts Tk.tk_call_without_enc('trace', 'vdelete', @id, @trace_opts, 'rb_var') ?? @trace_opts.replace(newopts) if @trace_opts != '' Tk.tk_call_without_enc('trace', 'variable', @id, @trace_opts, 'rb_var') ?? end end self end
# File tk/lib/tk/variable.rb, line 735 def trace_vdelete_for_element(elem,opts,cmd) return self unless @trace_elem.kind_of? Hash return self unless @trace_elem[elem].kind_of? Array opts = ['r','w','u'].find_all{|c| opts.index(c)}.join('') idx = -1 @trace_elem[elem].each_with_index{|e,i| if idx < 0 && e[0] == opts && e[1] == cmd idx = i next end } if idx >= 0 @trace_elem[elem].delete_at(idx) else return self end newopts = '' @trace_var.each{|e| e[0].each_byte{|c| newopts += c.chr unless newopts.index(c)} } @trace_elem.each{|elem| @trace_elem[elem].each{|e| e[0].each_byte{|c| newopts += c.chr unless newopts.index(c)} } } newopts = ['r','w','u'].find_all{|c| newopts.index(c)}.join('') if newopts != @trace_opts Tk.tk_call_without_enc('trace', 'vdelete', @id, @trace_opts, 'rb_var') ?? @trace_opts.replace(newopts) if @trace_opts != '' Tk.tk_call_without_enc('trace', 'variable', @id, @trace_opts, 'rb_var') ?? end end self end
# File tk/lib/tk/variable.rb, line 667 def trace_vinfo return [] unless @trace_var @trace_var.dup end
# File tk/lib/tk/variable.rb, line 671 def trace_vinfo_for_element(elem) return [] unless @trace_elem return [] unless @trace_elem[elem] @trace_elem[elem].dup end
# File tk/lib/tk/variable.rb, line 359 def unset(elem=nil) if elem INTERP._eval(Kernel.format('global %s; unset %s(%s)', @id, @id, tk_tcl2ruby(elem))) #INTERP._eval(Kernel.format('unset %s(%s)', @id, tk_tcl2ruby(elem))) #INTERP._eval('unset ' + @id + '(' + _get_eval_string(elem) + ')') else INTERP._eval(Kernel.format('global %s; unset %s', @id, @id)) #INTERP._eval(Kernel.format('unset %s', @id)) #INTERP._eval('unset ' + @id) end end
# File tk/lib/tk/variable.rb, line 261 def unset(elem=nil) if elem INTERP._unset_global_var2(@id, tk_tcl2ruby(elem)) else INTERP._unset_global_var(@id) end end
use Ruby script version of set tkvariable (traditional methods)
# File tk/lib/tk/variable.rb, line 275 def value begin INTERP._eval(Kernel.format('global %s; set %s', @id, @id)) #INTERP._eval(Kernel.format('set %s', @id)) #INTERP._invoke_without_enc('set', @id) rescue if INTERP._eval(Kernel.format('global %s; array exists %s', @id, @id)) != "1" #if INTERP._eval(Kernel.format('array exists %s', @id)) != "1" #if INTERP._invoke_without_enc('array', 'exists', @id) != "1" fail else Hash[*tk_split_simplelist(INTERP._eval(Kernel.format('global %s; array get %s', @id, @id)))] #Hash[*tk_split_simplelist(_fromUTF8(INTERP._invoke_without_enc('array', 'get', @id)))] end end end
use Tcl function version of set tkvariable
# File tk/lib/tk/variable.rb, line 213 def value #if INTERP._eval("global #{@id}; array exist #{@id}") == '1' if INTERP._invoke('array', 'exist', @id) == '1' #Hash[*tk_split_simplelist(INTERP._eval("global #{@id}; array get #{@id}"))] Hash[*tk_split_simplelist(INTERP._invoke('array', 'get', @id))] else _fromUTF8(INTERP._get_global_var(@id)) end end
# File tk/lib/tk/variable.rb, line 293 def value=(val) begin #s = '"' + _get_eval_string(val).gsub(/[\[\]$"]/, '\\\\\&') + '"' s = '"' + _get_eval_string(val).gsub(/[\[\]$"\\]/, '\\\\\&') + '"' INTERP._eval(Kernel.format('global %s; set %s %s', @id, @id, s)) #INTERP._eval(Kernel.format('set %s %s', @id, s)) #_fromUTF8(INTERP._invoke_without_enc('set', @id, _toUTF8(s))) rescue if INTERP._eval(Kernel.format('global %s; array exists %s', @id, @id)) != "1" #if INTERP._eval(Kernel.format('array exists %s', @id)) != "1" #if INTERP._invoke_without_enc('array', 'exists', @id) != "1" fail else if val == [] INTERP._eval(Kernel.format('global %s; unset %s; set %s(0) 0; unset %s(0)', @id, @id, @id, @id)) #INTERP._eval(Kernel.format('unset %s; set %s(0) 0; unset %s(0)', # @id, @id, @id)) #INTERP._invoke_without_enc('unset', @id) #INTERP._invoke_without_enc('set', @id+'(0)', 0) #INTERP._invoke_without_enc('unset', @id+'(0)') elsif val.kind_of?(Array) a = [] val.each_with_index{|e,i| a.push(i); a.push(array2tk_list(e))} #s = '"' + a.join(" ").gsub(/[\[\]$"]/, '\\\\\&') + '"' s = '"' + a.join(" ").gsub(/[\[\]$"\\]/, '\\\\\&') + '"' INTERP._eval(Kernel.format('global %s; unset %s; array set %s %s', @id, @id, @id, s)) #INTERP._eval(Kernel.format('unset %s; array set %s %s', # @id, @id, s)) #INTERP._invoke_without_enc('unset', @id) #_fromUTF8(INTERP._invoke_without_enc('array','set', @id, _toUTF8(s))) elsif val.kind_of?(Hash) #s = '"' + val.to_a.collect{|e| array2tk_list(e)}.join(" ")\ # .gsub(/[\[\]$"]/, '\\\\\&') + '"' s = '"' + val.to_a.collect{|e| array2tk_list(e)}.join(" ")\ .gsub(/[\[\]$\\"]/, '\\\\\&') + '"' INTERP._eval(Kernel.format('global %s; unset %s; array set %s %s', @id, @id, @id, s)) #INTERP._eval(Kernel.format('unset %s; array set %s %s', # @id, @id, s)) #INTERP._invoke_without_enc('unset', @id) #_fromUTF8(INTERP._invoke_without_enc('array','set', @id, _toUTF8(s))) else fail end end end end
# File tk/lib/tk/variable.rb, line 223 def value=(val) if val.kind_of?(Hash) val.each{|k, v| #INTERP._set_global_var2(@id, _toUTF8(_get_eval_string(k)), # _toUTF8(_get_eval_string(v))) INTERP._set_global_var2(@id, __get_eval_string(k, true), _get_eval_string(v, true)) } self.value elsif val.kind_of?(Array) INTERP._set_global_var(@id, '') val.each{|v| #INTERP._set_variable(@id, _toUTF8(_get_eval_string(v)), INTERP._set_variable(@id, _get_eval_string(v, true), TclTkLib::VarAccessFlag::GLOBAL_ONLY | TclTkLib::VarAccessFlag::LEAVE_ERR_MSG | TclTkLib::VarAccessFlag::APPEND_VALUE | TclTkLib::VarAccessFlag::LIST_ELEMENT) } self.value else #_fromUTF8(INTERP._set_global_var(@id, _toUTF8(_get_eval_string(val)))) _fromUTF8(INTERP._set_global_var(@id, _get_eval_string(val, true))) end end
# File tk/lib/tk/variable.rb, line 147 def wait(on_thread = false, check_root = false) if $SAFE >= 4 fail SecurityError, "can't wait variable at $SAFE >= 4" end on_thread &= (Thread.list.size != 1) if on_thread if check_root INTERP._thread_tkwait('variable', @id) else INTERP._thread_vwait(@id) end else if check_root INTERP._invoke_without_enc('tkwait', 'variable', @id) else INTERP._invoke_without_enc('vwait', @id) end end end