#!/usr/bin/env ruby
# Emacs: This is -*- ruby -*- code!
#
# Unfinished read_line function
#
# Written 2003, 2004 by Tobias Peters
# No warranties
# Share and enjoy!
require "ncurses"
# read_line returns an array
# [string, last_cursor_position_in_string, keycode_of_terminating_enter_key].
# Complete the "when" clauses before including in your app!
def read_line(y, x,
window = Ncurses.stdscr,
max_len = (window.getmaxx - x - 1),
string = "",
cursor_pos = 0)
loop do
window.mvaddstr(y,x,string)
window.move(y,x+cursor_pos)
ch = window.getch
case ch
when Ncurses::KEY_LEFT
cursor_pos = [0, cursor_pos-1].max
when Ncurses::KEY_RIGHT
# similar, implement yourself !
when Ncurses::KEY_ENTER, ?\n, ?\r
return string, cursor_pos, ch # Which return key has been used?
when Ncurses::KEY_BACKSPACE
string = string[0...([0, cursor_pos-1].max)] + string[cursor_pos..-1]
cursor_pos = [0, cursor_pos-1].max
window.mvaddstr(y, x+string.length, " ")
# when etc...
when " "[0]..255 # remaining printables
if (cursor_pos < max_len)
string[cursor_pos,0] = ch.chr
cursor_pos += 1
else
Ncurses.beep
end
else
Ncurses.beep
end
end
end
if (__FILE__ == $0) then begin
# demo mode
Ncurses.initscr
Ncurses.cbreak
Ncurses.noecho
# recognize KEY_ENTER, KEY_BACKSPACE etc
Ncurses.keypad(Ncurses.stdscr, true)
y = 10
x = 2
prompt = "Hallo > "
Ncurses.mvaddstr(y,x, prompt)
s = read_line(y, x + prompt.length)
ensure
Ncurses.endwin
end end
p s