aboutsummaryrefslogtreecommitdiff
path: root/main.ha
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 /main.ha
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.
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;
};
};