diff options
Diffstat (limited to 'main.ha')
| -rw-r--r-- | main.ha | 36 |
1 files changed, 34 insertions, 2 deletions
@@ -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 => |
