Extended maintenance of Ruby 1.9.3 ended on February 23, 2015. Read more
TkCommandNames = ['tkwait'.freeze].freeze
TkVar_CB_TBL = {} TkVar_ID_TBL = {}
def ::callback
# File tk/lib/tk/variable.rb, line 55
def TkVariable.callback(id, name1, name2, op)
#name1,name2,op = tk_split_list(args)
#name1,name2,op = tk_split_simplelist(args)
if cb_obj = TkVar_CB_TBL[id]
#_get_eval_string(TkVar_CB_TBL[name1].trace_callback(name2,op))
begin
_get_eval_string(cb_obj.trace_callback(name2, op))
rescue SystemExit
exit(0)
rescue Interrupt
exit!(1)
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 >-------"
if TkCore::WITH_ENCODING
msg.force_encoding('utf-8')
else
msg.instance_variable_set(:@encoding, 'utf-8')
end
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
begin
raise 'check backtrace'
rescue
# ignore backtrace before 'callback'
pos = -($!.backtrace.size)
end
begin
_get_eval_string(TkVar_CB_TBL[name1].trace_callback(name2,op))
rescue
trace = $!.backtrace
raise $!, "\n#{trace[0]}: #{$!.message} (#{$!.class})\n" +
"\tfrom #{trace[1..pos].join("\n\tfrom ")}"
end
else
''
end
end
# File tk/lib/tk/variable.rb, line 282
def initialize(val="", type=nil)
# @id = Tk_VARIABLE_ID.join('')
begin
Tk_VARIABLE_ID.mutex.synchronize{
@id = Tk_VARIABLE_ID.join(TkCore::INTERP._ip_id_)
Tk_VARIABLE_ID[1].succ!
}
end until INTERP._invoke_without_enc('info', 'globals', @id).empty?
TkVar_ID_TBL.mutex.synchronize{
TkVar_ID_TBL[@id] = self
}
@var = @id
@elem = nil
@def_default = false
@default_val = nil
@trace_var = nil
@trace_elem = nil
@trace_opts = nil
@type = nil
var = self
@element_type = Hash.new{|k,v| var.default_value_type }
self.default_value_type = type
# teach Tk-ip that @id is global var
INTERP._invoke_without_enc('global', @id)
#INTERP._invoke('global', @id)
# create and init
if val.kind_of?(Hash)
# assoc-array variable
self[''] = 0
self.clear
end
self.value = val
if val == []
# INTERP._eval(format('global %s; set %s(0) 0; unset %s(0)',
# @id, @id, @id))
elsif val.kind_of?(Array)
a = []
# val.each_with_index{|e,i| a.push(i); a.push(array2tk_list(e))}
# s = '"' + a.join(" ").gsub(/[\[\]$"]/, '\\\\\&') + '"'
val.each_with_index{|e,i| a.push(i); a.push(e)}
#s = '"' + array2tk_list(a).gsub(/[\[\]$"]/, '\\\\\&') + '"'
s = '"' + array2tk_list(a).gsub(/[\[\]$"\\]/, '\\\\\&') + '"'
INTERP._eval(format('global %s; array set %s %s', @id, @id, 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(format('global %s; array set %s %s', @id, @id, s))
else
#s = '"' + _get_eval_string(val).gsub(/[\[\]$"]/, '\\\\\&') + '"'
s = '"' + _get_eval_string(val).gsub(/[\[\]$"\\]/, '\\\\\&') + '"'
INTERP._eval(format('global %s; set %s %s', @id, @id, s))
end
if 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; array set %s %s', @id, @id, s))
else
#s = '"' + _get_eval_string(val).gsub(/[\[\]$"]/, '\\\\\&') + '"'
s = '"' + _get_eval_string(val).gsub(/[\[\]$"\\]/, '\\\\\&') + '"'
INTERP._eval(Kernel.format('global %s; set %s %s', @id, @id, s))
end
end
# File tk/lib/tk/variable.rb, line 1229
def %(other)
num_or_str(self._value) % other
#begin
# number(self._value) % other
#rescue
# self._value % other
#end
end
# File tk/lib/tk/variable.rb, line 1183
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 1218
def *(other)
num_or_str(self._value) * other
#begin
# number(self._value) * other
#rescue
# self._value * other
#end
end
# File tk/lib/tk/variable.rb, line 1237
def **(other)
number(self._value) ** other
end
# File tk/lib/tk/variable.rb, line 1197
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 1211
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 1226
def /(other)
number(self._value) / other
end
# File tk/lib/tk/variable.rb, line 1283
def <=>(other)
if other.kind_of?(TkVariable)
begin
val = other.numeric
other = val
rescue
other = other._value
end
elsif other.kind_of?(Numeric)
begin
return self.numeric <=> other
rescue
return self._value <=> other.to_s
end
elsif other.kind_of?(Array)
return self.list <=> other
else
return self._value <=> other
end
end
# File tk/lib/tk/variable.rb, line 1244
def ==(other)
case other
when TkVariable
#self.equal?(other)
self._value == other._value
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
# false if self is not an assoc array
self._value == other
else
# false
self._value == _get_eval_string(other)
end
end
# File tk/lib/tk/variable.rb, line 1268
def ===(other)
if other.kind_of?(TkVariable)
self.id == other.id
else
super
end
end
# File tk/lib/tk/variable.rb, line 1240
def =~(other)
self._value =~ other
end
# File tk/lib/tk/variable.rb, line 688
def [](*idxs)
_to_default_element_type(idxs, _element_value(*idxs))
end
# File tk/lib/tk/variable.rb, line 532
def []=(*args)
val = args.pop
type = default_element_value_type(args)
val = val._value if !type && type != :variable && val.kind_of?(TkVariable)
index = args.collect{|idx| _get_eval_string(idx, true)}.join(',')
_fromUTF8(INTERP._set_global_var2(@id, index, _get_eval_string(val, true)))
#_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 777
def bool
TkComm.bool(_value)
# see Tcl_GetBoolean man-page
case _value.downcase
when '0', 'false', 'no', 'off'
false
else
true
end
end
# File tk/lib/tk/variable.rb, line 789
def bool_element(*idxs)
TkComm.bool(_element_value(*idxs))
end
# File tk/lib/tk/variable.rb, line 445
def clear
if (is_scalar?)
fail RuntimeError, 'cannot clear a scalar variable'
end
keys.each{|k| unset(k)}
self
end
# File tk/lib/tk/variable.rb, line 1159
def coerce(other)
case other
when TkVariable
[other._value, self._value]
when String
[other, self.to_s]
when Symbol
[other, self.to_sym]
when Numeric
[other, self.numeric]
when Array
[other, self.to_a]
else
[other, self._value]
end
end
# File tk/lib/tk/variable.rb, line 148
def default_element_value_type(idxs)
if idxs.kind_of?(Array)
index = idxs.collect{|idx| _get_eval_string(idx, true)}.join(',')
else
index = _get_eval_string(idxs, true)
end
@element_type[index]
end
# File tk/lib/tk/variable.rb, line 133
def default_proc(cmd = Proc.new)
@def_default = :proc
@default_val = cmd
self
end
#default_value is available only when the variable is an assoc array.
# File tk/lib/tk/variable.rb, line 117
def default_value(val=nil, &b)
if b
@def_default = :proc
@default_val = proc(&b)
else
@def_default = :val
@default_val = val
end
self
end
# File tk/lib/tk/variable.rb, line 145
def default_value_type
@type
end
# File tk/lib/tk/variable.rb, line 1106
def element_lappend(idxs, *elems)
if idxs.kind_of?(Array)
idxs = idxs.collect{|idx| _get_eval_string(idx, true)}.join(',')
end
tk_call('lappend', "#{@id}(#{idxs})", *elems)
self
end
# File tk/lib/tk/variable.rb, line 1138
def element_lget_f(elem_idxs, idx)
number(element_lget(elem_idxs, idx)).to_f
end
# File tk/lib/tk/variable.rb, line 1131
def element_lget_i(elem_idxs, idx)
number(element_lget(elem_idxs, idx)).to_i
end
# File tk/lib/tk/variable.rb, line 1118
def element_lindex(elem_idxs, idx)
if elem_idxs.kind_of?(Array)
val = _element_value(*elem_idxs)
else
val = _element_value(elem_idxs)
end
tk_call('lindex', val, idx)
end
# File tk/lib/tk/variable.rb, line 1146
def element_lset(elem_idxs, idx, val)
if elem_idxs.kind_of?(Array)
idxs = elem_idxs.collect{|i| _get_eval_string(i, true)}.join(',')
end
tk_call('lset', "#{@id}(#{idxs})", idx, val)
self
end
# File tk/lib/tk/variable.rb, line 953
def element_to_f(*idxs)
number(_element_value(*idxs)).to_f
end
# File tk/lib/tk/variable.rb, line 946
def element_to_i(*idxs)
number(_element_value(*idxs)).to_i
end
# File tk/lib/tk/variable.rb, line 963
def element_to_s(*idxs)
_element_value(*idxs)
end
# File tk/lib/tk/variable.rb, line 999
def element_to_sym(*idxs)
_element_value(*idxs).intern
end
# File tk/lib/tk/variable.rb, line 390
def eventloop_tkwait
wait(false, true)
end
# File tk/lib/tk/variable.rb, line 381
def eventloop_wait(check_root = false)
wait(false, check_root)
end
# File tk/lib/tk/variable.rb, line 417
def exist?(*elems)
INTERP._invoke_without_enc('global', @id)
if elems.empty?
TkComm.bool(tk_call('info', 'exist', @id))
else
# array
index = elems.collect{|idx| _get_eval_string(idx, true)}.join(',')
TkComm.bool(tk_call('info', 'exist', "#{@id}")) &&
TkComm.bool(tk_call('info', 'exist', "#{@id}(#{index})"))
end
end
# File tk/lib/tk/variable.rb, line 1154
def inspect
#Kernel.format "#<TkVariable: %s>", @id
'#<TkVariable: ' + @id + '>'
end
# File tk/lib/tk/variable.rb, line 406
def is_hash?
#ITNERP._eval("global #{@id}; array exist #{@id}") == '1'
INTERP._invoke_without_enc('global', @id)
# INTERP._invoke_without_enc('array', 'exist', @id) == '1'
TkComm.bool(INTERP._invoke_without_enc('array', 'exist', @id))
end
# File tk/lib/tk/variable.rb, line 413
def is_scalar?
! is_hash?
end
# File tk/lib/tk/variable.rb, line 429
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}"))
INTERP._invoke_without_enc('global', @id)
#tk_split_simplelist(INTERP._fromUTF8(INTERP._invoke_without_enc('array', 'names', @id)))
tk_split_simplelist(INTERP._invoke_without_enc('array', 'names', @id),
false, true)
end
# File tk/lib/tk/variable.rb, line 1102
def lappend(*elems)
tk_call('lappend', @id, *elems)
self
end
# File tk/lib/tk/variable.rb, line 1135
def lget_f(idx)
number(lget(idx)).to_f
end
# File tk/lib/tk/variable.rb, line 1128
def lget_i(idx)
number(lget(idx)).to_i
end
# File tk/lib/tk/variable.rb, line 1114
def lindex(idx)
tk_call('lindex', self._value, idx)
end
# File tk/lib/tk/variable.rb, line 1029
def list
#tk_split_list(value)
tk_split_simplelist(_value)
end
# File tk/lib/tk/variable.rb, line 1035
def list_element(*idxs)
tk_split_simplelist(_element_value(*idxs))
end
# File tk/lib/tk/variable.rb, line 1142
def lset(idx, val)
tk_call('lset', @id, idx, val)
self
end
# File tk/lib/tk/variable.rb, line 1279
def nonzero?
!(numeric.zero?)
end
# File tk/lib/tk/variable.rb, line 732
def numeric
number(_value)
end
# File tk/lib/tk/variable.rb, line 735
def numeric_element(*idxs)
number(_element_value(*idxs))
end
# File tk/lib/tk/variable.rb, line 1040
def numlist
list.collect!{|val| number(val)}
end
# File tk/lib/tk/variable.rb, line 1043
def numlist_element(*idxs)
list_element(*idxs).collect!{|val| number(val)}
end
# File tk/lib/tk/variable.rb, line 901
def procedure
TkComm.procedure(self._value)
end
# File tk/lib/tk/variable.rb, line 904
def procedure_element(*idxs)
TkComm.procedure(_element_value(*idxs))
end
# File tk/lib/tk/variable.rb, line 401
def ref(*idxs)
# "#{@id}(#{idxs.collect{|idx| _get_eval_string(idx)}.join(',')})"
TkVarAccess.new("#{@id}(#{idxs.collect{|idx| _get_eval_string(idx)}.join(',')})")
end
# File tk/lib/tk/variable.rb, line 792
def set_bool(val)
if ! val
self.value = '0'
else
case val.to_s.downcase
when 'false', '0', 'no', 'off'
self.value = '0'
else
self.value = '1'
end
end
self
end
# File tk/lib/tk/variable.rb, line 806
def set_bool_element(idxs, val)
if ! val
val = '0'
else
case val.to_s.downcase
when 'false', '0', 'no', 'off'
val = '0'
else
val = '1'
end
end
if idxs.kind_of?(Array)
self[*idxs]=val
else
self[idxs]=val
end
self
end
# File tk/lib/tk/variable.rb, line 830
def set_bool_element_type(idxs, val)
self.set_default_element_value_type(idxs, :bool)
self.set_bool_element(idxs, val)
end
# File tk/lib/tk/variable.rb, line 824
def set_bool_type(val)
@type = :bool
self.bool=(val)
self
end
# File tk/lib/tk/variable.rb, line 226
def set_default_element_value_type(idxs, type)
_set_default_value_type_core(type, idxs)
self
end
# File tk/lib/tk/variable.rb, line 127
def set_default_value(val)
@def_default = :val
@default_val = val
self
end
# File tk/lib/tk/variable.rb, line 220
def set_default_value_type(type)
_set_default_value_type_core(type, nil)
self
end
# File tk/lib/tk/variable.rb, line 705
def set_element_value(idxs, val)
if idxs.kind_of?(Array)
self[*idxs]=val
else
self[idxs]=val
end
self
end
# File tk/lib/tk/variable.rb, line 722
def set_element_value_type(idxs, val)
self.set_default_element_value_type(idxs, val.class)
if idxs.kind_of?(Array)
self[*idxs]=val
else
self[idxs]=val
end
self
end
# File tk/lib/tk/variable.rb, line 1047
def set_list(val)
case val
when Array
self.value=(val)
when TkVariable
self.value=(val.list)
else
raise ArgumentError, "Array is expected"
end
self
end
# File tk/lib/tk/variable.rb, line 1063
def set_list_element(idxs, val)
case val
when Array
val
when TkVariable
val = val.list
else
raise ArgumentError, "Array is expected"
end
if idxs.kind_of?(Array)
self[*idxs]=val
else
self[idxs]=val
end
self
end
# File tk/lib/tk/variable.rb, line 1087
def set_list_element_type(idxs, val)
self.set_default_element_value_type(idxs, :list)
self.set_list_element(idxs, val)
end
# File tk/lib/tk/variable.rb, line 1081
def set_list_type(val)
@type = :list
self.list=(val)
self
end
# File tk/lib/tk/variable.rb, line 738
def set_numeric(val)
case val
when Numeric
self.value=(val)
when TkVariable
self.value=(val.numeric)
else
raise ArgumentError, "Numeric is expected"
end
self
end
# File tk/lib/tk/variable.rb, line 750
def set_numeric_element(idxs, val)
case val
when Numeric
val
when TkVariable
val = val.numeric
else
raise ArgumentError, "Numeric is expected"
end
if idxs.kind_of?(Array)
self[*idxs]=val
else
self[idxs]=val
end
self
end
# File tk/lib/tk/variable.rb, line 772
def set_numeric_element_type(idxs, val)
self.set_default_element_value_type(idxs, :numeric)
self.set_numeric_element(idxs, val)
end
# File tk/lib/tk/variable.rb, line 766
def set_numeric_type(val)
@type = :numeric
self.numeric=(val)
self
end
# File tk/lib/tk/variable.rb, line 1097
def set_numlist_element_type(idxs, val)
self.set_default_element_value_type(idxs, :numlist)
self.set_numlist_element(idxs, val)
end
# File tk/lib/tk/variable.rb, line 1091
def set_numlist_type(val)
@type = :numlist
self.numlist=(val)
self
end
# File tk/lib/tk/variable.rb, line 907
def set_procedure(cmd)
self.value = cmd
self
end
# File tk/lib/tk/variable.rb, line 912
def set_procedure_element(idxs, cmd)
cmd = cmd._value if cmd.kind_of?(TkVariable)
if idxs.kind_of?(Array)
self[*idxs]=cmd
else
self[idxs]=cmd
end
self
end
# File tk/lib/tk/variable.rb, line 927
def set_procedure_element_type(idxs, cmd)
self.set_default_element_value_type(idxs, :procedure)
self.set_proceure_element(idxs, cmd)
end
# File tk/lib/tk/variable.rb, line 921
def set_procedure_type(cmd)
@type = :procedure
self.procedure=(cmd)
self
end
# File tk/lib/tk/variable.rb, line 969
def set_string(val)
val = val._value if val.kind_of?(TkVariable)
self.value=val
self
end
# File tk/lib/tk/variable.rb, line 975
def set_string_element(idxs, val)
val = val._value if val.kind_of?(TkVariable)
if idxs.kind_of?(Array)
self[*idxs]=val
else
self[idxs]=val
end
self
end
# File tk/lib/tk/variable.rb, line 990
def set_string_element_type(idxs, val)
self.set_default_element_value_type(idxs, :string)
self.set_string_element(idxs, val)
end
# File tk/lib/tk/variable.rb, line 984
def set_string_type(val)
@type = :string
self.string=(val)
self
end
# File tk/lib/tk/variable.rb, line 1003
def set_symbol(val)
val = val._value if val.kind_of?(TkVariable)
self.value=val
self
end
# File tk/lib/tk/variable.rb, line 1009
def set_symbol_element(idxs, val)
val = val._value if val.kind_of?(TkVariable)
if idxs.kind_of?(Array)
self[*idxs]=val
else
self[idxs]=val
end
self
end
# File tk/lib/tk/variable.rb, line 1024
def set_symbol_element_type(idxs, val)
self.set_default_element_value_type(idxs, :symbol)
self.set_symbol_element(idxs, val)
end
# File tk/lib/tk/variable.rb, line 1018
def set_symbol_type(val)
@type = :symbol
self.value=(val)
self
end
# File tk/lib/tk/variable.rb, line 692
def set_value(val)
self.value = val
self
end
# File tk/lib/tk/variable.rb, line 714
def set_value_type(val)
self.default_value_type = val.class
self.value = val
self
end
# File tk/lib/tk/variable.rb, line 842
def set_variable(var)
var = var.id if var.kind_of?(TkVariable)
self.value = var
self
end
# File tk/lib/tk/variable.rb, line 848
def set_variable_element(idxs, var)
var = var.id if var.kind_of?(TkVariable)
if idxs.kind_of?(Array)
self[*idxs]=var
else
self[idxs]=var
end
self
end
# File tk/lib/tk/variable.rb, line 864
def set_variable_element_type(idxs, var)
self.set_default_element_value_type(idxs, :variable)
self.set_variable_element(idxs, var)
end
# File tk/lib/tk/variable.rb, line 857
def set_variable_type(var)
@type = :variable
var = var.id if var.kind_of?(TkVariable)
self.value = var
self
end
# File tk/lib/tk/variable.rb, line 875
def set_window(win)
win = win._value if win.kind_of?(TkVariable)
self.value = win
self
end
# File tk/lib/tk/variable.rb, line 881
def set_window_element(idxs, win)
win = win._value if win.kind_of?(TkVariable)
if idxs.kind_of?(Array)
self[*idxs]=win
else
self[idxs]=win
end
self
end
# File tk/lib/tk/variable.rb, line 896
def set_window_element_type(idxs, win)
self.set_default_element_value_type(idxs, :window)
self.set_window_element(idxs, win)
end
# File tk/lib/tk/variable.rb, line 890
def set_window_type(win)
@type = :window
self.window=(win)
self
end
# File tk/lib/tk/variable.rb, line 440
def size
INTERP._invoke_without_enc('global', @id)
TkComm.number(INTERP._invoke_without_enc('array', 'size', @id))
end
# File tk/lib/tk/variable.rb, line 966
def string_element(*idxs)
_element_value(*idxs)
end
# File tk/lib/tk/variable.rb, line 393
def thread_tkwait
wait(true, true)
end
# File tk/lib/tk/variable.rb, line 384
def thread_wait(check_root = false)
wait(true, check_root)
end
# File tk/lib/tk/variable.rb, line 387
def tkwait(on_thread = true)
wait(on_thread, true)
end
# File tk/lib/tk/variable.rb, line 950
def to_f
number(_value).to_f
end
# File tk/lib/tk/variable.rb, line 697
def to_hash
hash = {}
self.keys.each{|k|
hash[k] = self[k]
}
hash
end
# File tk/lib/tk/variable.rb, line 942
def to_i
number(_value).to_i
end
# File tk/lib/tk/variable.rb, line 932
def to_proc
cmd = self.procedure
if cmd.respond_to?(:call)
cmd
else
# cmd is a String
cmd.to_sym.to_proc
end
end
# File tk/lib/tk/variable.rb, line 957
def to_s
#string(value).to_s
_value
end
# File tk/lib/tk/variable.rb, line 995
def to_sym
_value.intern
end
# File tk/lib/tk/variable.rb, line 1377
def trace(opts, cmd = Proc.new)
opts = _check_trace_opt(opts)
(@trace_var ||= []).unshift([opts,cmd])
if @trace_opts == nil
TkVar_CB_TBL[@id] = self
@trace_opts = opts.dup
if USE_OLD_TRACE_OPTION_STYLE
Tk.tk_call_without_enc('trace', 'variable',
@id, @trace_opts, 'rb_var ' << @id)
else
Tk.tk_call_without_enc('trace', 'add', 'variable',
@id, @trace_opts, 'rb_var ' << @id)
end
else
newopts = @trace_opts.dup
if USE_OLD_TRACE_OPTION_STYLE
opts.each_byte{|c| newopts.concat(c.chr) unless newopts.index(c.chr)}
if newopts != @trace_opts
Tk.tk_call_without_enc('trace', 'vdelete',
@id, @trace_opts, 'rb_var ' << @id)
@trace_opts.replace(newopts)
Tk.tk_call_without_enc('trace', 'variable',
@id, @trace_opts, 'rb_var ' << @id)
end
else
newopts |= opts
unless (newopts - @trace_opts).empty?
Tk.tk_call_without_enc('trace', 'remove', 'variable',
@id, @trace_opts, 'rb_var ' << @id)
@trace_opts.replace(newopts)
Tk.tk_call_without_enc('trace', 'add', 'variable',
@id, @trace_opts, 'rb_var ' << @id)
end
end
end
self
end
# File tk/lib/tk/variable.rb, line 1308
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 1417
def trace_element(elem, opts, cmd = Proc.new)
if @elem
fail(RuntimeError,
"invalid for a TkVariable which denotes an element of Tcl's array")
end
opts = _check_trace_opt(opts)
((@trace_elem ||= {})[elem] ||= []).unshift([opts,cmd])
if @trace_opts == nil
TkVar_CB_TBL[@id] = self
@trace_opts = opts.dup
if USE_OLD_TRACE_OPTION_STYLE
Tk.tk_call_without_enc('trace', 'add', 'variable',
@id, @trace_opts, 'rb_var ' << @id)
else
Tk.tk_call_without_enc('trace', 'variable',
@id, @trace_opts, 'rb_var ' << @id)
end
else
newopts = @trace_opts.dup
if USE_OLD_TRACE_OPTION_STYLE
opts.each_byte{|c| newopts.concat(c.chr) unless newopts.index(c.chr)}
if newopts != @trace_opts
Tk.tk_call_without_enc('trace', 'vdelete',
@id, @trace_opts, 'rb_var ' << @id)
@trace_opts.replace(newopts)
Tk.tk_call_without_enc('trace', 'variable',
@id, @trace_opts, 'rb_var ' << @id)
end
else
newopts |= opts
unless (newopts - @trace_opts).empty?
Tk.tk_call_without_enc('trace', 'remove', 'variable',
@id, @trace_opts, 'rb_var ' << @id)
@trace_opts.replace(newopts)
Tk.tk_call_without_enc('trace', 'add', 'variable',
@id, @trace_opts, 'rb_var ' << @id)
end
end
end
self
end
# File tk/lib/tk/variable.rb, line 1463
def trace_info
return [] unless @trace_var
@trace_var.dup
end
# File tk/lib/tk/variable.rb, line 1469
def trace_info_for_element(elem)
if @elem
fail(RuntimeError,
"invalid for a TkVariable which denotes an element of Tcl's array")
end
return [] unless @trace_elem
return [] unless @trace_elem[elem]
@trace_elem[elem].dup
end
# File tk/lib/tk/variable.rb, line 1480
def trace_remove(opts,cmd)
return self unless @trace_var.kind_of? Array
opts = _check_trace_opt(opts)
idx = -1
if USE_OLD_TRACE_OPTION_STYLE
newopts = ''
@trace_var.each_with_index{|e, i|
if idx < 0 && e[1] == cmd
diff = false
['a', 'r', 'w', 'u'].each{|c|
break if (diff = e[0].index(c) ^ opts.index(c))
}
unless diff
#find
idx = i
next
end
end
e[0].each_byte{|c| newopts.concat(c.chr) unless newopts.index(c.chr)}
}
else
newopts = []
@trace_var.each_with_index{|e, i|
if idx < 0 && e[1] == cmd &&
e[0].size == opts.size && (e[0] - opts).empty?
# find
idx = i
next
end
newopts |= e[0]
}
end
if idx >= 0
@trace_var.delete_at(idx)
else
return self
end
(@trace_elem ||= {}).each{|elem|
@trace_elem[elem].each{|e|
if USE_OLD_TRACE_OPTION_STYLE
e[0].each_byte{|c| newopts.concat(c.chr) unless newopts.index(c.chr)}
else
newopts |= e[0]
end
}
}
if USE_OLD_TRACE_OPTION_STYLE
diff = false
@trace_opts.each_byte{|c| break if (diff = ! newopts.index(c))}
if diff
Tk.tk_call_without_enc('trace', 'vdelete',
@id, @trace_opts, 'rb_var ' << @id)
@trace_opts.replace(newopts)
unless @trace_opts.empty?
Tk.tk_call_without_enc('trace', 'variable',
@id, @trace_opts, 'rb_var ' << @id)
end
end
else
unless (@trace_opts - newopts).empty?
Tk.tk_call_without_enc('trace', 'remove', 'variable',
@id, @trace_opts, 'rb_var ' << @id)
@trace_opts.replace(newopts)
unless @trace_opts.empty?
Tk.tk_call_without_enc('trace', 'add', 'variable',
@id, @trace_opts, 'rb_var ' << @id)
end
end
end
self
end
# File tk/lib/tk/variable.rb, line 1560
def trace_remove_for_element(elem,opts,cmd)
if @elem
fail(RuntimeError,
"invalid for a TkVariable which denotes an element of Tcl's array")
end
return self unless @trace_elem.kind_of? Hash
return self unless @trace_elem[elem].kind_of? Array
opts = _check_trace_opt(opts)
idx = -1
if USE_OLD_TRACE_OPTION_STYLE
@trace_elem[elem].each_with_index{|e, i|
if idx < 0 && e[1] == cmd
diff = false
['a', 'r', 'w', 'u'].each{|c|
break if (diff = e[0].index(c) ^ opts.index(c))
}
unless diff
#find
idx = i
next
end
end
}
else
@trace_elem[elem].each_with_index{|e, i|
if idx < 0 && e[1] == cmd &&
e[0].size == opts.size && (e[0] - opts).empty?
# find
idx = i
next
end
}
end
if idx >= 0
@trace_elem[elem].delete_at(idx)
else
return self
end
if USE_OLD_TRACE_OPTION_STYLE
newopts = ''
@trace_var.each{|e|
e[0].each_byte{|c| newopts.concat(c.chr) unless newopts.index(c.chr)}
}
@trace_elem.each{|elem|
@trace_elem[elem].each{|e|
e[0].each_byte{|c| newopts.concat(c.chr) unless newopts.index(c.chr)}
}
}
else
newopts = []
@trace_var.each{|e|
newopts |= e[0]
}
@trace_elem.each{|elem|
@trace_elem[elem].each{|e|
e[0].each_byte{|c| newopts.concat(c.chr) unless newopts.index(c.chr)}
}
}
end
if USE_OLD_TRACE_OPTION_STYLE
diff = false
@trace_opts.each_byte{|c| break if (diff = ! newopts.index(c))}
if diff
Tk.tk_call_without_enc('trace', 'vdelete',
@id, @trace_opts, 'rb_var ' << @id)
@trace_opts.replace(newopts)
unless @trace_opts.empty?
Tk.tk_call_without_enc('trace', 'variable',
@id, @trace_opts, 'rb_var ' << @id)
end
end
else
unless (@trace_opts - newopts).empty?
Tk.tk_call_without_enc('trace', 'remove', 'variable',
@id, @trace_opts, 'rb_var ' << @id)
@trace_opts.replace(newopts)
unless @trace_opts.empty?
Tk.tk_call_without_enc('trace', 'add', 'variable',
@id, @trace_opts, 'rb_var ' << @id)
end
end
end
self
end
# File tk/lib/tk/variable.rb, line 139
def undef_default
@default_val = nil
@def_default = false
self
end
# File tk/lib/tk/variable.rb, line 544
def unset(*elems)
if elems.empty?
INTERP._unset_global_var(@id)
else
index = elems.collect{|idx| _get_eval_string(idx, true)}.join(',')
INTERP._unset_global_var2(@id, index)
end
end
# File tk/lib/tk/variable.rb, line 453
def update(hash)
if (is_scalar?)
fail RuntimeError, 'cannot update a scalar variable'
end
hash.each{|k,v| self[k] = v}
self
end
# File tk/lib/tk/variable.rb, line 684
def value
_to_default_type(_value)
end
# File tk/lib/tk/variable.rb, line 482
def value=(val)
val = val._value if !@type && @type != :variable && val.kind_of?(TkVariable)
if val.kind_of?(Hash)
self.clear
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
# _fromUTF8(INTERP._set_global_var(@id, array2tk_list(val, true)))
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 835
def variable
# keeps a Tcl's variable name
TkVarAccess.new(self._value)
end
# File tk/lib/tk/variable.rb, line 839
def variable_element(*idxs)
TkVarAccess.new(_element_value(*idxs))
end
# File tk/lib/tk/variable.rb, line 362
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
# File tk/lib/tk/variable.rb, line 869
def window
TkComm.window(self._value)
end
# File tk/lib/tk/variable.rb, line 513
def _element_value(*idxs)
index = idxs.collect{|idx| _get_eval_string(idx, true)}.join(',')
begin
_fromUTF8(INTERP._get_global_var2(@id, index))
rescue => e
case @def_default
when :proc
@default_val.call(self, *idxs)
when :val
@default_val
else
fail e
end
end
#_fromUTF8(INTERP._get_global_var2(@id, index))
#_fromUTF8(INTERP._get_global_var2(@id, _toUTF8(_get_eval_string(index))))
#_fromUTF8(INTERP._get_global_var2(@id, _get_eval_string(index, true)))
end
use Tcl function version of set tkvariable
# File tk/lib/tk/variable.rb, line 470
def _value
#if INTERP._eval("global #{@id}; array exist #{@id}") == '1'
INTERP._invoke_without_enc('global', @id)
# if INTERP._invoke('array', 'exist', @id) == '1'
if TkComm.bool(INTERP._invoke('array', 'exist', @id))
#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
Commenting is here to help enhance the documentation. For example, code samples, or clarification of the documentation.
If you have questions about Ruby or the documentation, please post to one of the Ruby mailing lists. You will get better, faster, help that way.
If you wish to post a correction of the docs, please do so, but also file bug report so that it can be corrected for the next release. Thank you.
If you want to help improve the Ruby documentation, please visit Documenting-ruby.org.