aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJulian Hurst <ark@mansus.space>2024-09-16 20:01:54 +0200
committerJulian Hurst <ark@mansus.space>2024-09-16 20:01:54 +0200
commitd31ca475a5cffd05b171a1bed920afd9aa8412fa (patch)
tree6dbe8068ddf9bcfd4e8841937a77b1831791b111
parent0b345ffc737f45b3b359ee3884f71b508db19265 (diff)
downloadilhare-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.
-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;
};
};