diff options
| -rw-r--r-- | libui/list/list.ha | 16 | ||||
| -rw-r--r-- | main.ha | 36 |
2 files changed, 42 insertions, 10 deletions
diff --git a/libui/list/list.ha b/libui/list/list.ha index 6b11b75..6cbafd7 100644 --- a/libui/list/list.ha +++ b/libui/list/list.ha @@ -58,22 +58,22 @@ export fn addlistener(list: *listwidget, l: listener) void = { }; export fn print(list: *listwidget) (void | io::error | tty::error) = { - let sz = libui::getwinsize(list.ui)?; - let rows: (u16 | size) = if (sz.rows - 2 < len(list.items)) { - yield sz.rows - 2; - } else { - yield len(list.items); - }; + //let sz = libui::getwinsize(list.ui)?; + //let rows: (u16 | size) = if (sz.rows - 2 < len(list.items)) { + //yield sz.rows - 2; + //} else { + //yield len(list.items); + //}; //fmt::fprintln(os::stderr, rows)!; - list.frame.end = list.frame.start + rows: u16; + list.frame.end = list.frame.start + list.sz.rows; let st = strio::dynamic(); strio::concat(&st, "\r")?; for (let i = list.frame.start; i < list.frame.end: u16; i += 1) { let item = list.items[i]; - let truncitem = wcwidth::truncate(item, sz.columns); + let truncitem = wcwidth::truncate(item, list.sz.cols); if (list.cursor == i) { strio::concat(&st, "\x1B[104;1m\x1B[30m")?; strio::concat(&st, truncitem)?; @@ -6,9 +6,13 @@ use fmt; use os; use strings; use unix::tty; +use unix::signal; + +//let l: list::listwidget = list::listwidget {...}; +let u: mainUI = mainUI {...}; type mainUI = struct { - list: list::listwidget, + list: *list::listwidget, }; fn globalrunehandler(ui: *libui::ttyui, r: rune) bool = { @@ -20,6 +24,8 @@ fn globalrunehandler(ui: *libui::ttyui, r: rune) bool = { fn runehandler(l: *list::listwidget, r: rune) bool = { switch (r) { + case 'f' => + fmt::fprintln(os::stderr, "f in chat")!; case 'j' => list::down(l); case 'k' => @@ -44,7 +50,14 @@ fn runehandler(l: *list::listwidget, r: rune) bool = { fmt::fprintln(os::stderr, "changed")!; }; case '\n' => - // Enter seems to crash for now (compiler bug) + // For some reason enter doesn't send r == '\n' + fmt::fprintln(os::stderr, "This is not detected")!; + yield; + case => + let us = utf8::encoderune(r); + if (len(us) > 0 && us[0] == 13u8) { + fmt::fprintln(os::stderr, "newline")!; + }; yield; }; libui::clear(l.ui); @@ -61,6 +74,21 @@ fn runehandler(l: *list::listwidget, r: rune) bool = { return false; }; +fn sighandler(sig: int, info: *signal::siginfo, ucontext: *void) void = { + switch (sig) { + case signal::SIGWINCH => + fmt::fprintln(os::stderr, "winch")!; + let sz = libui::getwinsize(u.list.ui)!; + let rows: (u16 | size) = if (sz.rows - 2 < len(u.list.items)) { + yield sz.rows - 2; + } else { + yield len(u.list.items); + }; + u.list.sz.rows = rows: u16; + u.list.sz.cols = sz.columns; + }; +}; + export fn main() void = { let in = match (io::drain(os::stdin)) { case let in: []u8 => @@ -90,6 +118,10 @@ export fn main() void = { fmt::fprintln(os::stderr, tty::strerror(e))!; return; }; + u = mainUI { + list = &l, + }; + signal::handle(signal::SIGWINCH, &sighandler, signal::flag::RESTART); for (true) { let r = match (libui::scan(ui)) { case let r: rune => |
