it* sacc + cursorline and uri preview Err codevoid.de 70 i Err codevoid.de 70 hgit clone git://git.codevoid.de/sacc-sdk URL:git://git.codevoid.de/sacc-sdk codevoid.de 70 1Log /git/sacc-sdk/log.gph codevoid.de 70 1Files /git/sacc-sdk/files.gph codevoid.de 70 1Refs /git/sacc-sdk/refs.gph codevoid.de 70 1LICENSE /git/sacc-sdk/file/LICENSE.gph codevoid.de 70 i--- Err codevoid.de 70 1commit 13dd0464fab6950cbeee18b8ae6549d0f48723c7 /git/sacc-sdk/commit/13dd0464fab6950cbeee18b8ae6549d0f48723c7.gph codevoid.de 70 1parent f5d039f7156956e52161605fa71715a2d1d7c3c8 /git/sacc-sdk/commit/f5d039f7156956e52161605fa71715a2d1d7c3c8.gph codevoid.de 70 hAuthor: Hiltjo Posthuma URL:mailto:hiltjo@codemadness.org codevoid.de 70 iDate: Fri, 9 Feb 2018 17:43:53 +0100 Err codevoid.de 70 i Err codevoid.de 70 iProcess glyph width for line length when truncating output Err codevoid.de 70 i Err codevoid.de 70 iDiffstat: Err codevoid.de 70 i M common.h | 1 + Err codevoid.de 70 i M sacc.c | 31 +++++++++++++++++++++++++++++++ Err codevoid.de 70 i M ui_ti.c | 20 ++++++++++---------- Err codevoid.de 70 i M ui_txt.c | 13 +++++++------ Err codevoid.de 70 i Err codevoid.de 70 i4 files changed, 49 insertions(+), 16 deletions(-) Err codevoid.de 70 i--- Err codevoid.de 70 1diff --git a/common.h b/common.h /git/sacc-sdk/file/common.h.gph codevoid.de 70 it@@ -23,6 +23,7 @@ struct dir { Err codevoid.de 70 i }; Err codevoid.de 70 i Err codevoid.de 70 i void die(const char *fmt, ...); Err codevoid.de 70 i+size_t mbsprint(const char *s, size_t len); Err codevoid.de 70 i const char *typedisplay(char t); Err codevoid.de 70 i void uidisplay(Item *item); Err codevoid.de 70 i Item *uiselectitem(Item *entry); Err codevoid.de 70 1diff --git a/sacc.c b/sacc.c /git/sacc-sdk/file/sacc.c.gph codevoid.de 70 it@@ -1,6 +1,7 @@ Err codevoid.de 70 i /* See LICENSE file for copyright and license details. */ Err codevoid.de 70 i #include Err codevoid.de 70 i #include Err codevoid.de 70 i+#include Err codevoid.de 70 i #include Err codevoid.de 70 i #include Err codevoid.de 70 i #include Err codevoid.de 70 it@@ -9,6 +10,7 @@ Err codevoid.de 70 i #include Err codevoid.de 70 i #include Err codevoid.de 70 i #include Err codevoid.de 70 i+#include Err codevoid.de 70 i #include Err codevoid.de 70 i #include Err codevoid.de 70 i #include Err codevoid.de 70 it@@ -37,6 +39,34 @@ die(const char *fmt, ...) Err codevoid.de 70 i exit(1); Err codevoid.de 70 i } Err codevoid.de 70 i Err codevoid.de 70 i+/* print `len' columns of characters. */ Err codevoid.de 70 i+size_t Err codevoid.de 70 i+mbsprint(const char *s, size_t len) Err codevoid.de 70 i+{ Err codevoid.de 70 i+ wchar_t wc; Err codevoid.de 70 i+ size_t col = 0, i, slen; Err codevoid.de 70 i+ int rl, w; Err codevoid.de 70 i+ Err codevoid.de 70 i+ if (!len) Err codevoid.de 70 i+ return col; Err codevoid.de 70 i+ Err codevoid.de 70 i+ slen = strlen(s); Err codevoid.de 70 i+ for (i = 0; i < slen; i += rl) { Err codevoid.de 70 i+ if ((rl = mbtowc(&wc, s + i, slen - i < 4 ? slen - i : 4)) <= 0) Err codevoid.de 70 i+ break; Err codevoid.de 70 i+ if ((w = wcwidth(wc)) == -1) Err codevoid.de 70 i+ continue; Err codevoid.de 70 i+ if (col + w > len || (col + w == len && s[i + rl])) { Err codevoid.de 70 i+ fputs("\xe2\x80\xa6", stdout); Err codevoid.de 70 i+ col++; Err codevoid.de 70 i+ break; Err codevoid.de 70 i+ } Err codevoid.de 70 i+ fwrite(s + i, 1, rl, stdout); Err codevoid.de 70 i+ col += w; Err codevoid.de 70 i+ } Err codevoid.de 70 i+ return col; Err codevoid.de 70 i+} Err codevoid.de 70 i+ Err codevoid.de 70 i static void * Err codevoid.de 70 i xreallocarray(void *m, const size_t n, const size_t s) Err codevoid.de 70 i { Err codevoid.de 70 it@@ -779,6 +809,7 @@ setup(void) Err codevoid.de 70 i struct sigaction sa; Err codevoid.de 70 i int fd; Err codevoid.de 70 i Err codevoid.de 70 i+ setlocale(LC_CTYPE, ""); Err codevoid.de 70 i setenv("PAGER", "more", 0); Err codevoid.de 70 i atexit(cleanup); Err codevoid.de 70 i /* reopen stdin in case we're reading from a pipe */ Err codevoid.de 70 1diff --git a/ui_ti.c b/ui_ti.c /git/sacc-sdk/file/ui_ti.c.gph codevoid.de 70 it@@ -65,11 +65,10 @@ uiprompt(char *fmt, ...) Err codevoid.de 70 i if (vsnprintf(bufout, sizeof(bufout), fmt, ap) >= sizeof(bufout)) Err codevoid.de 70 i bufout[sizeof(bufout)-1] = '\0'; Err codevoid.de 70 i va_end(ap); Err codevoid.de 70 i- printf("%.*s", columns, bufout); Err codevoid.de 70 i+ n = mbsprint(bufout, columns); Err codevoid.de 70 i Err codevoid.de 70 i putp(tparm(exit_standout_mode)); Err codevoid.de 70 i- Err codevoid.de 70 i- if ((n = strlen(bufout)) < columns) Err codevoid.de 70 i+ if (n < columns) Err codevoid.de 70 i printf("%*s", columns - n, " "); Err codevoid.de 70 i Err codevoid.de 70 i putp(tparm(cursor_address, lines-1, n)); Err codevoid.de 70 it@@ -102,7 +101,8 @@ printitem(Item *item) Err codevoid.de 70 i if (snprintf(bufout, sizeof(bufout), "%s %s", typedisplay(item->type), Err codevoid.de 70 i item->username) >= sizeof(bufout)) Err codevoid.de 70 i bufout[sizeof(bufout)-1] = '\0'; Err codevoid.de 70 i- printf("%.*s\r", columns, bufout); Err codevoid.de 70 i+ mbsprint(bufout, columns); Err codevoid.de 70 i+ putchar('\r'); Err codevoid.de 70 i } Err codevoid.de 70 i Err codevoid.de 70 i static Item * Err codevoid.de 70 it@@ -154,9 +154,9 @@ uistatus(char *fmt, ...) Err codevoid.de 70 i if (n >= sizeof(bufout)) Err codevoid.de 70 i bufout[sizeof(bufout)-1] = '\0'; Err codevoid.de 70 i Err codevoid.de 70 i- printf("%.*s", columns, bufout); Err codevoid.de 70 i+ n = mbsprint(bufout, columns); Err codevoid.de 70 i putp(tparm(exit_standout_mode)); Err codevoid.de 70 i- if ((n = strlen(bufout)) < columns) Err codevoid.de 70 i+ if (n < columns) Err codevoid.de 70 i printf("%*s", columns - n, " "); Err codevoid.de 70 i Err codevoid.de 70 i putp(tparm(restore_cursor)); Err codevoid.de 70 it@@ -185,9 +185,9 @@ displaystatus(Item *item) Err codevoid.de 70 i item->host, item->type, item->selector, item->port) Err codevoid.de 70 i >= sizeof(bufout)) Err codevoid.de 70 i bufout[sizeof(bufout)-1] = '\0'; Err codevoid.de 70 i- printf("%.*s", columns, bufout); Err codevoid.de 70 i+ n = mbsprint(bufout, columns); Err codevoid.de 70 i putp(tparm(exit_standout_mode)); Err codevoid.de 70 i- if ((n = strlen(bufout)) < columns) Err codevoid.de 70 i+ if (n < columns) Err codevoid.de 70 i printf("%*s", columns - n, " "); Err codevoid.de 70 i Err codevoid.de 70 i putp(tparm(restore_cursor)); Err codevoid.de 70 it@@ -225,9 +225,9 @@ displayuri(Item *item) Err codevoid.de 70 i if (n >= sizeof(bufout)) Err codevoid.de 70 i bufout[sizeof(bufout)-1] = '\0'; Err codevoid.de 70 i Err codevoid.de 70 i- printf("%.*s", columns, bufout); Err codevoid.de 70 i+ n = mbsprint(bufout, columns); Err codevoid.de 70 i putp(tparm(exit_standout_mode)); Err codevoid.de 70 i- if ((n = strlen(bufout)) < columns) Err codevoid.de 70 i+ if (n < columns) Err codevoid.de 70 i printf("%*s", columns - n, " "); Err codevoid.de 70 i Err codevoid.de 70 i putp(tparm(restore_cursor)); Err codevoid.de 70 1diff --git a/ui_txt.c b/ui_txt.c /git/sacc-sdk/file/ui_txt.c.gph codevoid.de 70 it@@ -83,7 +83,7 @@ uistatus(char *fmt, ...) Err codevoid.de 70 i if (n >= sizeof(bufout)) Err codevoid.de 70 i bufout[sizeof(bufout)-1] = '\0'; Err codevoid.de 70 i Err codevoid.de 70 i- printf("%.*s", columns, bufout); Err codevoid.de 70 i+ mbsprint(bufout, columns); Err codevoid.de 70 i fflush(stdout); Err codevoid.de 70 i Err codevoid.de 70 i getchar(); Err codevoid.de 70 it@@ -106,7 +106,7 @@ printstatus(Item *item, char c) Err codevoid.de 70 i item->host, item->type, item->selector, c, item->port) Err codevoid.de 70 i >= sizeof(bufout)) Err codevoid.de 70 i bufout[sizeof(bufout)-1] = '\0'; Err codevoid.de 70 i- printf("%.*s", columns, bufout); Err codevoid.de 70 i+ mbsprint(bufout, columns); Err codevoid.de 70 i } Err codevoid.de 70 i Err codevoid.de 70 i char * Err codevoid.de 70 it@@ -122,8 +122,7 @@ uiprompt(char *fmt, ...) Err codevoid.de 70 i bufout[sizeof(bufout)-1] = '\0'; Err codevoid.de 70 i va_end(ap); Err codevoid.de 70 i Err codevoid.de 70 i- printf("%.*s", columns, bufout); Err codevoid.de 70 i- Err codevoid.de 70 i+ mbsprint(bufout, columns); Err codevoid.de 70 i fflush(stdout); Err codevoid.de 70 i Err codevoid.de 70 i if ((r = getline(&input, &n, stdin)) < 0) { Err codevoid.de 70 it@@ -163,7 +162,8 @@ uidisplay(Item *entry) Err codevoid.de 70 i items[i].username) Err codevoid.de 70 i >= sizeof(bufout)) Err codevoid.de 70 i bufout[sizeof(bufout)-1] = '\0'; Err codevoid.de 70 i- printf("%.*s\n", columns, bufout); Err codevoid.de 70 i+ mbsprint(bufout, columns); Err codevoid.de 70 i+ putchar('\n'); Err codevoid.de 70 i } Err codevoid.de 70 i Err codevoid.de 70 i fflush(stdout); Err codevoid.de 70 it@@ -201,7 +201,8 @@ printuri(Item *item, size_t i) Err codevoid.de 70 i if (n >= sizeof(bufout)) Err codevoid.de 70 i bufout[sizeof(bufout)-1] = '\0'; Err codevoid.de 70 i Err codevoid.de 70 i- printf("%.*s\n", columns, bufout); Err codevoid.de 70 i+ mbsprint(bufout, columns); Err codevoid.de 70 i+ putchar('\n'); Err codevoid.de 70 i } Err codevoid.de 70 i Err codevoid.de 70 i void Err codevoid.de 70 .