display a prompt with the -p option - 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 5fa48204850bed279e339eb370d2d595e297c274
DIR parent 0bf49abb280f7bdbc6e13f12a84a844e119061db
HTML Author: Josuah Demangeonā ā µ <mail@josuah.net>
Date: Sat, 1 Apr 2017 11:23:02 +0200
display a prompt with the -p option
Diffstat:
M iomenu.1 | 5 +++++
M iomenu.c | 67 +++++++++++++++++++++----------
2 files changed, 51 insertions(+), 21 deletions(-)
---
DIR diff --git a/iomenu.1 b/iomenu.1
@@ -11,6 +11,7 @@
.
.Nm
.Op Fl l Ar lines
+.Op Fl p Ar prompt
.Op Fl b
.Op Fl t
.
@@ -34,6 +35,10 @@ Otherwise, in a vertical list of at most
.Ar lines
lines.
.
+.It Fl p Ar prompt
+Set the prompt to display at the beginning of the input to
+.Ar prompt .
+.
.It Fl t / Fl b
Print the menu at the top / bottom rather than at current cursor position.
Reset the cursor postition afterward.
DIR diff --git a/iomenu.c b/iomenu.c
@@ -11,8 +11,8 @@
#include <sys/ioctl.h>
-#define OFFSET 30 /* in horizontal mode, amount of space kept for writing */
-#define CONTINUE 2 /* as opposed to EXIT_SUCCESS and EXIT_FAILURE */
+#define OFFSET 30 /* in horizontal mode, amount of space kept for writing */
+#define CONTINUE 2 /* as opposed to EXIT_SUCCESS and EXIT_FAILURE */
#define CONTROL(char) (char ^ 0x40)
#define MIN(X, Y) (((X) < (Y)) ? (X) : (Y))
@@ -28,6 +28,7 @@ static int linec = 0, matchc = 0;
static wchar_t **linev = NULL, **matchv = NULL;
static wchar_t input[BUFSIZ], formatted[BUFSIZ * 8];
static int opt_l = 0, opt_tb = 0;
+static wchar_t opt_p[BUFSIZ];
static void
@@ -140,7 +141,7 @@ read_lines(void)
static int
-screen_width(wchar_t *wcs)
+string_width(wchar_t *wcs)
{
int len = 0;
@@ -152,6 +153,9 @@ screen_width(wchar_t *wcs)
}
+/*
+ * Prepare a string for printing.
+ */
static wchar_t *
format(wchar_t *wcs, int cols)
{
@@ -204,7 +208,7 @@ prev_page(int pos, int cols)
{
pos -= pos > 0 ? 1 : 0;
for (int col = 0; pos > 0; pos--)
- if ((col += screen_width(matchv[pos]) + 2) > cols)
+ if ((col += string_width(matchv[pos]) + 2) > cols)
return pos + 1;
return pos;
}
@@ -214,7 +218,7 @@ static int
next_page(int pos, int cols)
{
for (int col = 0; pos < matchc; pos++)
- if ((col += screen_width(matchv[pos]) + 2) > cols)
+ if ((col += string_width(matchv[pos]) + 2) > cols)
return pos;
return pos;
}
@@ -245,23 +249,39 @@ print_columns(void)
static void
print_screen(void)
{
- int count;
+ extern wchar_t formatted[BUFSIZ * 8];
- count = MIN(opt_l, ws.ws_row - 2);
+ int cols = opt_l || matchc == 0 ? ws.ws_col : OFFSET - 3;
fputws(L"\r\033[K", stderr);
+ /* items */
if (opt_l) {
+ int count = MIN(opt_l, ws.ws_row - 2);
print_lines(count);
fwprintf(stderr, L"\033[%dA", count + 1);
-
} else {
- fputws(L"\033[30C", stderr);
+ fwprintf(stderr, L"\033[%dC", OFFSET);
print_columns();
}
- format(input, opt_l || matchc == 0 ? ws.ws_col : OFFSET - 3);
- fputws(L"\r ", stderr);
+ fputws(L"\r", stderr);
+
+ /* prompt */
+ if (opt_p[0] != '\0') {
+ format(opt_p, cols);
+ fputws(L"\033[30;47m ", stderr);
+ for (int i = 0; formatted[i]; i++)
+ fputwc(formatted[i], stderr);
+ fputws(L" \033[m", stderr);
+ cols -= wcslen(formatted) + 3;
+ }
+
+ fputwc(L' ', stderr);
+
+ /* input */
+ cols = (opt_l || matchc == 0 ? cols : MAX(OFFSET, cols) - 3);
+ format(input, cols);
fputws(formatted, stderr);
fflush(stderr);
@@ -349,9 +369,6 @@ print_selection(void)
}
-/*
- * Perform action associated with key
- */
static int
input_key(void)
{
@@ -431,7 +448,7 @@ input_get(void)
static void
usage(void)
{
- fputws(L"usage: iomenu [-l lines]\n", stderr);
+ fputws(L"usage: iomenu [-b] [-t] [-l lines] [-p prompt]\n", stderr);
exit(EXIT_FAILURE);
}
@@ -440,8 +457,12 @@ usage(void)
int
main(int argc, char *argv[])
{
+ extern wchar_t opt_p[BUFSIZ];
+
int exit_code;
+ opt_p[0] = '\0';
+
for (int i = 1; i < argc; i++) {
if (argv[i][0] != '-' || strlen(argv[i]) != 2)
usage();
@@ -455,6 +476,12 @@ main(int argc, char *argv[])
case 't': opt_tb = 't'; break;
case 'b': opt_tb = 'b'; break;
+ case 'p':
+ if (++i >= argc)
+ usage();
+ mbstowcs(opt_p, argv[i], BUFSIZ);
+ break;
+
default:
usage();
}
@@ -463,17 +490,15 @@ main(int argc, char *argv[])
setlocale(LC_ALL, "");
read_lines();
- if (!freopen("/dev/tty", "r", stdin) || !freopen("/dev/tty", "w", stderr))
+ if (!freopen("/dev/tty", "r", stdin) ||
+ !freopen("/dev/tty", "w", stderr))
die("freopen");
tty_fd = open("/dev/tty", O_RDWR);
- set_terminal();
-
- /* main loop */
- exit_code = input_get();
+ set_terminal();
+ exit_code = input_get(); /* main loop */
reset_terminal();
close(tty_fd);
-
free_all();
return exit_code;