# module TkComm

define TkComm module (step 1: basic functions)

define TkComm module (step 2: event binding)

### Constants

GET_CONFIGINFO_AS_ARRAY

  GET_CONFIGINFO_AS_ARRAY = false => returns a Hash { opt =>val, … }

      true  => returns an Array [[opt,val], ... ]

  val is a list which includes resource info.

GET_CONFIGINFOwoRES_AS_ARRAY

  for configinfo without resource info; list of [opt, value] pair

      false => returns a Hash { opt=>val, ... }
      true  => returns an Array [[opt,val], ... ]

TkExtlibAutoloadModule
Tk_CMDTBL

  for backward compatibility

Tk_IDs

  Tk_CMDTBL = {} Tk_WINDOWS = {}

Tk_WINDOWS
USE_TCLs_LIST_FUNCTIONS
WidgetClassNames

### Public Class Methods

_at(x,y=nil) click to toggle source

    # File lib/tk.rb, line 222
    def _at(x,y=nil)
      if y
        "@#{Integer(x)},#{Integer(y)}"
      else
        "@#{Integer(x)}"
      end
    end

_callback_entry?(obj) click to toggle source

    # File lib/tk.rb, line 690
    def _callback_entry?(obj)
      obj.kind_of?(Proc) || obj.kind_of?(Method) || obj.kind_of?(TkCallbackEntry)
    end

_callback_entry_class?(cls) click to toggle source

    # File lib/tk.rb, line 684
    def _callback_entry_class?(cls)
      cls <= Proc || cls <= Method || cls <= TkCallbackEntry
    end

_curr_cmd_id() click to toggle source

# begin¶ ↑

    ### --> definition is moved to TkUtil module
    def _conv_args(args, enc_mode, *src_args)
      conv_args = []
      src_args.each{|arg|
        conv_args << _get_eval_string(arg, enc_mode) unless arg == None
        # if arg.kind_of?(Hash)
        # arg.each{|k, v|
        #   args << '-' + k.to_s
        #   args << _get_eval_string(v, enc_mode)
        # }
        # elsif arg != None
        #   args << _get_eval_string(arg, enc_mode)
        # end
      }
      args + conv_args
    end
    private :_conv_args

# end¶ ↑

    # File lib/tk.rb, line 819
    def _curr_cmd_id
      #id = format("c%.4d", Tk_IDs[0])
      id = "c" + TkCore::INTERP._ip_id_ + TkComm::Tk_IDs[0]
    end

_fromUTF8(str, encoding = nil) click to toggle source

    # File lib/tk.rb, line 678
    def _fromUTF8(str, encoding = nil)
      TkCore::INTERP._fromUTF8(str, encoding)
    end

_genobj_for_tkwidget(path) click to toggle source

    # File lib/tk.rb, line 106
      def _genobj_for_tkwidget(path)
        return TkRoot.new if path == '.'

        begin
          #tk_class = TkCore::INTERP._invoke('winfo', 'class', path)
          tk_class = Tk.ip_invoke_without_enc('winfo', 'class', path)
        rescue
          return path
        end

        if ruby_class = WidgetClassNames[tk_class]
          ruby_class_name = ruby_class.name
          # gen_class_name = ruby_class_name + 'GeneratedOnTk'
          gen_class_name = ruby_class_name
          classname_def = ''
        else # ruby_class == nil
          if Tk.const_defined?(tk_class)
            Tk.const_get(tk_class)  # auto_load
            ruby_class = WidgetClassNames[tk_class]
          end

          unless ruby_class
            mods = TkExtlibAutoloadModule.find_all{|m| m.const_defined?(tk_class)}
            mods.each{|mod|
              begin
                mod.const_get(tk_class)  # auto_load
                break if (ruby_class = WidgetClassNames[tk_class])
              rescue LoadError
                # ignore load error
              end
            }
          end

          unless ruby_class
            std_class = 'Tk' << tk_class
            if Object.const_defined?(std_class)
              Object.const_get(std_class)  # auto_load
              ruby_class = WidgetClassNames[tk_class]
            end
          end

          unless ruby_class
            if Tk.const_defined?('TOPLEVEL_ALIASES') &&
                Tk::TOPLEVEL_ALIASES.const_defined?(std_class)
              Tk::TOPLEVEL_ALIASES.const_get(std_class)  # auto_load
              ruby_class = WidgetClassNames[tk_class]
            end
          end

          if ruby_class
            # found
            ruby_class_name = ruby_class.name
            gen_class_name = ruby_class_name
            classname_def = ''
          else
            # unknown
            ruby_class_name = 'TkWindow'
            gen_class_name = 'TkWidget_' + tk_class
            classname_def = "WidgetClassName = '#{tk_class}'.freeze"
          end
        end

    ###################################
    =begin
        if ruby_class = WidgetClassNames[tk_class]
          ruby_class_name = ruby_class.name
          # gen_class_name = ruby_class_name + 'GeneratedOnTk'
          gen_class_name = ruby_class_name
          classname_def = ''
        else
          mod = TkExtlibAutoloadModule.find{|m| m.const_defined?(tk_class)}
          if mod
            ruby_class_name = mod.name + '::' + tk_class
            gen_class_name = ruby_class_name
            classname_def = ''
          elsif Object.const_defined?('Tk' + tk_class)
            ruby_class_name = 'Tk' + tk_class
            # gen_class_name = ruby_class_name + 'GeneratedOnTk'
            gen_class_name = ruby_class_name
            classname_def = ''
          else
            ruby_class_name = 'TkWindow'
            # gen_class_name = ruby_class_name + tk_class + 'GeneratedOnTk'
            gen_class_name = 'TkWidget_' + tk_class
            classname_def = "WidgetClassName = '#{tk_class}'.freeze"
          end
        end
    =end

    =begin
        unless Object.const_defined? gen_class_name
          Object.class_eval "class #{gen_class_name}<#{ruby_class_name}
                               #{classname_def}
                             end"
        end
        Object.class_eval "#{gen_class_name}.new('widgetname'=>'#{path}',
                                                 'without_creating'=>true)"
    =end
        base = Object
        gen_class_name.split('::').each{|klass|
          next if klass == ''
          if base.const_defined?(klass)
            base = base.class_eval klass
          else
            base = base.class_eval "class #{klass}<#{ruby_class_name}
                                      #{classname_def}
                                    end
                                    #{klass}"
          end
        }
        base.class_eval "#{gen_class_name}.new('widgetname'=>'#{path}',
                                               'without_creating'=>true)"
      end

_next_cmd_id() click to toggle source

    # File lib/tk.rb, line 823
    def _next_cmd_id
      TkComm::Tk_IDs.mutex.synchronize{
        id = _curr_cmd_id
        #Tk_IDs[0] += 1
        TkComm::Tk_IDs[0].succ!
        id
      }
    end

_toUTF8(str, encoding = nil) click to toggle source

    # File lib/tk.rb, line 675
    def _toUTF8(str, encoding = nil)
      TkCore::INTERP._toUTF8(str, encoding)
    end

array2tk_list(ary, enc=nil) click to toggle source

    # File lib/tk.rb, line 356
    def array2tk_list(ary, enc=nil)
      return "" if ary.size == 0

      sys_enc = TkCore::INTERP.encoding
      sys_enc = TclTkLib.encoding_system unless sys_enc

      dst_enc = (enc == nil)? sys_enc: enc

      dst = ary.collect{|e|
        if e.kind_of? Array
          s = array2tk_list(e, enc)
        elsif e.kind_of? Hash
          tmp_ary = []
          #e.each{|k,v| tmp_ary << k << v }
          e.each{|k,v| tmp_ary << "-#{_get_eval_string(k)}" << v }
          s = array2tk_list(tmp_ary, enc)
        else
          s = _get_eval_string(e, enc)
        end

        if dst_enc != true && dst_enc != false
          if (s_enc = s.instance_variable_get(:@encoding))
            s_enc = s_enc.to_s
          elsif TkCore::WITH_ENCODING
            s_enc = s.encoding.name
          else
            s_enc = sys_enc
          end
          dst_enc = true if s_enc != dst_enc
        end

        s
      }

      if sys_enc && dst_enc
        dst.map!{|s| _toUTF8(s)}
        ret = TkCore::INTERP._merge_tklist(*dst)
        if TkCore::WITH_ENCODING
          if dst_enc.kind_of?(String)
            ret = _fromUTF8(ret, dst_enc)
            ret.force_encoding(dst_enc)
          else
            ret.force_encoding('utf-8')
          end
        else # without encoding
          if dst_enc.kind_of?(String)
            ret = _fromUTF8(ret, dst_enc)
            ret.instance_variable_set(:@encoding, dst_enc)
          else
            ret.instance_variable_set(:@encoding, 'utf-8')
          end
        end
        ret
      else
        TkCore::INTERP._merge_tklist(*dst)
      end
    end

bool(p1) click to toggle source

/

    static VALUE
    tcl2rb_bool(self, value)
        VALUE self;
        VALUE value;
    {
        if (RB_TYPE_P(value, T_FIXNUM)) {
            if (NUM2INT(value) == 0) {
                return Qfalse;
            } else {
                return Qtrue;
            }
        }

        if (value == Qtrue || value == Qfalse) {
            return value;
        }

        rb_check_type(value, T_STRING);

        value = rb_funcall(value, ID_downcase, 0);

        if (RSTRING_PTR(value) == (char*)NULL) return Qnil;

        if (RSTRING_PTR(value)[0] == '\0'
            || strcmp(RSTRING_PTR(value), "0") == 0
            || strcmp(RSTRING_PTR(value), "no") == 0
            || strcmp(RSTRING_PTR(value), "off") == 0
            || strcmp(RSTRING_PTR(value), "false") == 0) {
            return Qfalse;
        } else {
            return Qtrue;
        }
    }

image_obj(val) click to toggle source

    # File lib/tk.rb, line 614
    def image_obj(val)
      if val =~ /^i(_\d+_)?\d+$/
        TkImage::Tk_IMGTBL.mutex.synchronize{
          TkImage::Tk_IMGTBL[val]? TkImage::Tk_IMGTBL[val] : val
        }
      else
        val
      end
    end

install_cmd(cmd, local_cmdtbl=nil) click to toggle source

    # File lib/tk.rb, line 834
    def TkComm.install_cmd(cmd, local_cmdtbl=nil)
      return '' if cmd == ''
      begin
        ns = TkCore::INTERP._invoke_without_enc('namespace', 'current')
        ns = nil if ns == '::' # for backward compatibility
      rescue
        # probably, Tcl7.6
        ns = nil
      end
      id = _next_cmd_id
      #Tk_CMDTBL[id] = cmd
      if cmd.kind_of?(TkCallbackEntry)
        TkCore::INTERP.tk_cmd_tbl[id] = cmd
      else
        TkCore::INTERP.tk_cmd_tbl[id] = TkCore::INTERP.get_cb_entry(cmd)
      end
      @cmdtbl = [] unless defined? @cmdtbl
      TkUtil.untrust(@cmdtbl) unless @cmdtbl.tainted?
      @cmdtbl.push id

      if local_cmdtbl && local_cmdtbl.kind_of?(Array)
        begin
          local_cmdtbl << id
        rescue Exception
          # ignore
        end
      end

      #return Kernel.format("rb_out %s", id);
      if ns
        'rb_out' << TkCore::INTERP._ip_id_ << ' ' << ns << ' ' << id
      else
        'rb_out' << TkCore::INTERP._ip_id_ << ' ' << id
      end
    end

list(val, depth=0, enc=true) click to toggle source

# begin¶ ↑

    ### --> definition is moved to TkUtil module
    def bool(val)
      case val
      when "1", 1, 'yes', 'true'
        true
      else
        false
      end
    end

    def number(val)
      case val
      when /^-?\d+$/
        val.to_i
      when /^-?\d+\.?\d*(e[-+]?\d+)?$/
        val.to_f
      else
        fail(ArgumentError, "invalid value for Number:'#{val}'")
      end
    end
    def string(val)
      if val == "{}"
        ''
      elsif val[0] == ?{ && val[-1] == ?}
        val[1..-2]
      else
        val
      end
    end
    def num_or_str(val)
      begin
        number(val)
      rescue ArgumentError
        string(val)
      end
    end

# end¶ ↑

    # File lib/tk.rb, line 599
    def list(val, depth=0, enc=true)
      tk_split_list(val, depth, enc, enc)
    end

num_or_nil(p1) click to toggle source

    static VALUE
    tcl2rb_num_or_nil(self, value)
        VALUE self;
        VALUE value;
    {
        rb_check_type(value, T_STRING);

        if (RSTRING_LEN(value) == 0) return Qnil;

        return tkstr_to_number(value);
    }

num_or_str(p1) click to toggle source

    static VALUE
    tcl2rb_num_or_str(self, value)
        VALUE self;
        VALUE value;
    {
        rb_check_type(value, T_STRING);

        if (RSTRING_PTR(value) == (char*)NULL) return rb_tainted_str_new2("");

        return rb_rescue2(tkstr_to_number, value,
                          tkstr_to_str, value,
                          rb_eArgError, 0);
    }

number(p1) click to toggle source

    static VALUE
    tcl2rb_number(self, value)
        VALUE self;
        VALUE value;
    {
        return tkstr_to_number(value);
    }

procedure(val) click to toggle source

    # File lib/tk.rb, line 623
      def procedure(val)
    =begin
        if val =~ /^rb_out\S* (c(_\d+_)?\d+)/
          #Tk_CMDTBL[$1]
          #TkCore::INTERP.tk_cmd_tbl[$1]
          TkCore::INTERP.tk_cmd_tbl[$1].cmd
    =end
        if val =~ /rb_out\S*(?:\s+(::\S*|[{](::.*)[}]|["](::.*)["]))? (c(_\d+_)?(\d+))/
          return TkCore::INTERP.tk_cmd_tbl[$4].cmd
        else
          #nil
          val
        end
      end

simplelist(val, src_enc=true, dst_enc=true) click to toggle source

    # File lib/tk.rb, line 602
    def simplelist(val, src_enc=true, dst_enc=true)
      tk_split_simplelist(val, src_enc, dst_enc)
    end

slice_ary(ary, size) { |sub_ary| ... } click to toggle source

    # File lib/tk.rb, line 643
    def slice_ary(ary, size)
      sliced = []
      wk_ary = ary.dup
      until wk_ary.size.zero?
        sub_ary = []
        size.times{ sub_ary << wk_ary.shift }
        yield(sub_ary) if block_given?
        sliced << sub_ary
      end
      (block_given?)? ary: sliced
    end

string(p1) click to toggle source

    static VALUE
    tcl2rb_string(self, value)
        VALUE self;
        VALUE value;
    {
        rb_check_type(value, T_STRING);

        if (RSTRING_PTR(value) == (char*)NULL) return rb_tainted_str_new2("");

        return tkstr_to_str(value);
    }

tk_tcl2ruby(val, enc_mode = false, listobj = true) click to toggle source

    # File lib/tk.rb, line 231
      def tk_tcl2ruby(val, enc_mode = false, listobj = true)
    =begin
        if val =~ /^rb_out\S* (c(_\d+_)?\d+)/
          #return Tk_CMDTBL[$1]
          return TkCore::INTERP.tk_cmd_tbl[$1]
          #cmd_obj = TkCore::INTERP.tk_cmd_tbl[$1]
          #if cmd_obj.kind_of?(Proc) || cmd_obj.kind_of?(Method)
          #  cmd_obj
          #else
          #  cmd_obj.cmd
          #end
        end
    =end
        if val =~ /rb_out\S*(?:\s+(::\S*|[{](::.*)[}]|["](::.*)["]))? (c(_\d+_)?(\d+))/
          return TkCore::INTERP.tk_cmd_tbl[$4]
        end
        #if val.include? ?\s
        #  return val.split.collect{|v| tk_tcl2ruby(v)}
        #end
        case val
        when /\A@font\S+\z/
          TkFont.get_obj(val)
        when /\A-?\d+\z/
          val.to_i
        when /\A\.\S*\z/
          #Tk_WINDOWS[val] ? Tk_WINDOWS[val] : _genobj_for_tkwidget(val)
          TkCore::INTERP.tk_windows[val]?
               TkCore::INTERP.tk_windows[val] : _genobj_for_tkwidget(val)
        when /\Ai(_\d+_)?\d+\z/
          TkImage::Tk_IMGTBL.mutex.synchronize{
            TkImage::Tk_IMGTBL[val]? TkImage::Tk_IMGTBL[val] : val
          }
        when /\A-?\d+\.?\d*(e[-+]?\d+)?\z/
          val.to_f
        when /\\ /
          val.gsub(/\\ /, ' ')
        when /[^\\] /
          if listobj
            #tk_split_escstr(val).collect{|elt|
            #  tk_tcl2ruby(elt, enc_mode, listobj)
            #}
            val = _toUTF8(val) unless enc_mode
            tk_split_escstr(val, false, false).collect{|elt|
              tk_tcl2ruby(elt, true, listobj)
            }
          elsif enc_mode
            _fromUTF8(val)
          else
            val
          end
        else
          if enc_mode
            _fromUTF8(val)
          else
            val
          end
        end
      end

uninstall_cmd(id, local_cmdtbl=nil) click to toggle source

    # File lib/tk.rb, line 869
    def TkComm.uninstall_cmd(id, local_cmdtbl=nil)
      #id = $1 if /rb_out\S* (c(_\d+_)?\d+)/ =~ id
      id = $4 if id =~ /rb_out\S*(?:\s+(::\S*|[{](::.*)[}]|["](::.*)["]))? (c(_\d+_)?(\d+))/

      if local_cmdtbl && local_cmdtbl.kind_of?(Array)
        begin
          local_cmdtbl.delete(id)
        rescue Exception
          # ignore
        end
      end
      @cmdtbl.delete(id)

      #Tk_CMDTBL.delete(id)
      TkCore::INTERP.tk_cmd_tbl.delete(id)
    end

window(val) click to toggle source

    # File lib/tk.rb, line 605
    def window(val)
      if val =~ /^\./
        #Tk_WINDOWS[val]? Tk_WINDOWS[val] : _genobj_for_tkwidget(val)
        TkCore::INTERP.tk_windows[val]?
             TkCore::INTERP.tk_windows[val] : _genobj_for_tkwidget(val)
      else
        nil
      end
    end

### Private Class Methods

tk_split_escstr(str, src_enc=true, dst_enc=true) click to toggle source

use Tcl function version of split_list

    # File lib/tk.rb, line 303
    def tk_split_escstr(str, src_enc=true, dst_enc=true)
      str = _toUTF8(str) if src_enc
      if dst_enc
        TkCore::INTERP._split_tklist(str).map!{|s| _fromUTF8(s)}
      else
        TkCore::INTERP._split_tklist(str)
      end
    end

tk_split_list(str, depth=0, src_enc=true, dst_enc=true) click to toggle source

    # File lib/tk.rb, line 332
    def tk_split_list(str, depth=0, src_enc=true, dst_enc=true)
      return [] if str == ""
      str = _toUTF8(str) if src_enc
      TkCore::INTERP._split_tklist(str).map!{|token|
        tk_split_sublist(token, depth - 1, false, dst_enc)
      }
    end

tk_split_simplelist(str, src_enc=true, dst_enc=true) click to toggle source

    # File lib/tk.rb, line 340
    def tk_split_simplelist(str, src_enc=true, dst_enc=true)
      #lst = TkCore::INTERP._split_tklist(str)
      #if (lst.size == 1 && lst =~ /^\{.*\}$/)
      #  TkCore::INTERP._split_tklist(str[1..-2])
      #else
      #  lst
      #end

      str = _toUTF8(str) if src_enc
      if dst_enc
        TkCore::INTERP._split_tklist(str).map!{|s| _fromUTF8(s)}
      else
        TkCore::INTERP._split_tklist(str)
      end
    end

tk_split_sublist(str, depth=-1, src_enc=true, dst_enc=true) click to toggle source

    # File lib/tk.rb, line 312
    def tk_split_sublist(str, depth=-1, src_enc=true, dst_enc=true)
      # return [] if str == ""
      # list = TkCore::INTERP._split_tklist(str)
      str = _toUTF8(str) if src_enc

      if depth == 0
        return "" if str == ""
        list = [str]
      else
        return [] if str == ""
        list = TkCore::INTERP._split_tklist(str)
      end
      if list.size == 1
        # tk_tcl2ruby(list[0], nil, false)
        tk_tcl2ruby(list[0], dst_enc, false)
      else
        list.collect{|token| tk_split_sublist(token, depth - 1, false, dst_enc)}
      end
    end

### Public Instance Methods

bind(tagOrClass, context, *args) click to toggle source

def bind(tagOrClass, context, cmd=Proc.new, *args)

    _bind(["bind", tagOrClass], context, cmd, *args)
    tagOrClass

end

    # File lib/tk.rb, line 1077
    def bind(tagOrClass, context, *args)
      # if args[0].kind_of?(Proc) || args[0].kind_of?(Method)
      if TkComm._callback_entry?(args[0]) || !block_given?
        cmd = args.shift
      else
        cmd = Proc.new
      end
      _bind(["bind", tagOrClass], context, cmd, *args)
      tagOrClass
    end

bind_all(context, *args) click to toggle source

def #bind_all(context, cmd=Proc.new, *args)

    _bind(['bind', 'all'], context, cmd, *args)
    TkBindTag::ALL

end

    # File lib/tk.rb, line 1116
    def bind_all(context, *args)
      # if args[0].kind_of?(Proc) || args[0].kind_of?(Method)
      if TkComm._callback_entry?(args[0]) || !block_given?
        cmd = args.shift
      else
        cmd = Proc.new
      end
      _bind(['bind', 'all'], context, cmd, *args)
      TkBindTag::ALL
    end

bind_append(tagOrClass, context, *args) click to toggle source

def #bind_append(tagOrClass, context, cmd=Proc.new, *args)

    _bind_append(["bind", tagOrClass], context, cmd, *args)
    tagOrClass

end

    # File lib/tk.rb, line 1092
    def bind_append(tagOrClass, context, *args)
      # if args[0].kind_of?(Proc) || args[0].kind_of?(Method)
      if TkComm._callback_entry?(args[0]) || !block_given?
        cmd = args.shift
      else
        cmd = Proc.new
      end
      _bind_append(["bind", tagOrClass], context, cmd, *args)
      tagOrClass
    end

bind_append_all(context, *args) click to toggle source

def #bind_append_all(context, cmd=Proc.new, *args)

    _bind_append(['bind', 'all'], context, cmd, *args)
    TkBindTag::ALL

end

    # File lib/tk.rb, line 1131
    def bind_append_all(context, *args)
      # if args[0].kind_of?(Proc) || args[0].kind_of?(Method)
      if TkComm._callback_entry?(args[0]) || !block_given?
        cmd = args.shift
      else
        cmd = Proc.new
      end
      _bind_append(['bind', 'all'], context, cmd, *args)
      TkBindTag::ALL
    end

bind_remove(tagOrClass, context) click to toggle source

    # File lib/tk.rb, line 1103
    def bind_remove(tagOrClass, context)
      _bind_remove(['bind', tagOrClass], context)
      tagOrClass
    end

bind_remove_all(context) click to toggle source

    # File lib/tk.rb, line 1142
    def bind_remove_all(context)
      _bind_remove(['bind', 'all'], context)
      TkBindTag::ALL
    end

bindinfo(tagOrClass, context=nil) click to toggle source

    # File lib/tk.rb, line 1108
    def bindinfo(tagOrClass, context=nil)
      _bindinfo(['bind', tagOrClass], context)
    end

bindinfo_all(context=nil) click to toggle source

    # File lib/tk.rb, line 1147
    def bindinfo_all(context=nil)
      _bindinfo(['bind', 'all'], context)
    end

install_cmd(cmd) click to toggle source

private :install_cmd, :uninstall_cmd module_function :install_cmd, :uninstall_cmd

    # File lib/tk.rb, line 887
    def install_cmd(cmd)
      TkComm.install_cmd(cmd, @cmdtbl)
    end

mutex() click to toggle source

    # File lib/tk.rb, line 62
    def mutex; @mutex; end

subst(str, *opts) click to toggle source

    # File lib/tk.rb, line 666
    def subst(str, *opts)
      # opts := :nobackslashes | :nocommands | novariables
      tk_call('subst',
              *(opts.collect{|opt|
                  opt = opt.to_s
                  (opt[0] == ?-)? opt: '-' << opt
                } << str))
    end

uninstall_cmd(id) click to toggle source

    # File lib/tk.rb, line 890
    def uninstall_cmd(id)
      TkComm.uninstall_cmd(id, @cmdtbl)
    end

### Private Instance Methods

_at(x,y=nil) click to toggle source

    # File lib/tk.rb, line 222
    def _at(x,y=nil)
      if y
        "@#{Integer(x)},#{Integer(y)}"
      else
        "@#{Integer(x)}"
      end
    end

_bind(what, context, cmd, *args) click to toggle source

    # File lib/tk.rb, line 992
    def _bind(what, context, cmd, *args)
      _bind_core('', what, context, cmd, *args)
    end

_bind_append(what, context, cmd, *args) click to toggle source

    # File lib/tk.rb, line 996
    def _bind_append(what, context, cmd, *args)
      _bind_core('+', what, context, cmd, *args)
    end

_bind_append_for_event_class(klass, what, context, cmd, *args) click to toggle source

    # File lib/tk.rb, line 1055
    def _bind_append_for_event_class(klass, what, context, cmd, *args)
      _bind_core_for_event_class(klass, '+', what, context, cmd, *args)
    end

_bind_core(mode, what, context, cmd, *args) click to toggle source

    # File lib/tk.rb, line 981
    def _bind_core(mode, what, context, cmd, *args)
      id = install_bind(cmd, *args) if cmd
      begin
        tk_call_without_enc(*(what + ["<#{tk_event_sequence(context)}>",
                                mode + id]))
      rescue
        uninstall_cmd(id) if cmd
        fail
      end
    end

_bind_core_for_event_class(klass, mode, what, context, cmd, *args) click to toggle source

    # File lib/tk.rb, line 1040
    def _bind_core_for_event_class(klass, mode, what, context, cmd, *args)
      id = install_bind_for_event_class(klass, cmd, *args) if cmd
      begin
        tk_call_without_enc(*(what + ["<#{tk_event_sequence(context)}>",
                                mode + id]))
      rescue
        uninstall_cmd(id) if cmd
        fail
      end
    end

_bind_for_event_class(klass, what, context, cmd, *args) click to toggle source

    # File lib/tk.rb, line 1051
    def _bind_for_event_class(klass, what, context, cmd, *args)
      _bind_core_for_event_class(klass, '', what, context, cmd, *args)
    end

_bind_remove(what, context) click to toggle source

    # File lib/tk.rb, line 1000
    def _bind_remove(what, context)
      tk_call_without_enc(*(what + ["<#{tk_event_sequence(context)}>", '']))
    end

_bind_remove_for_event_class(klass, what, context) click to toggle source

    # File lib/tk.rb, line 1059
    def _bind_remove_for_event_class(klass, what, context)
      _bind_remove(what, context)
    end

_bindinfo(what, context=nil) click to toggle source

    # File lib/tk.rb, line 1004
      def _bindinfo(what, context=nil)
        if context
          if TkCore::WITH_RUBY_VM  ### Ruby 1.9 !!!!
            enum_obj = tk_call_without_enc(*what+["<#{tk_event_sequence(context)}>"]).each_line
          else
            enum_obj = tk_call_without_enc(*what+["<#{tk_event_sequence(context)}>"])
          end
          enum_obj.collect {|cmdline|
    =begin
            if cmdline =~ /^rb_out\S* (c(?:_\d+_)?\d+)\s+(.*)$/
              #[Tk_CMDTBL[$1], $2]
              [TkCore::INTERP.tk_cmd_tbl[$1], $2]
    =end
            if cmdline =~ /rb_out\S*(?:\s+(::\S*|[{](::.*)[}]|["](::.*)["]))? (c(_\d+_)?(\d+))/
              [TkCore::INTERP.tk_cmd_tbl[$4], $5]
            else
              cmdline
            end
          }
        else
          tk_split_simplelist(tk_call_without_enc(*what)).collect!{|seq|
            l = seq.scan(/<*[^<>]+>*/).collect!{|subseq|
              case (subseq)
              when /^<<[^<>]+>>$/
                TkVirtualEvent.getobj(subseq[1..-2])
              when /^<[^<>]+>$/
                subseq[1..-2]
              else
                subseq.split('')
              end
            }.flatten
            (l.size == 1) ? l[0] : l
          }
        end
      end

_bindinfo_for_event_class(klass, what, context=nil) click to toggle source

    # File lib/tk.rb, line 1063
    def _bindinfo_for_event_class(klass, what, context=nil)
      _bindinfo(what, context)
    end

_callback_entry?(obj) click to toggle source

    # File lib/tk.rb, line 690
    def _callback_entry?(obj)
      obj.kind_of?(Proc) || obj.kind_of?(Method) || obj.kind_of?(TkCallbackEntry)
    end

_callback_entry_class?(cls) click to toggle source

    # File lib/tk.rb, line 684
    def _callback_entry_class?(cls)
      cls <= Proc || cls <= Method || cls <= TkCallbackEntry
    end

_curr_cmd_id() click to toggle source

# begin¶ ↑

    ### --> definition is moved to TkUtil module
    def _conv_args(args, enc_mode, *src_args)
      conv_args = []
      src_args.each{|arg|
        conv_args << _get_eval_string(arg, enc_mode) unless arg == None
        # if arg.kind_of?(Hash)
        # arg.each{|k, v|
        #   args << '-' + k.to_s
        #   args << _get_eval_string(v, enc_mode)
        # }
        # elsif arg != None
        #   args << _get_eval_string(arg, enc_mode)
        # end
      }
      args + conv_args
    end
    private :_conv_args

# end¶ ↑

    # File lib/tk.rb, line 819
    def _curr_cmd_id
      #id = format("c%.4d", Tk_IDs[0])
      id = "c" + TkCore::INTERP._ip_id_ + TkComm::Tk_IDs[0]
    end

_epath(win) click to toggle source

    # File lib/tk.rb, line 944
    def _epath(win)
      if win.kind_of?(TkObject)
        win.epath
      elsif win.respond_to?(:epath)
        win.epath
      else
        win
      end
    end

_fromUTF8(str, encoding = nil) click to toggle source

    # File lib/tk.rb, line 678
    def _fromUTF8(str, encoding = nil)
      TkCore::INTERP._fromUTF8(str, encoding)
    end

_genobj_for_tkwidget(path) click to toggle source

    # File lib/tk.rb, line 106
      def _genobj_for_tkwidget(path)
        return TkRoot.new if path == '.'

        begin
          #tk_class = TkCore::INTERP._invoke('winfo', 'class', path)
          tk_class = Tk.ip_invoke_without_enc('winfo', 'class', path)
        rescue
          return path
        end

        if ruby_class = WidgetClassNames[tk_class]
          ruby_class_name = ruby_class.name
          # gen_class_name = ruby_class_name + 'GeneratedOnTk'
          gen_class_name = ruby_class_name
          classname_def = ''
        else # ruby_class == nil
          if Tk.const_defined?(tk_class)
            Tk.const_get(tk_class)  # auto_load
            ruby_class = WidgetClassNames[tk_class]
          end

          unless ruby_class
            mods = TkExtlibAutoloadModule.find_all{|m| m.const_defined?(tk_class)}
            mods.each{|mod|
              begin
                mod.const_get(tk_class)  # auto_load
                break if (ruby_class = WidgetClassNames[tk_class])
              rescue LoadError
                # ignore load error
              end
            }
          end

          unless ruby_class
            std_class = 'Tk' << tk_class
            if Object.const_defined?(std_class)
              Object.const_get(std_class)  # auto_load
              ruby_class = WidgetClassNames[tk_class]
            end
          end

          unless ruby_class
            if Tk.const_defined?('TOPLEVEL_ALIASES') &&
                Tk::TOPLEVEL_ALIASES.const_defined?(std_class)
              Tk::TOPLEVEL_ALIASES.const_get(std_class)  # auto_load
              ruby_class = WidgetClassNames[tk_class]
            end
          end

          if ruby_class
            # found
            ruby_class_name = ruby_class.name
            gen_class_name = ruby_class_name
            classname_def = ''
          else
            # unknown
            ruby_class_name = 'TkWindow'
            gen_class_name = 'TkWidget_' + tk_class
            classname_def = "WidgetClassName = '#{tk_class}'.freeze"
          end
        end

    ###################################
    =begin
        if ruby_class = WidgetClassNames[tk_class]
          ruby_class_name = ruby_class.name
          # gen_class_name = ruby_class_name + 'GeneratedOnTk'
          gen_class_name = ruby_class_name
          classname_def = ''
        else
          mod = TkExtlibAutoloadModule.find{|m| m.const_defined?(tk_class)}
          if mod
            ruby_class_name = mod.name + '::' + tk_class
            gen_class_name = ruby_class_name
            classname_def = ''
          elsif Object.const_defined?('Tk' + tk_class)
            ruby_class_name = 'Tk' + tk_class
            # gen_class_name = ruby_class_name + 'GeneratedOnTk'
            gen_class_name = ruby_class_name
            classname_def = ''
          else
            ruby_class_name = 'TkWindow'
            # gen_class_name = ruby_class_name + tk_class + 'GeneratedOnTk'
            gen_class_name = 'TkWidget_' + tk_class
            classname_def = "WidgetClassName = '#{tk_class}'.freeze"
          end
        end
    =end

    =begin
        unless Object.const_defined? gen_class_name
          Object.class_eval "class #{gen_class_name}<#{ruby_class_name}
                               #{classname_def}
                             end"
        end
        Object.class_eval "#{gen_class_name}.new('widgetname'=>'#{path}',
                                                 'without_creating'=>true)"
    =end
        base = Object
        gen_class_name.split('::').each{|klass|
          next if klass == ''
          if base.const_defined?(klass)
            base = base.class_eval klass
          else
            base = base.class_eval "class #{klass}<#{ruby_class_name}
                                      #{classname_def}
                                    end
                                    #{klass}"
          end
        }
        base.class_eval "#{gen_class_name}.new('widgetname'=>'#{path}',
                                               'without_creating'=>true)"
      end

_next_cmd_id() click to toggle source

    # File lib/tk.rb, line 823
    def _next_cmd_id
      TkComm::Tk_IDs.mutex.synchronize{
        id = _curr_cmd_id
        #Tk_IDs[0] += 1
        TkComm::Tk_IDs[0].succ!
        id
      }
    end

_toUTF8(str, encoding = nil) click to toggle source

    # File lib/tk.rb, line 675
    def _toUTF8(str, encoding = nil)
      TkCore::INTERP._toUTF8(str, encoding)
    end

array2tk_list(ary, enc=nil) click to toggle source

    # File lib/tk.rb, line 356
    def array2tk_list(ary, enc=nil)
      return "" if ary.size == 0

      sys_enc = TkCore::INTERP.encoding
      sys_enc = TclTkLib.encoding_system unless sys_enc

      dst_enc = (enc == nil)? sys_enc: enc

      dst = ary.collect{|e|
        if e.kind_of? Array
          s = array2tk_list(e, enc)
        elsif e.kind_of? Hash
          tmp_ary = []
          #e.each{|k,v| tmp_ary << k << v }
          e.each{|k,v| tmp_ary << "-#{_get_eval_string(k)}" << v }
          s = array2tk_list(tmp_ary, enc)
        else
          s = _get_eval_string(e, enc)
        end

        if dst_enc != true && dst_enc != false
          if (s_enc = s.instance_variable_get(:@encoding))
            s_enc = s_enc.to_s
          elsif TkCore::WITH_ENCODING
            s_enc = s.encoding.name
          else
            s_enc = sys_enc
          end
          dst_enc = true if s_enc != dst_enc
        end

        s
      }

      if sys_enc && dst_enc
        dst.map!{|s| _toUTF8(s)}
        ret = TkCore::INTERP._merge_tklist(*dst)
        if TkCore::WITH_ENCODING
          if dst_enc.kind_of?(String)
            ret = _fromUTF8(ret, dst_enc)
            ret.force_encoding(dst_enc)
          else
            ret.force_encoding('utf-8')
          end
        else # without encoding
          if dst_enc.kind_of?(String)
            ret = _fromUTF8(ret, dst_enc)
            ret.instance_variable_set(:@encoding, dst_enc)
          else
            ret.instance_variable_set(:@encoding, 'utf-8')
          end
        end
        ret
      else
        TkCore::INTERP._merge_tklist(*dst)
      end
    end

error_at() click to toggle source

    *** ATTENTION ***

'current_configinfo' method always returns a Hash under all cases of above.

    # File lib/tk.rb, line 97
    def error_at
      frames = caller()
      frames.delete_if do |c|
        c =~ %r!/tk(|core|thcore|canvas|text|entry|scrollbox)\.rb:\d+!
      end
      frames
    end

image_obj(val) click to toggle source

    # File lib/tk.rb, line 614
    def image_obj(val)
      if val =~ /^i(_\d+_)?\d+$/
        TkImage::Tk_IMGTBL.mutex.synchronize{
          TkImage::Tk_IMGTBL[val]? TkImage::Tk_IMGTBL[val] : val
        }
      else
        val
      end
    end

install_win(ppath,name=nil) click to toggle source

# begin¶ ↑

    def install_win(ppath,name=nil)
      if !name or name == ''
        #name = format("w%.4d", Tk_IDs[1])
        #Tk_IDs[1] += 1
        name = "w" + Tk_IDs[1]
        Tk_IDs[1].succ!
      end
      if name[0] == ?.
        @path = name.dup
      elsif !ppath or ppath == "."
        @path = Kernel.format(".%s", name);
      else
        @path = Kernel.format("%s.%s", ppath, name)
      end
      #Tk_WINDOWS[@path] = self
      TkCore::INTERP.tk_windows[@path] = self
    end

# end¶ ↑

    # File lib/tk.rb, line 913
    def install_win(ppath,name=nil)
      if name
        if name == ''
          raise ArgumentError, "invalid widget-name '#{name}'"
        end
        if name[0] == ?.
          @path = '' + name
          @path.freeze
          return TkCore::INTERP.tk_windows[@path] = self
        end
      else
        Tk_IDs.mutex.synchronize{
          name = "w" + TkCore::INTERP._ip_id_ + Tk_IDs[1]
          Tk_IDs[1].succ!
        }
      end
      if !ppath or ppath == '.'
        @path = '.' + name
      else
        @path = ppath + '.' + name
      end
      @path.freeze
      TkCore::INTERP.tk_windows[@path] = self
    end

list(val, depth=0, enc=true) click to toggle source

# begin¶ ↑

    ### --> definition is moved to TkUtil module
    def bool(val)
      case val
      when "1", 1, 'yes', 'true'
        true
      else
        false
      end
    end

    def number(val)
      case val
      when /^-?\d+$/
        val.to_i
      when /^-?\d+\.?\d*(e[-+]?\d+)?$/
        val.to_f
      else
        fail(ArgumentError, "invalid value for Number:'#{val}'")
      end
    end
    def string(val)
      if val == "{}"
        ''
      elsif val[0] == ?{ && val[-1] == ?}
        val[1..-2]
      else
        val
      end
    end
    def num_or_str(val)
      begin
        number(val)
      rescue ArgumentError
        string(val)
      end
    end

# end¶ ↑

    # File lib/tk.rb, line 599
    def list(val, depth=0, enc=true)
      tk_split_list(val, depth, enc, enc)
    end

procedure(val) click to toggle source

    # File lib/tk.rb, line 623
      def procedure(val)
    =begin
        if val =~ /^rb_out\S* (c(_\d+_)?\d+)/
          #Tk_CMDTBL[$1]
          #TkCore::INTERP.tk_cmd_tbl[$1]
          TkCore::INTERP.tk_cmd_tbl[$1].cmd
    =end
        if val =~ /rb_out\S*(?:\s+(::\S*|[{](::.*)[}]|["](::.*)["]))? (c(_\d+_)?(\d+))/
          return TkCore::INTERP.tk_cmd_tbl[$4].cmd
        else
          #nil
          val
        end
      end

simplelist(val, src_enc=true, dst_enc=true) click to toggle source

    # File lib/tk.rb, line 602
    def simplelist(val, src_enc=true, dst_enc=true)
      tk_split_simplelist(val, src_enc, dst_enc)
    end

slice_ary(ary, size) { |sub_ary| ... } click to toggle source

    # File lib/tk.rb, line 643
    def slice_ary(ary, size)
      sliced = []
      wk_ary = ary.dup
      until wk_ary.size.zero?
        sub_ary = []
        size.times{ sub_ary << wk_ary.shift }
        yield(sub_ary) if block_given?
        sliced << sub_ary
      end
      (block_given?)? ary: sliced
    end

tk_event_sequence(context) click to toggle source

    # File lib/tk.rb, line 961
    def tk_event_sequence(context)
      if context.kind_of? TkVirtualEvent
        context = context.path
      end
      if context.kind_of? Array
        context = context.collect{|ev|
          if ev.kind_of? TkVirtualEvent
            ev.path
          else
            ev
          end
        }.join("><")
      end
      if /,/ =~ context
        context = context.split(/\s*,\s*/).join("><")
      else
        context
      end
    end

tk_split_escstr(str, src_enc=true, dst_enc=true) click to toggle source

use Tcl function version of split_list

    # File lib/tk.rb, line 303
    def tk_split_escstr(str, src_enc=true, dst_enc=true)
      str = _toUTF8(str) if src_enc
      if dst_enc
        TkCore::INTERP._split_tklist(str).map!{|s| _fromUTF8(s)}
      else
        TkCore::INTERP._split_tklist(str)
      end
    end

tk_split_list(str, depth=0, src_enc=true, dst_enc=true) click to toggle source

    # File lib/tk.rb, line 332
    def tk_split_list(str, depth=0, src_enc=true, dst_enc=true)
      return [] if str == ""
      str = _toUTF8(str) if src_enc
      TkCore::INTERP._split_tklist(str).map!{|token|
        tk_split_sublist(token, depth - 1, false, dst_enc)
      }
    end

tk_split_simplelist(str, src_enc=true, dst_enc=true) click to toggle source

    # File lib/tk.rb, line 340
    def tk_split_simplelist(str, src_enc=true, dst_enc=true)
      #lst = TkCore::INTERP._split_tklist(str)
      #if (lst.size == 1 && lst =~ /^\{.*\}$/)
      #  TkCore::INTERP._split_tklist(str[1..-2])
      #else
      #  lst
      #end

      str = _toUTF8(str) if src_enc
      if dst_enc
        TkCore::INTERP._split_tklist(str).map!{|s| _fromUTF8(s)}
      else
        TkCore::INTERP._split_tklist(str)
      end
    end

tk_split_sublist(str, depth=-1, src_enc=true, dst_enc=true) click to toggle source

    # File lib/tk.rb, line 312
    def tk_split_sublist(str, depth=-1, src_enc=true, dst_enc=true)
      # return [] if str == ""
      # list = TkCore::INTERP._split_tklist(str)
      str = _toUTF8(str) if src_enc

      if depth == 0
        return "" if str == ""
        list = [str]
      else
        return [] if str == ""
        list = TkCore::INTERP._split_tklist(str)
      end
      if list.size == 1
        # tk_tcl2ruby(list[0], nil, false)
        tk_tcl2ruby(list[0], dst_enc, false)
      else
        list.collect{|token| tk_split_sublist(token, depth - 1, false, dst_enc)}
      end
    end

tk_tcl2ruby(val, enc_mode = false, listobj = true) click to toggle source

    # File lib/tk.rb, line 231
      def tk_tcl2ruby(val, enc_mode = false, listobj = true)
    =begin
        if val =~ /^rb_out\S* (c(_\d+_)?\d+)/
          #return Tk_CMDTBL[$1]
          return TkCore::INTERP.tk_cmd_tbl[$1]
          #cmd_obj = TkCore::INTERP.tk_cmd_tbl[$1]
          #if cmd_obj.kind_of?(Proc) || cmd_obj.kind_of?(Method)
          #  cmd_obj
          #else
          #  cmd_obj.cmd
          #end
        end
    =end
        if val =~ /rb_out\S*(?:\s+(::\S*|[{](::.*)[}]|["](::.*)["]))? (c(_\d+_)?(\d+))/
          return TkCore::INTERP.tk_cmd_tbl[$4]
        end
        #if val.include? ?\s
        #  return val.split.collect{|v| tk_tcl2ruby(v)}
        #end
        case val
        when /\A@font\S+\z/
          TkFont.get_obj(val)
        when /\A-?\d+\z/
          val.to_i
        when /\A\.\S*\z/
          #Tk_WINDOWS[val] ? Tk_WINDOWS[val] : _genobj_for_tkwidget(val)
          TkCore::INTERP.tk_windows[val]?
               TkCore::INTERP.tk_windows[val] : _genobj_for_tkwidget(val)
        when /\Ai(_\d+_)?\d+\z/
          TkImage::Tk_IMGTBL.mutex.synchronize{
            TkImage::Tk_IMGTBL[val]? TkImage::Tk_IMGTBL[val] : val
          }
        when /\A-?\d+\.?\d*(e[-+]?\d+)?\z/
          val.to_f
        when /\\ /
          val.gsub(/\\ /, ' ')
        when /[^\\] /
          if listobj
            #tk_split_escstr(val).collect{|elt|
            #  tk_tcl2ruby(elt, enc_mode, listobj)
            #}
            val = _toUTF8(val) unless enc_mode
            tk_split_escstr(val, false, false).collect{|elt|
              tk_tcl2ruby(elt, true, listobj)
            }
          elsif enc_mode
            _fromUTF8(val)
          else
            val
          end
        else
          if enc_mode
            _fromUTF8(val)
          else
            val
          end
        end
      end

uninstall_win() click to toggle source

    # File lib/tk.rb, line 938
    def uninstall_win()
      #Tk_WINDOWS.delete(@path)
      TkCore::INTERP.tk_windows.delete(@path)
    end

window(val) click to toggle source

    # File lib/tk.rb, line 605
    def window(val)
      if val =~ /^\./
        #Tk_WINDOWS[val]? Tk_WINDOWS[val] : _genobj_for_tkwidget(val)
        TkCore::INTERP.tk_windows[val]?
             TkCore::INTERP.tk_windows[val] : _genobj_for_tkwidget(val)
      else
        nil
      end
    end