ihorizontal mode full of bugs and half working - iomenu - interactive terminal-based selection menu Err bitreich.org 70 hgit clone git://bitreich.org/iomenu git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/iomenu URL:git://bitreich.org/iomenu git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/iomenu bitreich.org 70 1Log /scm/iomenu/log.gph bitreich.org 70 1Files /scm/iomenu/files.gph bitreich.org 70 1Refs /scm/iomenu/refs.gph bitreich.org 70 1Tags /scm/iomenu/tag bitreich.org 70 1README /scm/iomenu/file/README.gph bitreich.org 70 1LICENSE /scm/iomenu/file/LICENSE.gph bitreich.org 70 i--- Err bitreich.org 70 1commit 3f19ac319ee4156f4728b5d496788b632281a9b2 /scm/iomenu/commit/3f19ac319ee4156f4728b5d496788b632281a9b2.gph bitreich.org 70 1parent f7009a9dc38d011eafe5720f7ce72b98560722b9 /scm/iomenu/commit/f7009a9dc38d011eafe5720f7ce72b98560722b9.gph bitreich.org 70 hAuthor: Josuah Demangeonā  ā µ URL:mailto:mail@josuah.net bitreich.org 70 iDate: Fri, 17 Mar 2017 22:56:18 +0100 Err bitreich.org 70 i Err bitreich.org 70 ihorizontal mode full of bugs and half working Err bitreich.org 70 i Err bitreich.org 70 iDiffstat: Err bitreich.org 70 i M iomenu.c | 87 ++++++++++++++++++++++++------- Err bitreich.org 70 i Err bitreich.org 70 i1 file changed, 67 insertions(+), 20 deletions(-) Err bitreich.org 70 i--- Err bitreich.org 70 1diff --git a/iomenu.c b/iomenu.c /scm/iomenu/file/iomenu.c.gph bitreich.org 70 i@@ -26,7 +26,7 @@ struct line { Err bitreich.org 70 i char input[BUFSIZ]; Err bitreich.org 70 i size_t current = 0, matching = 0, linec = 0, offset = 0; Err bitreich.org 70 i struct line **linev = NULL; Err bitreich.org 70 i-int opt_lines = 30; Err bitreich.org 70 i+int opt_lines = 0; Err bitreich.org 70 i char *opt_prompt = ""; Err bitreich.org 70 i Err bitreich.org 70 i Err bitreich.org 70 i@@ -107,7 +107,7 @@ int Err bitreich.org 70 i line_matches(struct line *line, char **tokv, size_t tokc) Err bitreich.org 70 i { Err bitreich.org 70 i for (size_t i = 0; i < tokc; i++) Err bitreich.org 70 i- if (strstr(line->text, tokv[i]) != 0) Err bitreich.org 70 i+ if (strstr(line->text, tokv[i]) == NULL) Err bitreich.org 70 i return 0; Err bitreich.org 70 i Err bitreich.org 70 i return 1; Err bitreich.org 70 i@@ -172,8 +172,8 @@ matching_next(size_t pos) Err bitreich.org 70 i void Err bitreich.org 70 i draw_line(size_t pos, const size_t cols) Err bitreich.org 70 i { Err bitreich.org 70 i- fprintf(stderr, Err bitreich.org 70 i- pos == current ? "\033[7m%s\033[m\n" : "%s\n", Err bitreich.org 70 i+ fprintf(stderr, pos == current ? Err bitreich.org 70 i+ "\n\033[30;47m\033[K%s\033[m" : "\n\033[K%s", Err bitreich.org 70 i linev[pos]->text Err bitreich.org 70 i ); Err bitreich.org 70 i } Err bitreich.org 70 i@@ -182,17 +182,65 @@ draw_line(size_t pos, const size_t cols) Err bitreich.org 70 i void Err bitreich.org 70 i draw_lines(size_t count, size_t cols) Err bitreich.org 70 i { Err bitreich.org 70 i- size_t i = offset; Err bitreich.org 70 i+ size_t printed = 0; Err bitreich.org 70 i Err bitreich.org 70 i- for (i = 0; i < linec; i++) Err bitreich.org 70 i- draw_line(i, cols); Err bitreich.org 70 i+ for (size_t i = offset; printed < count && i < linec; i++) { Err bitreich.org 70 i+ if (linev[i]->match) { Err bitreich.org 70 i+ draw_line(i, cols); Err bitreich.org 70 i+ printed++; Err bitreich.org 70 i+ } Err bitreich.org 70 i+ } Err bitreich.org 70 i+ Err bitreich.org 70 i+ while (printed++ < count) Err bitreich.org 70 i+ fputs("\n\033[K", stderr); Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+ Err bitreich.org 70 i+int Err bitreich.org 70 i+draw_column(size_t pos, size_t col, size_t cols) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ fputs(pos == current ? "\033[30;47m " : " ", stderr); Err bitreich.org 70 i+ Err bitreich.org 70 i+ for (size_t i = 0; col < cols ;) { Err bitreich.org 70 i+ size_t len = mblen(linev[pos]->text + i, BUFSIZ - i); Err bitreich.org 70 i+ Err bitreich.org 70 i+ if (len == 0) { Err bitreich.org 70 i+ i++; Err bitreich.org 70 i+ continue; Err bitreich.org 70 i+ } Err bitreich.org 70 i+ Err bitreich.org 70 i+ col += linev[pos]->text[i] = '\t' ? pos + 1 % 8 : 1; Err bitreich.org 70 i+ Err bitreich.org 70 i+ for (; len > 0; len--, i++) Err bitreich.org 70 i+ fputc(linev[pos]->text[i], stderr); Err bitreich.org 70 i+ } Err bitreich.org 70 i+ Err bitreich.org 70 i+ fputs(pos == current ? " \033[m" : " ", stderr); Err bitreich.org 70 i+ Err bitreich.org 70 i+ return col; Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i Err bitreich.org 70 i void Err bitreich.org 70 i-draw_prompt(int cols) Err bitreich.org 70 i+draw_columns(size_t cols) Err bitreich.org 70 i { Err bitreich.org 70 i- fprintf(stderr, "\r\033[K\033[1m%s%s\033[m", opt_prompt, input); Err bitreich.org 70 i+ size_t col = 20; Err bitreich.org 70 i+ Err bitreich.org 70 i+ for (size_t i = offset; col < cols; i++) Err bitreich.org 70 i+ col = draw_column(i, col, cols); Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+ Err bitreich.org 70 i+void Err bitreich.org 70 i+draw_prompt(size_t cols) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ size_t limit = opt_lines ? cols : 20; Err bitreich.org 70 i+ Err bitreich.org 70 i+ fputc('\r', stderr); Err bitreich.org 70 i+ for (size_t i = 0; i < limit; i++) Err bitreich.org 70 i+ fputc(' ', stderr); Err bitreich.org 70 i+ Err bitreich.org 70 i+ fprintf(stderr, "\r\033[1m%s%s\033[m", opt_prompt, input); Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i Err bitreich.org 70 i@@ -200,30 +248,30 @@ void Err bitreich.org 70 i draw_screen(int tty_fd) Err bitreich.org 70 i { Err bitreich.org 70 i struct winsize w; Err bitreich.org 70 i- int count; Err bitreich.org 70 i+ size_t count; Err bitreich.org 70 i Err bitreich.org 70 i if (ioctl(tty_fd, TIOCGWINSZ, &w) < 0) Err bitreich.org 70 i die("could not get terminal size"); Err bitreich.org 70 i Err bitreich.org 70 i count = MIN(opt_lines, w.ws_row - 2); Err bitreich.org 70 i Err bitreich.org 70 i- fputs("\n", stderr); Err bitreich.org 70 i- draw_lines(count, w.ws_col); Err bitreich.org 70 i+ if (opt_lines) { Err bitreich.org 70 i+ draw_lines(count, w.ws_col); Err bitreich.org 70 i+ fprintf(stderr, "\033[%ldA", count); Err bitreich.org 70 i+ } else { Err bitreich.org 70 i+ draw_columns(w.ws_col); Err bitreich.org 70 i+ } Err bitreich.org 70 i Err bitreich.org 70 i- /* go up to the prompt position and update it */ Err bitreich.org 70 i- fprintf(stderr, "\033[%dA", count + 1); Err bitreich.org 70 i draw_prompt(w.ws_col); Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i Err bitreich.org 70 i void Err bitreich.org 70 i-draw_clear(int lines) Err bitreich.org 70 i+draw_clear(size_t lines) Err bitreich.org 70 i { Err bitreich.org 70 i- int i; Err bitreich.org 70 i- Err bitreich.org 70 i- for (i = 0; i < lines + 1; i++) Err bitreich.org 70 i+ for (size_t i = 0; i < lines + 1; i++) Err bitreich.org 70 i fputs("\r\033[K\n", stderr); Err bitreich.org 70 i- fprintf(stderr, "\033[%dA", lines + 1); Err bitreich.org 70 i+ fprintf(stderr, "\033[%ldA", lines + 1); Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i Err bitreich.org 70 i@@ -377,7 +425,6 @@ main(int argc, char *argv[]) Err bitreich.org 70 i { Err bitreich.org 70 i int i, exit_code, tty_fd = open("/dev/tty", O_RDWR); Err bitreich.org 70 i Err bitreich.org 70 i- Err bitreich.org 70 i /* command line arguments */ Err bitreich.org 70 i for (i = 1; i < argc; i++) { Err bitreich.org 70 i if (argv[i][0] != '-' || strlen(argv[i]) != 2) Err bitreich.org 70 .