def ORIGbind_key keycode, *args, &blk # -- {{{
        #$log.debug " #{@name} bind_key received #{keycode} "
        @_key_map ||= {}
        #
        # added on 2011-12-4 so we can pass a description for a key and print it
        # The first argument may be a string, it will not be removed
        # so existing programs will remain as is.
        @key_label ||= {}
        if args[0].is_a?(String) || args[0].is_a?(Symbol)
          @key_label[keycode] = args[0] 
        else
          @key_label[keycode] = :unknown
        end

        if !block_given?
          blk = args.pop
          raise "If block not passed, last arg should be a method symbol" if !blk.is_a? Symbol
          #$log.debug " #{@name} bind_key received a symbol #{blk} "
        end
        case keycode
        when String
          # single assignment
          keycode = keycode.getbyte(0) #if keycode.class==String ##    1.9 2009-10-05 19:40 
          #$log.debug " #{name} Widg String called bind_key BIND #{keycode}, #{keycode_tos(keycode)}  "
          #$log.debug " assigning #{keycode}  " if $log.debug? 
          @_key_map[keycode] = blk
        when Array
          # double assignment
          # for starters lets try with 2 keys only
          raise "A one key array will not work. Pass without array" if keycode.size == 1
          a0 = keycode[0]
          a0 = keycode[0].getbyte(0) if keycode[0].class == String
          a1 = keycode[1]
          a1 = keycode[1].getbyte(0) if keycode[1].class == String
          @_key_map[a0] ||= OrderedHash.new
          #$log.debug " assigning #{keycode} , A0 #{a0} , A1 #{a1} " if $log.debug? 
          @_key_map[a0][a1] = blk
          #$log.debug " XX assigning #{keycode} to  _key_map " if $log.debug? 
        else
          #$log.debug " assigning #{keycode} to  _key_map " if $log.debug? 
          @_key_map[keycode] = blk
        end
        @_key_args ||= {}
        @_key_args[keycode] = args

      end
def ORIGbind_key keycode, *args, &blk # -- {{{
        #$log.debug " #{@name} bind_key received #{keycode} "
        @_key_map ||= {}
        #
        # added on 2011-12-4 so we can pass a description for a key and print it
        # The first argument may be a string, it will not be removed
        # so existing programs will remain as is.
        @key_label ||= {}
        if args[0].is_a?(String) || args[0].is_a?(Symbol)
          @key_label[keycode] = args[0] 
        else
          @key_label[keycode] = :unknown
        end

        if !block_given?
          blk = args.pop
          raise "If block not passed, last arg should be a method symbol" if !blk.is_a? Symbol
          #$log.debug " #{@name} bind_key received a symbol #{blk} "
        end
        case keycode
        when String
          # single assignment
          keycode = keycode.getbyte(0) #if keycode.class==String ##    1.9 2009-10-05 19:40 
          #$log.debug " #{name} Widg String called bind_key BIND #{keycode}, #{keycode_tos(keycode)}  "
          #$log.debug " assigning #{keycode}  " if $log.debug? 
          @_key_map[keycode] = blk
        when Array
          # double assignment
          # for starters lets try with 2 keys only
          raise "A one key array will not work. Pass without array" if keycode.size == 1
          a0 = keycode[0]
          a0 = keycode[0].getbyte(0) if keycode[0].class == String
          a1 = keycode[1]
          a1 = keycode[1].getbyte(0) if keycode[1].class == String
          @_key_map[a0] ||= OrderedHash.new
          #$log.debug " assigning #{keycode} , A0 #{a0} , A1 #{a1} " if $log.debug? 
          @_key_map[a0][a1] = blk
          #$log.debug " XX assigning #{keycode} to  _key_map " if $log.debug? 
        else
          #$log.debug " assigning #{keycode} to  _key_map " if $log.debug? 
          @_key_map[keycode] = blk
        end
        @_key_args ||= {}
        @_key_args[keycode] = args

      end
this is the bindkey that has been working all along. now i am trying a new approach
 that does not use a hash inside but keeps on key. so it can be manip easily be user