From 952ab4404ffcbb43b6a95e640c6de4fb08de5c0a Mon Sep 17 00:00:00 2001 From: Julian Hurst Date: Tue, 17 May 2022 17:25:25 +0200 Subject: Move ttyui to widget --- handlers.ha | 46 +++++++++++++++++++++++----------------------- libui/layout/layout.ha | 2 ++ libui/widget/list/list.ha | 5 ++--- libui/widget/widget.ha | 2 ++ main.ha | 4 ++-- 5 files changed, 31 insertions(+), 28 deletions(-) diff --git a/handlers.ha b/handlers.ha index ef374ef..41f895f 100644 --- a/handlers.ha +++ b/handlers.ha @@ -34,7 +34,7 @@ fn runehandler(l: *widget::widget, r: rune) bool = { list::pageup(l); case 'l' => // to print properly suspend the ui, print, then resume - libui::suspend(&l.ui); + libui::suspend(&l.widget.ui); //fmt::println(l.items[l.cursor])!; match (list::selected(*l)) { case let s: str => @@ -45,7 +45,7 @@ fn runehandler(l: *widget::widget, r: rune) bool = { defer free(out); fmt::println(out)!; }; - libui::resume(&l.ui); + libui::resume(&l.widget.ui); return true; case 'g' => list::top(l); @@ -65,9 +65,9 @@ fn runehandler(l: *widget::widget, r: rune) bool = { }; case '?' => // TODO add commandline support maybe - libui::suspend(&l.ui); - fmt::fprint(l.ui.f, '?')!; - let line = match (bufio::scanline(l.ui.f)) { + libui::suspend(&l.widget.ui); + fmt::fprint(l.widget.ui.f, '?')!; + let line = match (bufio::scanline(l.widget.ui.f)) { case let s: []u8 => yield s; case io::EOF => @@ -82,12 +82,12 @@ fn runehandler(l: *widget::widget, r: rune) bool = { searchforward = false; let c = l.cursor; list::rsearch(l, searchterm); - libui::resume(&l.ui); + libui::resume(&l.widget.ui); case '/' => // TODO add commandline support maybe - libui::suspend(&l.ui); - fmt::fprint(l.ui.f, '/')!; - let line = match (bufio::scanline(l.ui.f)) { + libui::suspend(&l.widget.ui); + fmt::fprint(l.widget.ui.f, '/')!; + let line = match (bufio::scanline(l.widget.ui.f)) { case let s: []u8 => yield s; case io::EOF => @@ -102,7 +102,7 @@ fn runehandler(l: *widget::widget, r: rune) bool = { searchforward = true; let c = l.cursor; list::search(l, searchterm); - libui::resume(&l.ui); + libui::resume(&l.widget.ui); case 'o' => // order sort::strings(l.items); @@ -114,9 +114,9 @@ fn runehandler(l: *widget::widget, r: rune) bool = { list::setitems(l, itemscopy...); case 's' => // TODO add commandline support maybe - libui::suspend(&l.ui); - fmt::fprint(l.ui.f, "s: ")!; - let line = match (bufio::scanline(l.ui.f)) { + libui::suspend(&l.widget.ui); + fmt::fprint(l.widget.ui.f, "s: ")!; + let line = match (bufio::scanline(l.widget.ui.f)) { case let s: []u8 => yield s; case io::EOF => @@ -128,12 +128,12 @@ fn runehandler(l: *widget::widget, r: rune) bool = { }; defer free(line); list::containsmark(l, strings::fromutf8(line)); - libui::resume(&l.ui); + libui::resume(&l.widget.ui); case 'S' => // TODO add commandline support maybe - libui::suspend(&l.ui); - fmt::fprint(l.ui.f, "S: ")!; - let line = match (bufio::scanline(l.ui.f)) { + libui::suspend(&l.widget.ui); + fmt::fprint(l.widget.ui.f, "S: ")!; + let line = match (bufio::scanline(l.widget.ui.f)) { case let s: []u8 => yield s; case io::EOF => @@ -145,12 +145,12 @@ fn runehandler(l: *widget::widget, r: rune) bool = { }; defer free(line); list::fnmatchmark(l, strings::fromutf8(line)); - libui::resume(&l.ui); + libui::resume(&l.widget.ui); case 'r' => // TODO add commandline support maybe - libui::suspend(&l.ui); - fmt::fprint(l.ui.f, "r: ")!; - let line = match (bufio::scanline(l.ui.f)) { + libui::suspend(&l.widget.ui); + fmt::fprint(l.widget.ui.f, "r: ")!; + let line = match (bufio::scanline(l.widget.ui.f)) { case let s: []u8 => yield s; case io::EOF => @@ -168,7 +168,7 @@ fn runehandler(l: *widget::widget, r: rune) bool = { case let e: regex::error => fmt::fprintln(os::stderr, regex::strerror(e))!; }; - libui::resume(&l.ui); + libui::resume(&l.widget.ui); case ' ' => list::tmark(l); list::down(l); @@ -185,7 +185,7 @@ fn runehandler(l: *widget::widget, r: rune) bool = { }; yield; }; - libui::clear(l.ui); + libui::clear(l.widget.ui); match (list::print(l)) { case void => yield; diff --git a/libui/layout/layout.ha b/libui/layout/layout.ha index ef6bf71..c15626f 100644 --- a/libui/layout/layout.ha +++ b/libui/layout/layout.ha @@ -1,3 +1,4 @@ +use libui; use libui::widget; use io; use unix::tty; @@ -18,6 +19,7 @@ export fn newlayout(widgets: *widget::widget...) layout = { // Display all the widgets contained in the given layout. export fn print(layout: layout) (void | widget::error) = { + libui::clear(layout.widgets[0].ui); for (let i = 0z; i < len(layout.widgets); i += 1) { match (layout.widgets[i].print) { case null => diff --git a/libui/widget/list/list.ha b/libui/widget/list/list.ha index 6506ce1..e4b3209 100644 --- a/libui/widget/list/list.ha +++ b/libui/widget/list/list.ha @@ -13,7 +13,6 @@ use set; export type listwidget = struct { widget: widget::widget, - ui: libui::ttyui, items: []str, marked: set::set, cursor: size, @@ -51,9 +50,9 @@ export fn newlist(ui: libui::ttyui, items: str...) listwidget = { widget = widget::widget { print = &print, finish = &finish, + ui = ui, ... }, - ui = ui, items = items, marked = set::set {...}, cursor = 0z, @@ -134,7 +133,7 @@ export fn print(list: *widget::widget) (void | widget::error) = { // unsupported? //io::copy(list.ui.f, &st)?; let s = strio::string(&st); - libui::print(list.ui, s); + libui::print(list.widget.ui, s); io::close(&st)?; }; diff --git a/libui/widget/widget.ha b/libui/widget/widget.ha index 1f23aac..3bccd2f 100644 --- a/libui/widget/widget.ha +++ b/libui/widget/widget.ha @@ -1,3 +1,4 @@ +use libui; use io; use unix::tty; @@ -50,6 +51,7 @@ export type widget = struct { print: nullable *print, finish: nullable *finish, listeners: []listener, + ui: libui::ttyui, }; // Add a listener to the given widget. diff --git a/main.ha b/main.ha index 298087d..bff260e 100644 --- a/main.ha +++ b/main.ha @@ -22,7 +22,7 @@ type mainUI = struct { fn sighandler(sig: int, info: *signal::siginfo, ucontext: *void) void = { switch (sig) { case signal::SIGWINCH => - let sz = libui::getwinsize(u.list.ui)!; + let sz = libui::getwinsize(u.list.widget.ui)!; let rows: (u16 | size) = if (sz.rows - 2 < len(u.list.items)) { yield sz.rows - 2; } else { @@ -57,7 +57,7 @@ export fn main() void = { defer layout::finishall(&layout); //defer free(searchterm); - libui::clear(l.ui); + libui::clear(l.widget.ui); match (layout::print(layout)) { case void => -- cgit v1.2.3