half-working horizontal scrolling, with indicators - iomenu - interactive terminal-based selection menu HTML git clone git://bitreich.org/iomenu git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/iomenu DIR Log DIR Files DIR Refs DIR Tags DIR README DIR LICENSE --- DIR commit d445637975d35e90023bcf4c7ebe73367b8b66e3 DIR parent 930de4d46310c943ccc2ee55d2b55e39a6941b50 HTML Author: Josuah Demangeonā ā µ <mail@josuah.net> Date: Sun, 19 Mar 2017 00:07:23 +0100 half-working horizontal scrolling, with indicators Diffstat: M iomenu.c | 49 +++++++++++++------------------ 1 file changed, 21 insertions(+), 28 deletions(-) --- DIR diff --git a/iomenu.c b/iomenu.c @@ -116,6 +116,8 @@ filter_lines(void) char **tokv = NULL, *s, buffer[sizeof (input)]; size_t tokc = 0, n = 0; + current = offset = prev = next = 0; + /* tokenize input from space characters, this comes from dmenu */ strcpy(buffer, input); for (s = strtok(buffer, " "); s; s = strtok(NULL, " "), tokc++) { @@ -139,27 +141,13 @@ filter_lines(void) } -size_t -print_string(char *str, size_t cols, int current) +void +print_string(char *str, int current) { - size_t col = 1; - - if (col >= cols) - return 0; - fputs(current ? "\033[30;47m" : "", stderr); fputs(opt_lines ? "\033[K " : " ", stderr); - - fputs(str, stderr); - - if (col < cols) { - fputc(' ', stderr); - col++; - } - - fputs("\033[m", stderr); - - return col; + fprintf(stderr, "%s \033[m", str); + fputs(" \033[m", stderr); } @@ -171,7 +159,7 @@ print_lines(size_t count, size_t cols) for (size_t i = offset; p < count && i < matchc; p++, i++) { fputc('\n', stderr); - print_string(matchv[i], cols, i == current); + print_string(matchv[i], i == current); } while (p++ <= count) @@ -191,6 +179,8 @@ update_pages(size_t pos, size_t cols) for (next = pos, col = 0; next < matchc; next++) if ((col += strlen(matchv[next]) + 2) > cols) break; + + next--; } @@ -199,15 +189,19 @@ print_columns(size_t cols) { if (current < offset) { offset = prev; - update_pages(prev, cols - 30); + update_pages(offset, cols - 30 - 1); } else if (current >= next) { offset = next; - update_pages(current, cols - 30); + update_pages(offset, cols - 30 - 1); } for (size_t i = offset; i < next && i < matchc; i++) - print_string(matchv[i], cols - 30, i == current); + print_string(matchv[i], i == current); + + + if (next < matchc) + fprintf(stderr, "\033[%ldC>", cols); } @@ -217,9 +211,11 @@ print_prompt(size_t cols) size_t limit = opt_lines ? cols : 30; fputc('\r', stderr); - for (size_t i = 0; i < limit; i++) + for (size_t i = 0; i < limit - 2; i++) fputc(' ', stderr); + fputs(offset > 0 ? "< " : " ", stderr); + fprintf(stderr, "\r%s %s", opt_prompt, input); } @@ -269,6 +265,8 @@ remove_word_input() len = strlen(input) - 1; for (int i = len; i >= 0 && !isspace(input[i]); i--) input[i] = '\0'; + + filter_lines(); } @@ -283,8 +281,6 @@ add_character(char key) } filter_lines(); - - current = 0; } @@ -320,20 +316,17 @@ input_key(FILE *tty_fp) case CONTROL('U'): input[0] = '\0'; - current = 0; filter_lines(); break; case CONTROL('W'): remove_word_input(); - filter_lines(); break; case 127: case CONTROL('H'): /* backspace */ input[strlen(input) - 1] = '\0'; filter_lines(); - current = 0; break; case CONTROL('N'):