# File lib/sup/textfield.rb, line 60
  def handle_input c
    ## short-circuit exit paths
    case c
    when Ncurses::KEY_ENTER # submit!
      @value = get_cursed_value
      @history.push @value unless @value =~ /^\s*$/
      return false
    when Ncurses::KEY_CANCEL # cancel
      @value = nil
      return false
    when Ncurses::KEY_TAB # completion
      return true unless @completion_block
      if @completions.empty?
        v = get_cursed_value
        c = @completion_block.call v
        if c.size > 0
          @value = c.map { |full, short| full }.shared_prefix(true)
          set_cursed_value @value
          position_cursor
        end
        if c.size > 1
          @completions = c
          @new_completions = true
          @roll_completions = false
        end
      else
        @new_completions = false
        @roll_completions = true
      end
      return true
    end

    reset_completion_state
    @value = nil

    d =
      case c
      when Ncurses::KEY_LEFT
        Ncurses::Form::REQ_PREV_CHAR
      when Ncurses::KEY_RIGHT
        Ncurses::Form::REQ_NEXT_CHAR
      when Ncurses::KEY_DC
        Ncurses::Form::REQ_DEL_CHAR
      when Ncurses::KEY_BACKSPACE, 127 # 127 is also a backspace keysym
        Ncurses::Form::REQ_DEL_PREV
      when ?\C-a
        nop
        Ncurses::Form::REQ_BEG_FIELD
      when ?\C-e
        Ncurses::Form::REQ_END_FIELD
      when ?\C-k
        Ncurses::Form::REQ_CLR_EOF
      when ?\C-u
        set_cursed_value cursed_value_after_point
        Ncurses::Form.form_driver @form, Ncurses::Form::REQ_END_FIELD
        nop
        Ncurses::Form::REQ_BEG_FIELD
      when ?\C-w
        Ncurses::Form.form_driver @form, Ncurses::Form::REQ_PREV_CHAR
        Ncurses::Form.form_driver @form, Ncurses::Form::REQ_DEL_WORD
      when Ncurses::KEY_UP, Ncurses::KEY_DOWN
        unless @history.empty?
          value = get_cursed_value
          @i ||= @history.size
          #debug "history before #{@history.inspect}"
          @history[@i] = value #unless value =~ /^\s*$/
          @i = (@i + (c == Ncurses::KEY_UP ? -1 : 1)) % @history.size
          @value = @history[@i]
          #debug "history after #{@history.inspect}"
          set_cursed_value @value
          Ncurses::Form::REQ_END_FIELD
        end
      else
        c
      end

    Ncurses::Form.form_driver @form, d if d
    true
  end