sacc

sacc(omys), simple console gopher client (mirror)
git clone https://git.parazyd.org/sacc
Log | Files | Refs | LICENSE

commit 06da9e03ae2c5a92ad499d531a4bb0d3b48d2a9e
parent 6cd1427b61606300e7fcc7718863a0ad332908a6
Author: Quentin Rameau <quinq@fifth.space>
Date:   Mon,  3 Jul 2017 17:52:32 +0200

Add a status line for screen ui and unify with text

Diffstat:
Mui_ti.c | 47+++++++++++++++++++++++++++++++++++------------
Mui_txt.c | 67++++++++++++++++++++++++++++++++++++++++++++++---------------------
2 files changed, 81 insertions(+), 33 deletions(-)

diff --git a/ui_ti.c b/ui_ti.c @@ -27,6 +27,9 @@ uisetup(void) tcsetattr(0, TCSAFLUSH, &traw); setupterm(NULL, 1, NULL); + putp(tparm(save_cursor)); + putp(tparm(change_scroll_region, 0, lines-2)); + putp(tparm(restore_cursor)); } void @@ -51,23 +54,40 @@ help(void) return; } +static void +displaystatus(Item *item) +{ + size_t nitems = item->dir->nitems; + + putp(tparm(save_cursor)); + + putp(tparm(cursor_address, lines-1, 0)); + putp(tparm(enter_standout_mode)); + printf("%3d%%| %s:%s%s", nitems <= lines ? 100 : + ((unsigned long long)item->printoff + lines) * 100 / nitems, + item->host, item->port, item->selector); + putp(tparm(exit_standout_mode)); + + putp(tparm(restore_cursor)); +} + void -display(Item *item) +display(Item *entry) { - Item **items; + Item *item, **items; size_t i, curln, lastln, nitems, printoff; - if (item->type != '1') + if (entry->type != '1') return; putp(tparm(clear_screen)); putp(tparm(save_cursor)); - items = item->dir->items; - nitems = item->dir->nitems; - printoff = item->printoff; - curln = item->curline; - lastln = printoff + lines; + items = entry->dir->items; + nitems = entry->dir->nitems; + printoff = entry->printoff; + curln = entry->curline; + lastln = printoff + lines-1; /* one off for status bar */ for (i = printoff; i < nitems && i < lastln; ++i) { if (item = items[i]) { @@ -85,6 +105,7 @@ display(Item *item) } putp(tparm(restore_cursor)); + displaystatus(entry); fflush(stdout); } @@ -93,6 +114,7 @@ movecurline(Item *item, int l) { size_t nitems; ssize_t curline, offline; + int plines = lines-2; if (item->dir == NULL) return; @@ -106,11 +128,11 @@ movecurline(Item *item, int l) item->curline = curline; if (l > 0) { - offline = item->printoff + lines; - if (curline - item->printoff >= lines / 2 && offline < nitems) { + offline = item->printoff + lines-1; + if (curline - item->printoff >= plines / 2 && offline < nitems) { putp(tparm(save_cursor)); - putp(tparm(cursor_address, lines, 0)); + putp(tparm(cursor_address, plines, 0)); putp(tparm(scroll_forward)); printitem(item->dir->items[offline]); @@ -119,7 +141,7 @@ movecurline(Item *item, int l) } } else { offline = item->printoff + l; - if (curline - offline <= lines / 2 && offline >= 0) { + if (curline - offline <= plines / 2 && offline >= 0) { putp(tparm(save_cursor)); putp(tparm(cursor_address, 0, 0)); @@ -136,6 +158,7 @@ movecurline(Item *item, int l) putp(tparm(enter_standout_mode)); printitem(item->dir->items[curline]); putp(tparm(exit_standout_mode)); + displaystatus(item); fflush(stdout); } diff --git a/ui_txt.c b/ui_txt.c @@ -7,10 +7,30 @@ #include "common.h" +int lines; + +static int +termlines(void) +{ + struct winsize ws; + + if (ioctl(1, TIOCGWINSZ, &ws) < 0) { + die("Could not get terminal resolution: %s", + strerror(errno)); + } + + return ws.ws_row-1; /* one off for status bar */ +} + void -uisetup(void) { return; } +uisetup(void) { + lines = termlines(); +} + void -uicleanup(void) { return; } +uicleanup(void) { + return; +} void help(void) @@ -26,44 +46,49 @@ help(void) } static int -termlines(void) +ndigits(size_t n) { - struct winsize ws; + return (n < 10) ? 1 : (n < 100) ? 2 : 3; +} - if (ioctl(1, TIOCGWINSZ, &ws) < 0) { - die("Could not get terminal resolution: %s", - strerror(errno)); - } +static void +printstatus(Item *item) +{ + size_t nitems = item->dir->nitems; - return ws.ws_row-1; + printf("%3d%%%*c %s:%s%s (h for help): ", nitems <= lines ? 100 : + ((unsigned long long)item->printoff + lines) * 100 / nitems, + ndigits(nitems)+2, '|', item->host, item->port, item->selector); } void -display(Item *item) +display(Item *entry) { - Item **items; + Item *item, **items; size_t i, lines, nitems; - int ndigits; + int nd; - if (item->type != '1') + if (entry->type != '1') return; - items = item->dir->items; - nitems = item->dir->nitems; - lines = item->printoff + termlines(); - ndigits = (nitems < 10) ? 1 : (nitems < 100) ? 2 : 3; + items = entry->dir->items; + nitems = entry->dir->nitems; + lines = entry->printoff + termlines(); + nd = ndigits(nitems); - for (i = item->printoff; i < nitems && i < lines; ++i) { + for (i = entry->printoff; i < nitems && i < lines; ++i) { if (item = items[i]) { - printf("%*d %-4s%c %s\n", ndigits, i+1, + printf("%*zu %-4s%c %s\n", nd, i+1, item->type != 'i' ? typedisplay(item->type) : "", item->type > '1' ? '|' : '+', items[i]->username); } else { - printf("%*d !! |\n", ndigits, i+1); + printf("%*zu !! |\n", nd, i+1); } } + + fflush(stdout); } Item * @@ -75,7 +100,7 @@ selectitem(Item *entry) nitems = entry->dir ? entry->dir->nitems : 0; do { - printf("%d items (h for help): ", nitems); + printstatus(entry); fflush(stdout); if (!fgets(buf, sizeof(buf), stdin)) {