diff options
Diffstat (limited to 'main.ha')
| -rw-r--r-- | main.ha | 53 |
1 files changed, 26 insertions, 27 deletions
@@ -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; }; }; |
