aboutsummaryrefslogtreecommitdiff
path: root/main.ha
diff options
context:
space:
mode:
Diffstat (limited to 'main.ha')
-rw-r--r--main.ha53
1 files changed, 26 insertions, 27 deletions
diff --git a/main.ha b/main.ha
index b5519c7..a2ada9a 100644
--- a/main.ha
+++ b/main.ha
@@ -20,34 +20,22 @@ let searchforward: bool = true;
let nulterm: bool = false;
let msg: str = "";
-fn resize(list: *list::listwidget) void = {
- let sz = libtui::getwinsize(list.widget.ui)!;
- let rows: (u16 | size) = if (sz.rows - 1 < len(list.items)) {
+fn resize(l: *list::listwidget) void = {
+ let sz = libtui::getwinsize(l.widget.ui)!;
+ let rows: u16 = if (sz.rows - 1 < len(l.items)) {
yield sz.rows - 1;
} else {
- yield len(list.items);
+ yield len(l.items): u16;
};
const oldsz = list::ttysize {
- rows = list.sz.rows,
- cols = list.sz.cols,
+ rows = l.sz.rows,
+ cols = l.sz.cols,
};
- let rows: (u16 | size) = if (sz.rows - 1u16 < len(list.items)) {
- yield sz.rows - 1u16;
- } else {
- yield len(list.items);
- };
- list::setsize(list, tty::ttysize {
- rows = rows: u16,
+ list::setsize(l, tty::ttysize {
+ rows = rows,
columns = sz.columns,
});
- list::resize(list, oldsz);
-};
-
-fn handle_signal(file: *ev::file, sig: signal::sig) void = {
- if (sig == signal::sig::WINCH) {
- let l = ev::getuser(file): *list::listwidget;
- resize(l);
- };
+ list::resize(l, oldsz);
};
type state = struct {
@@ -56,6 +44,14 @@ type state = struct {
layout: libtui::layout::layout,
};
+fn handle_signal(file: *ev::file, sig: signal::sig) void = {
+ if (sig == signal::sig::WINCH) {
+ let st = ev::getuser(file): *state;
+ resize(st.l);
+ };
+};
+
+
fn handle_ui(file: *ev::file) void = {
let st = ev::getuser(file): *state;
let r = match (libtui::scan(*st.ui)) {
@@ -80,11 +76,12 @@ fn handle_ui(file: *ev::file) void = {
if (list::notify(st.l, r)) {
ev::stop(ev::getloop(file));
};
+ ev::readable(file, &handle_ui);
};
fn handle_print(loop: *ev::loop, user: nullable *opaque) void = {
let st = user: *state;
- libtui::doclear(&st.l.widget.ui);
+ fmt::fprintln(os::stderr, "printing")!;
match (layout::print(st.layout)) {
case void =>
yield;
@@ -95,6 +92,7 @@ fn handle_print(loop: *ev::loop, user: nullable *opaque) void = {
fmt::fprintln(os::stderr, tty::strerror(e))!;
ev::stop(loop);
};
+ ev::do(loop, &handle_print, st);
};
export fn main() void = {
@@ -160,22 +158,23 @@ export fn main() void = {
let loop = ev::newloop()!;
defer ev::finish(&loop);
- const signal = ev::signal(&loop, &handle_signal, signal::sig::WINCH)!;
- defer ev::close(signal);
- ev::setuser(signal, &l);
let st = state {
ui = &ui,
l = &l,
layout = layout,
};
+
+ const signal = ev::signal(&loop, &handle_signal, signal::sig::WINCH)!;
+ defer ev::close(signal);
+ ev::setuser(signal, &st);
+
let mainf = ev::register(&loop, ui.f, &st)!;
ev::readable(mainf, &handle_ui);
ev::do(&loop, &handle_print, &st);
for (ev::dispatch(&loop, -1)!) {
- ev::do(&loop, &handle_print, &st);
- ev::readable(mainf, &handle_ui);
+ void;
};
};