module Curtis::Input

Constants

A_TO_Z
ENTER
ESCAPE
MAX_CHAR

Public Instance Methods

alt_key_code?(sequence) click to toggle source
# File lib/curtis/input.rb, line 101
def alt_key_code?(sequence)
  sequence.size == 2 && sequence.starts_with?('^')
end
get() { |key| ... } click to toggle source
# File lib/curtis/input.rb, line 11
def get
  return translate_key(Ncurses.getch) unless block_given?

  while key = translate_key(Ncurses.getch)
    yield key
  end
end
translate_key(key) click to toggle source

github.com/grosser/dispel/blob/master/lib/dispel/keyboard.rb

# File lib/curtis/input.rb, line 20
def translate_key(key)
  case key
  # Movement
  when Ncurses::KEY_UP      then :up
  when Ncurses::KEY_DOWN    then :down
  when Ncurses::KEY_RIGHT   then :right
  when Ncurses::KEY_LEFT    then :left
  when Ncurses::KEY_END     then :end
  when Ncurses::KEY_HOME    then :home
  when Ncurses::KEY_NPAGE   then :page_down
  when Ncurses::KEY_PPAGE   then :page_up

  # Code, Unix, iTerm
  when 337, '^[1;2A', "^[A" then :shift_up
  when 336, '^[1;2B', "^[B" then :shift_down
  when 402, '^[1;2C'        then :shift_right
  when 393, '^[1;2D'        then :shift_left
  when 558, '^[1;3A'        then :alt_up
  when 517, '^[1;3B'        then :alt_down
  when 552, '^[1;3C'        then :alt_right
  when 537, '^[1;3D'        then :alt_left
  when 560, '^[1;5A'        then :ctrl_up
  when 519, '^[1;5B'        then :ctrl_down
  when 554, '^[1;5C'        then :ctrl_right
  when 539, '^[1;5D'        then :ctrl_left
  when 561, '^[1;6A'        then :ctrl_shift_up
  when 520, '^[1;6B'        then :ctrl_shift_down
  when 555, '^[1;6C', "^[C" then :ctrl_shift_right
  when 540, '^[1;6D', "^[D" then :ctrl_shift_left
  when 562, '^[1;7A'        then :alt_ctrl_up
  when 521, '^[1;7B'        then :alt_ctrl_down
  when 556, '^[1;7C'        then :alt_ctrl_right
  when 541, '^[1;7D'        then :alt_ctrl_left
  when      '^[1;8A'        then :alt_ctrl_shift_up
  when      '^[1;8B'        then :alt_ctrl_shift_down
  when      '^[1;8C'        then :alt_ctrl_shift_right
  when      '^[1;8D'        then :alt_ctrl_shift_left
  when      '^[1;10A'       then :alt_shift_up
  when      '^[1;10B'       then :alt_shift_down
  when      '^[1;10C'       then :alt_shift_right
  when      '^[1;10D'       then :alt_shift_left
  when      '^[F'           then :shift_end
  when      '^[H'           then :shift_home
  when      '^[1;9F'        then :alt_end
  when      '^[1;9H'        then :alt_home
  when      '^[1;10F'       then :alt_shift_end
  when      '^[1;10H'       then :alt_shift_home
  when      '^[1;13F'       then :alt_ctrl_end
  when      '^[1;13H'       then :alt_ctrl_home
  when      '^[1;14F'       then :alt_ctrl_shift_end
  when      '^[1;14H'       then :alt_ctrl_shift_home
  when 527                  then :ctrl_shift_end
  when 532                  then :ctrl_shift_home

  when Ncurses::KEY_IC      then :insert
  when Ncurses::KEY_F0..Ncurses::KEY_F30 then :"f#{key - Ncurses::KEY_F0}"

  # Modify
  when 9        then :tab
  when 353      then :shift_tab
  when ENTER    then :enter # shadows Ctrl_m
  when 263, 127 then :backspace
  when '^[3~', Ncurses::KEY_DC then :delete

  # Misc
  when 0        then :ctrl_space
  when 1..26    then :"ctrl_#{A_TO_Z[key - 1]}"
  when ESCAPE   then :escape
  when Ncurses::KEY_RESIZE then :resize

  else
    if key.is_a? Fixnum
      key > MAX_CHAR ? key : key.chr
    elsif alt_key_code?(key)
      :"alt_#{key[1]}"
    else
      key
    end
  end
end