aboutsummaryrefslogtreecommitdiff
path: root/main.ha
diff options
context:
space:
mode:
Diffstat (limited to 'main.ha')
-rw-r--r--main.ha113
1 files changed, 79 insertions, 34 deletions
diff --git a/main.ha b/main.ha
index 51c9b8a..a7396cb 100644
--- a/main.ha
+++ b/main.ha
@@ -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;
+ };
};
};
};