diff options
| author | Julian Hurst <ark@mansus.space> | 2022-05-25 16:15:07 +0200 |
|---|---|---|
| committer | Julian Hurst <ark@mansus.space> | 2022-05-25 16:15:07 +0200 |
| commit | 042791ee8518b5b3f196ca198e184d5913341619 (patch) | |
| tree | dc7cae7079494c457541c250dd051c2a4b5d03a8 | |
| parent | f39c8515280c43151c3b03ef52aaf167e472d45d (diff) | |
| download | ilhare-042791ee8518b5b3f196ca198e184d5913341619.tar.gz | |
Use signalfd and poll to handle sigwinch
| -rw-r--r-- | handlers.ha | 2 | ||||
| -rw-r--r-- | libui/libui.ha | 2 | ||||
| -rw-r--r-- | main.ha | 113 |
3 files changed, 80 insertions, 37 deletions
diff --git a/handlers.ha b/handlers.ha index 41f895f..68d7556 100644 --- a/handlers.ha +++ b/handlers.ha @@ -177,13 +177,11 @@ fn runehandler(l: *widget::widget, r: rune) bool = { case '\n' => // 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.widget.ui); match (list::print(l)) { diff --git a/libui/libui.ha b/libui/libui.ha index b0d0ea3..b81c971 100644 --- a/libui/libui.ha +++ b/libui/libui.ha @@ -35,7 +35,7 @@ export fn init() ttyui = { fmt::fatal(errors::strerror(e)); }; tty::makeraw(&term)!; - tty::noecho(&term)!; + //tty::noecho(&term)!; let ui = ttyui { term = term, @@ -9,6 +9,8 @@ use os; use strings; use unix::tty; use unix::signal; +use unix::poll; +use errors; let u: mainUI = mainUI {...}; @@ -37,7 +39,27 @@ fn sighandler(sig: int, info: *signal::siginfo, ucontext: *void) void = { list::resize(u.list, oldsz); libui::clear(u.list.widget.ui); list::print(u.list)!; + case => + yield; + }; +}; + +fn resize(list: *list::listwidget) void = { + let sz = libui::getwinsize(list.widget.ui)!; + let rows: (u16 | size) = if (sz.rows - 2 < len(list.items)) { + yield sz.rows - 2; + } else { + yield len(list.items); + }; + const oldsz = list::ttysize { + rows = list.sz.rows, + cols = list.sz.cols, }; + list.sz.rows = rows: u16; + list.sz.cols = sz.columns; + list::resize(list, oldsz); + libui::clear(list.widget.ui); + list::print(list)!; }; export fn main() void = { @@ -70,47 +92,70 @@ export fn main() void = { case void => yield; case let e: io::error => - fmt::fprintln(os::stderr, io::strerror(e))!; - return; + fmt::fatal(io::strerror(e)); case let e: tty::error => - fmt::fprintln(os::stderr, tty::strerror(e))!; - return; + fmt::fatal(tty::strerror(e)); }; - //match (list::print(&l)) { - //case void => - //yield; - //case let e: io::error => - //fmt::fprintln(os::stderr, io::strerror(e))!; - //return; - //case let e: tty::error => - //fmt::fprintln(os::stderr, tty::strerror(e))!; - //return; - //}; - u = mainUI { - list = &l, + + signal::block(signal::SIGWINCH); + let sfd = match (signal::signalfd(signal::SIGWINCH)) { + case let sfd: io::file => + yield sfd; + case let e: errors::error => + fmt::fatal(errors::strerror(e)); }; - const sigs = signal::handle(signal::SIGWINCH, &sighandler, signal::flag::RESTART); - defer signal::restore(signal::SIGWINCH, &sigs); + defer io::close(sfd)!; + + const pollfds: [2]poll::pollfd = [poll::pollfd { + fd = ui.f, + events = poll::event::POLLIN, + ... + }, poll::pollfd { + fd = sfd, + events = poll::event::POLLIN, + ... + }]; + for (true) { - let r = match (libui::scan(ui)) { - case let r: rune => - yield r; - case utf8::invalid => - fmt::fprintln(os::stderr, "Invalid utf8 sequence")!; - break; - case io::EOF => - fmt::fprintln(os::stderr, "EOF")!; - break; - case let e: io::error => - fmt::fprintln(os::stderr, io::strerror(e))!; - break; + let nb = match (poll::poll(pollfds, poll::INDEF)) { + case let nb: uint => + yield nb; + case let e: errors::error => + fmt::fatal(errors::strerror(e)); }; - if (libui::notify(&ui, r)) { - break; + let readin = false; + if (nb == 0) { + continue; + } else { + if (pollfds[0].revents & poll::event::POLLIN != 0) { + readin = true; + }; + if (pollfds[1].revents & poll::event::POLLIN != 0) { + signal::read(pollfds[1].fd)!; + resize(&l); + }; }; - if (list::notify(&l, r)) { - break; + if (readin) { + let r = match (libui::scan(ui)) { + case let r: rune => + yield r; + case utf8::invalid => + fmt::fprintln(os::stderr, "Invalid utf8 sequence")!; + break; + case io::EOF => + fmt::fprintln(os::stderr, "EOF")!; + break; + case let e: io::error => + fmt::fprintln(os::stderr, io::strerror(e))!; + break; + }; + if (libui::notify(&ui, r)) { + break; + }; + if (list::notify(&l, r)) { + break; + }; }; }; }; |
