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