iadded a -t / -b option to set the menu at the top / bottom of the screen - 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 0bf49abb280f7bdbc6e13f12a84a844e119061db /scm/iomenu/commit/0bf49abb280f7bdbc6e13f12a84a844e119061db.gph bitreich.org 70 1parent 1035fe68e4071585215a146fd1d31a914534c89d /scm/iomenu/commit/1035fe68e4071585215a146fd1d31a914534c89d.gph bitreich.org 70 hAuthor: Josuah Demangeonā  ā µ URL:mailto:mail@josuah.net bitreich.org 70 iDate: Fri, 31 Mar 2017 19:24:39 +0200 Err bitreich.org 70 i Err bitreich.org 70 iadded a -t / -b option to set the menu at the top / bottom of the screen Err bitreich.org 70 i Err bitreich.org 70 iDiffstat: Err bitreich.org 70 i M iomenu.1 | 6 ++++++ Err bitreich.org 70 i M iomenu.c | 61 +++++++++++++++++++++---------- Err bitreich.org 70 i Err bitreich.org 70 i2 files changed, 48 insertions(+), 19 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,8 @@ 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 b Err bitreich.org 70 i+.Op Fl t Err bitreich.org 70 i . Err bitreich.org 70 i .Sh DESCRIPTION Err bitreich.org 70 i . Err bitreich.org 70 i@@ -31,6 +33,10 @@ the items are displayed in an horizontal list. Err bitreich.org 70 i 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 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 i .El Err bitreich.org 70 i . Err bitreich.org 70 i .Ss Selection control Err bitreich.org 70 1diff --git a/iomenu.c b/iomenu.c /scm/iomenu/file/iomenu.c.gph bitreich.org 70 i@@ -27,7 +27,7 @@ static int current = 0, offset = 0, prev = 0, next = 0; Err bitreich.org 70 i 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; Err bitreich.org 70 i+static int opt_l = 0, opt_tb = 0; Err bitreich.org 70 i Err bitreich.org 70 i Err bitreich.org 70 i static void Err bitreich.org 70 i@@ -59,18 +59,50 @@ set_terminal(void) Err bitreich.org 70 i { Err bitreich.org 70 i struct termios new; Err bitreich.org 70 i Err bitreich.org 70 i+ /* get window size */ Err bitreich.org 70 i+ if (ioctl(tty_fd, TIOCGWINSZ, &ws) < 0) Err bitreich.org 70 i+ die("ioctl"); Err bitreich.org 70 i+ Err bitreich.org 70 i+ /* save cursor postition */ Err bitreich.org 70 i+ fputws(L"\033[s", stderr); Err bitreich.org 70 i+ Err bitreich.org 70 i+ /* put cursor at the top / bottom */ Err bitreich.org 70 i+ switch (opt_tb) { Err bitreich.org 70 i+ case 't': fputws(L"\033[H", stderr); break; Err bitreich.org 70 i+ case 'b': fwprintf(stderr, L"\033[%dH", ws.ws_row - opt_l); break; Err bitreich.org 70 i+ } Err bitreich.org 70 i+ Err bitreich.org 70 i+ /* save attributes to `termios` */ Err bitreich.org 70 i if (tcgetattr(tty_fd, &termios) < 0 || tcgetattr(tty_fd, &new) < 0) { Err bitreich.org 70 i perror("tcgetattr"); Err bitreich.org 70 i exit(EXIT_FAILURE); Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i+ /* change to raw mode */ Err bitreich.org 70 i new.c_lflag &= ~(ICANON | ECHO | IGNBRK); Err bitreich.org 70 i- Err bitreich.org 70 i tcsetattr(tty_fd, TCSANOW, &new); Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i Err bitreich.org 70 i static void Err bitreich.org 70 i+reset_terminal(void) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ extern struct termios termios; Err bitreich.org 70 i+ extern struct winsize ws; Err bitreich.org 70 i+ Err bitreich.org 70 i+ /* clear terminal */ Err bitreich.org 70 i+ for (int i = 0; i < opt_l + 1; i++) Err bitreich.org 70 i+ fputws(L"\r\033[K\n", stderr); Err bitreich.org 70 i+ Err bitreich.org 70 i+ /* reset cursor position */ Err bitreich.org 70 i+ fputws(L"\033[u", stderr); Err bitreich.org 70 i+ Err bitreich.org 70 i+ /* set terminal back to normal mode */ Err bitreich.org 70 i+ tcsetattr(tty_fd, TCSANOW, &termios); Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+ Err bitreich.org 70 i+static void Err bitreich.org 70 i read_lines(void) Err bitreich.org 70 i { Err bitreich.org 70 i wchar_t buffer[BUFSIZ]; Err bitreich.org 70 i@@ -215,9 +247,6 @@ print_screen(void) Err bitreich.org 70 i { Err bitreich.org 70 i int count; Err bitreich.org 70 i Err bitreich.org 70 i- if (ioctl(tty_fd, TIOCGWINSZ, &ws) < 0) Err bitreich.org 70 i- die("ioctl"); Err bitreich.org 70 i- Err bitreich.org 70 i count = MIN(opt_l, ws.ws_row - 2); Err bitreich.org 70 i Err bitreich.org 70 i fputws(L"\r\033[K", stderr); Err bitreich.org 70 i@@ -239,15 +268,6 @@ print_screen(void) Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i Err bitreich.org 70 i-static void Err bitreich.org 70 i-clear(int lines) Err bitreich.org 70 i-{ Err bitreich.org 70 i- for (int i = 0; i < lines + 1; i++) Err bitreich.org 70 i- fputws(L"\r\033[K\n", stderr); Err bitreich.org 70 i- fwprintf(stderr, L"\033[%dA", lines + 1); Err bitreich.org 70 i-} Err bitreich.org 70 i- Err bitreich.org 70 i- Err bitreich.org 70 i static int Err bitreich.org 70 i match_line(wchar_t *line, wchar_t **tokv, int tokc) Err bitreich.org 70 i { Err bitreich.org 70 i@@ -340,7 +360,6 @@ input_key(void) Err bitreich.org 70 i switch (key) { Err bitreich.org 70 i Err bitreich.org 70 i case CONTROL('C'): Err bitreich.org 70 i- clear(opt_l); Err bitreich.org 70 i return EXIT_FAILURE; Err bitreich.org 70 i Err bitreich.org 70 i case CONTROL('U'): Err bitreich.org 70 i@@ -399,6 +418,7 @@ input_get(void) Err bitreich.org 70 i Err bitreich.org 70 i input[0] = '\0'; Err bitreich.org 70 i Err bitreich.org 70 i+ print_screen(); Err bitreich.org 70 i while ((exit_code = input_key()) == CONTINUE) Err bitreich.org 70 i print_screen(); Err bitreich.org 70 i Err bitreich.org 70 i@@ -431,6 +451,10 @@ main(int argc, char *argv[]) Err bitreich.org 70 i if (++i >= argc || sscanf(argv[i], "%d", &opt_l) <= 0) Err bitreich.org 70 i usage(); Err bitreich.org 70 i break; Err bitreich.org 70 i+ 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 default: Err bitreich.org 70 i usage(); Err bitreich.org 70 i } Err bitreich.org 70 i@@ -442,15 +466,14 @@ main(int argc, char *argv[]) Err bitreich.org 70 i if (!freopen("/dev/tty", "r", stdin) || !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- Err bitreich.org 70 i set_terminal(); Err bitreich.org 70 i Err bitreich.org 70 i- print_screen(); 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- tcsetattr(tty_fd, TCSANOW, &termios); Err bitreich.org 70 i- clear(opt_l); 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 .