module Keyboard

Public Instance Methods

read() click to toggle source
# File lib/keyboard.rb, line 4
def read
  chr = ""

  with_stty "raw -echo" do
    chr << STDIN.getc.chr

    chr = extra_thread_trick(chr) if chr == "\e"
  end

  symbolize(chr)
end
wait_for_return() click to toggle source
# File lib/keyboard.rb, line 16
def wait_for_return
  loop do
    result = read

    return result if result == :return
  end
end

Private Instance Methods

extra_thread_trick(chr) click to toggle source
# File lib/keyboard.rb, line 26
def extra_thread_trick(chr)
  extra_thread = Thread.new {
    chr = chr + STDIN.getc.chr
    chr = chr + STDIN.getc.chr
  }

  extra_thread.join 0.00001
  extra_thread.kill

  chr
end
symbolize(character) click to toggle source
# File lib/keyboard.rb, line 49
def symbolize(character)
  case character
  when " "
    :space
  when "\t"
    :tab
  when "\r", "\n"
    :return
  when "\e"
    :escape
  when "\e[A"
    :up
  when "\e[B"
    :down
  when "\e[D"
    :left
  when "\e[C"
    :right
  when "\177"
    :backspace
  when "\004"
    :delete
  else
    character
  end
end
with_stty(options) { || ... } click to toggle source
# File lib/keyboard.rb, line 38
def with_stty(options, &block)
  begin
    old_stty = `stty -g`
    system "stty #{options}"

    yield
  ensure
    system "stty #{old_stty}"
  end
end