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
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
|
use libui;
use libui::widget;
use libui::widget::list;
use libui::layout;
use encoding::utf8;
use io;
use fmt;
use os;
use strings;
use unix::tty;
use unix::signal;
let u: mainUI = mainUI {...};
let searchterm: str = "";
let searchforward: bool = true;
type mainUI = struct {
list: *list::listwidget,
};
fn sighandler(sig: int, info: *signal::siginfo, ucontext: *void) void = {
switch (sig) {
case signal::SIGWINCH =>
let sz = libui::getwinsize(u.list.ui)!;
let rows: (u16 | size) = if (sz.rows - 2 < len(u.list.items)) {
yield sz.rows - 2;
} else {
yield len(u.list.items);
};
u.list.sz.rows = rows: u16;
u.list.sz.cols = sz.columns;
};
};
export fn main() void = {
let in = match (io::drain(os::stdin)) {
case let in: []u8 =>
yield in;
case let e: io::error =>
fmt::fatal(io::strerror(e));
};
defer free(in);
let sin = strings::fromutf8(in);
sin = strings::trim(sin, '\n');
let items = strings::split(sin, "\n"); // freed by list::finish
itemscopy = strings::dupall(items);
defer strings::freeall(itemscopy);
let ui = libui::init();
defer libui::finish(&ui);
let l = list::newlist(ui, items...);
libui::addlistener(&ui, &globalrunehandler);
widget::addlistener(&l, &runehandler);
let layout = layout::newlayout(&l);
defer layout::finishall(&layout);
//defer free(searchterm);
libui::clear(l.ui);
match (layout::print(layout)) {
case void =>
yield;
case let e: io::error =>
fmt::fprintln(os::stderr, io::strerror(e))!;
return;
case let e: tty::error =>
fmt::fprintln(os::stderr, tty::strerror(e))!;
return;
};
//match (list::print(&l)) {
//case void =>
//yield;
//case let e: io::error =>
//fmt::fprintln(os::stderr, io::strerror(e))!;
//return;
//case let e: tty::error =>
//fmt::fprintln(os::stderr, tty::strerror(e))!;
//return;
//};
u = mainUI {
list = &l,
};
const sigs = signal::handle(signal::SIGWINCH, &sighandler, signal::flag::RESTART);
defer signal::restore(signal::SIGWINCH, &sigs);
for (true) {
let r = match (libui::scan(ui)) {
case let r: rune =>
yield r;
case utf8::invalid =>
fmt::fprintln(os::stderr, "Invalid utf8 sequence")!;
break;
case io::EOF =>
fmt::fprintln(os::stderr, "EOF")!;
break;
case let e: io::error =>
fmt::fprintln(os::stderr, io::strerror(e))!;
break;
};
if (libui::notify(&ui, r)) {
break;
};
if (list::notify(&l, r)) {
break;
};
};
};
@fini fn finish() void = {
free(searchterm);
};
|