iomenu

interactive text selection menu
Log | Files | Refs | README | LICENSE

commit 8850bebc9c87d3331bcfcf6139f05821c6f1237e
parent 0502e73cca4f319ac484f66983cf6d40bdf843da
Author: Josuah Demangeon <mail@josuah.net>
Date:   Mon, 30 Oct 2017 00:41:32 +0100

removed the segment feature all over again

Diffstat:
Mcontrol.c | 59+++++------------------------------------------------------
Mdisplay.c | 70+++++++++++++++++++++++++---------------------------------------------
Miomenu.1 | 5+----
Mmain.c | 2+-
4 files changed, 32 insertions(+), 104 deletions(-)

diff --git a/control.c b/control.c @@ -15,45 +15,6 @@ #define ALT(char) ((char) + 0x80) #define CSI(char) ((char) + 0x80 + 0x80) -static size_t -width(char *s) -{ - int width = 0; - - while (*s) { - if (*s++ == '\t') - width += 8 - (width % 8); - else - width++; - } - - return width; -} - -int -prev_page(int pos) -{ - int col; - int cols = ws.ws_col - MARGIN - 4; - - pos -= pos > 0 ? 1 : 0; - for (col = 0; pos > 0; pos--) - if ((col += width(matchv[pos]) + 2) > cols) - return pos + 1; - return pos; -} - -int -next_page(int pos) -{ - int col, cols = ws.ws_col - MARGIN - 4; - - for (col = 0; pos < matchc; pos++) - if ((col += width(matchv[pos]) + 2) > cols) - return pos; - return pos; -} - void move(signed int sign) { @@ -72,21 +33,11 @@ move_page(signed int sign) { int i; - if (opt['l'] <= 0) { - if (sign > 0) { - offset = current = next; - next = next_page(next); - } else if (sign < 0) { - next = offset; - offset = current = prev_page(offset); - } - } else { - i = current - current % rows + rows * sign; - if (!(0 < i && i < matchc)) - return; - current = i - 1; - move(+1); - } + i = current - current % rows + rows * sign; + if (!(0 < i && i < matchc)) + return; + current = i - 1; + move(+1); } static void diff --git a/display.c b/display.c @@ -40,60 +40,40 @@ format(char *str, int cols) } static void -print_lines(void) +print_line(char *line, int cur) { - int printed = 0, i = current - current % rows; - - for (; printed < rows && i < matchc; i++, printed++) { - fprintf(stderr, - opt['#'] && matchv[i][0] == '#' ? - "\n\x1b[1m\x1b[K %s\x1b[m" : - i == current ? - "\n\x1b[47;30m\x1b[K %s\x1b[m" : - "\n\x1b[K %s", - format(matchv[i], ws.ws_col - 1) - ); + if (opt['#'] && line[0] == '#') { + format(line + 1, ws.ws_col - 1); + fprintf(stderr, "\n\x1b[1m\x1b[K %s\x1b[m", formatted); + } else if (cur) { + format(line, ws.ws_col - 1); + fprintf(stderr, "\n\x1b[47;30m\x1b[K %s\x1b[m", formatted); + } else { + format(line, ws.ws_col - 1); + fprintf(stderr, "\n\x1b[K %s", formatted); } - while (printed++ < rows) - fputs("\n\x1b[K", stderr); - fprintf(stderr, "\x1b[%dA\r\x1b[K", rows); -} - -static void -print_segments(void) -{ - int i; - - if (current < offset) { - next = offset; - offset = prev_page(offset); - } else if (current >= next) { - offset = next; - next = next_page(offset); - } - fprintf(stderr, "\r\x1b[K\x1b[%dC", MARGIN); - fputs(offset > 0 ? "< " : " ", stderr); - for (i = offset; i < next && i < matchc; i++) { - fprintf(stderr, - opt['#'] && matchv[i][0] == '#' ? "\x1b[1m %s \x1b[m" : - i == current ? "\x1b[7m %s \x1b[m" : " %s ", - format(matchv[i], ws.ws_col - 1) - ); - } - if (next < matchc) - fprintf(stderr, "\x1b[%dC\b>", ws.ws_col - MARGIN); - fputc('\r', stderr); } void print_screen(void) { + char **m; + int p; + int i; int cols = ws.ws_col - 1; - if (opt['l'] > 0) - print_lines(); - else - print_segments(); + p = 0; + i = current - current % rows; + m = matchv + i; + while (p < rows && i < matchc) { + print_line(*m, i == current); + p++, i++, m++; + } + while (p < rows) { + fputs("\n\x1b[K", stderr); + p++; + } + fprintf(stderr, "\x1b[%dA\r\x1b[K", rows); if (*prompt) { format(prompt, cols - 2); fprintf(stderr, "\x1b[30;47m %s \x1b[m", formatted); diff --git a/iomenu.1 b/iomenu.1 @@ -35,10 +35,7 @@ The selected line is printed to standard output. .It Fl l Ar lines If .Ar lines -is 0, the items are displayed in an horizontal list; -otherwise, in a vertical list of at most -.Ar lines -lines. +Total amount of lines to display on the screen. . .It Fl p Ar prompt Set the prompt to display at the beginning of the input to diff --git a/main.c b/main.c @@ -103,7 +103,7 @@ parse_opt(int argc, char *argv[]) usage(); switch ((*argv)[1]) { case 'l': - if (!--argc || sscanf(*++argv, "%d", &opt['l']) <= 0) + if (!--argc || (opt['l'] = atoi(*++argv)) <= 0) usage(); break; case 'p':