aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libui/list/list.ha16
-rw-r--r--main.ha36
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)?;
diff --git a/main.ha b/main.ha
index 9d2dfde..f1bd20e 100644
--- a/main.ha
+++ b/main.ha
@@ -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 =>