blob: 90a9286d0c5aba6401de30bdaad5fe868c430271 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
|
use fmt;
use io;
use unix::tty;
use errors;
use encoding::utf8;
use bufio;
export type tui = struct {
out: io::file,
clear: bool,
tq: tty::termios,
};
export type skey = enum {
BS,
};
export type key = (skey | rune);
export fn init() (tui | tty::error | errors::error) = {
const f = tty::open()?;
const tq = tty::termios_query(f)?;
tty::makeraw(&tq)?;
//tty::noncanonical(&tq)?;
doclear(f);
return tui {
out = f,
clear = false,
tq = tq,
};
};
export fn read(state: *tui) (key | utf8::invalid | io::error | io::EOF) = {
match (bufio::read_rune(state.out)?) {
case let r: rune =>
return r;
case io::EOF =>
return io::EOF;
};
};
fn doclear(out: io::file) void = {
fmt::fprint(out, "\x1B[2J\x1B[1;1H")!;
};
export fn clear(state: *tui) void = {
state.clear = true;
//fmt::fprint(out, "\x1B[2J\x1B[1;1H")!;
};
export fn finish(state: *tui) void = {
tty::termios_restore(&state.tq);
io::close(state.out)!;
};
export fn unraw(state: *tui) void = {
tty::termios_restore(&state.tq);
};
export fn raw(state: *tui) (void | errors::error) = {
const tq = tty::termios_query(state.out)?;
tty::makeraw(&tq)?;
};
|