diff options
| author | Julian Hurst <ark@mansus.space> | 2024-09-16 20:01:54 +0200 |
|---|---|---|
| committer | Julian Hurst <ark@mansus.space> | 2024-09-16 20:01:54 +0200 |
| commit | d31ca475a5cffd05b171a1bed920afd9aa8412fa (patch) | |
| tree | 6dbe8068ddf9bcfd4e8841937a77b1831791b111 /main.ha | |
| parent | 0b345ffc737f45b3b359ee3884f71b508db19265 (diff) | |
| download | ilhare-d31ca475a5cffd05b171a1bed920afd9aa8412fa.tar.gz | |
Fix crash on resize
readable was being called without the associated file being "consumed"
leading to a crash. Furthermore their was some misbehaving casts between
size and u16 (maybe bug in hare?). This led to the frame sizes being set
to very large incorrect values that messed up printing the list.
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; }; }; |
