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
114
|
use libui;
use libui::list;
use encoding::utf8;
use io;
use fmt;
use os;
use strings;
use unix::tty;
type mainUI = struct {
list: list::listwidget,
};
fn globalrunehandler(ui: *libui::ttyui, r: rune) bool = {
if (r == 'q') {
return true;
};
return false;
};
fn runehandler(l: *list::listwidget, r: rune) bool = {
switch (r) {
case 'j' =>
list::down(l);
case 'k' =>
list::up(l);
case 'l' =>
// to print properly suspend the ui, print, then resume
libui::suspend(&l.ui);
fmt::println(l.items[l.cursor])!;
libui::resume(&l.ui);
return true;
case 'g' =>
list::top(l);
//l.cursor = 0;
case 'G' =>
list::bottom(l);
//l.cursor = len(l.items) - 1;
case '/' =>
// TODO add commandline support
fmt::fprintln(os::stderr, "searching")!;
let c = l.cursor;
if (list::search(l, "workspace") != c) {
fmt::fprintln(os::stderr, "changed")!;
};
case '\n' =>
// Enter seems to crash for now (compiler bug)
yield;
};
libui::clear(l.ui);
match (list::print(l)) {
case void =>
yield;
case let e: io::error =>
fmt::fprintln(os::stderr, io::strerror(e))!;
return true;
case let e: tty::error =>
fmt::fprintln(os::stderr, tty::strerror(e))!;
return true;
};
return false;
};
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");
defer free(items);
let ui = libui::init();
defer libui::finish(&ui);
let l = list::newlist(ui, items...);
libui::addlistener(&ui, &globalrunehandler);
list::addlistener(&l, &runehandler);
libui::clear(l.ui);
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;
};
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;
};
};
};
|