tab int stdin and multiple selection support. - 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 7563651b88d576f9cf06863ab10c9491f9f82d4e
DIR parent 601965c26a8164917e4b817273a5af3c901bc98f
HTML Author: Josuah Demangeonā ā µ <mail@josuah.net>
Date: Sun, 19 Mar 2017 20:53:38 +0100
tab int stdin and multiple selection support.
Diffstat:
M iomenu.c | 48 ++++++++++++++++++++++++++++---
1 file changed, 44 insertions(+), 4 deletions(-)
---
DIR diff --git a/iomenu.c b/iomenu.c
@@ -22,7 +22,7 @@ static struct termios termios;
FILE *tty_fp = NULL;
int tty_fd;
-static char input[BUFSIZ];
+static char input[BUFSIZ], formatted[BUFSIZ * 8];
static int current = 0, offset = 0, prev = 0, next = 0;
static int linec = 0, matchc = 0;
static char **linev = NULL, **matchv = NULL;
@@ -119,12 +119,48 @@ match_line(char *line, char **tokv, int tokc)
}
+int
+screen_width(char *str)
+{
+ int len = 0;
+
+ for (int i = 0; str[i]; i++, len++)
+ if (str[i] == '\t')
+ len += (len + 7) % 8;
+
+ return len;
+}
+
+
+int
+format_string(char *dest, char *src, int cols)
+{
+ int j = 0;
+
+ for (int i = 0; src[i] && j < cols; i++) {
+
+ if (src[i] == '\t') {
+ for (int t = (j + 7) % 8 + 1; t > 0 && j < cols; t--)
+ dest[j++] = ' ';
+ } else {
+ dest[j++] = src[i];
+ }
+ }
+
+ dest[j] = '\0';
+
+ return j;
+}
+
+
static void
print_string(char *str, int current)
{
+ format_string(formatted, str, winsize.ws_col - 2);
+
fputs(current ? "\033[30;47m" : "", stderr);
fputs(opt_lines ? "\033[K " : " ", stderr);
- fprintf(stderr, "%s \033[m", str);
+ fprintf(stderr, "%s \033[m", formatted);
}
@@ -149,7 +185,7 @@ prev_page(int pos, int cols)
{
pos -= pos > 0 ? 1 : 0;
for (int col = 0; pos > 0; pos--)
- if ((col += strlen(matchv[pos]) + 2) > cols)
+ if ((col += screen_width(matchv[pos]) + 2) > cols)
return pos + 1;
return pos;
}
@@ -159,7 +195,7 @@ static int
next_page(int pos, int cols)
{
for (int col = 0; pos < matchc; pos++)
- if ((col += strlen(matchv[pos]) + 2) > cols)
+ if ((col += screen_width(matchv[pos]) + 2) > cols)
return pos;
return pos;
}
@@ -341,6 +377,10 @@ input_key(void)
filter_lines();
break;
+ case CONTROL('Y'):
+ print_selection();
+ break;
+
case CONTROL('J'):
case CONTROL('M'): /* enter */
print_selection();