From b7b6b6cc74a477a3745d06bce64e284e5b2dd880 Mon Sep 17 00:00:00 2001 From: Bruce Hill Date: Tue, 21 May 2019 22:41:22 -0700 Subject: [PATCH] Added ctrl-z for suspend and added a sort of hybrid mode for running commands at the bottom of the screen instead of in a full terminal mode. --- bb.c | 41 +++++++++++++++++++++++++---------------- config.h | 19 ++++++++++--------- 2 files changed, 35 insertions(+), 25 deletions(-) diff --git a/bb.c b/bb.c index dcee840..27c3461 100644 --- a/bb.c +++ b/bb.c @@ -535,6 +535,12 @@ static void explore(char *path, int print_dir, int print_selection) _exit(1); return; + case KEY_CTRL_Z: + close_term(); + raise(SIGTSTP); + init_term(); + goto redraw; + case 'q': case 'Q': goto done; @@ -807,26 +813,29 @@ static void explore(char *path, int print_dir, int print_selection) default: for (int i = 0; bindings[i].key; i++) { if (key == bindings[i].key) { - if (!(bindings[i].flags & SILENT)) + term_move(0, height-1); + if (!(bindings[i].flags & ONSCREEN)) close_term(); - - int fd; - pid_t child; - child = run_cmd(NULL, &fd, bindings[i].command); - - if (!(bindings[i].flags & NO_FILES)) { - if (state.nselected > 0) { - write_selection(fd, state.firstselected); - } else if (strcmp(state.files[state.cursor]->d_name, "..") != 0) { - write(fd, state.files[state.cursor]->d_name, state.files[state.cursor]->d_namlen); - } + else { + // Show cursor: + writez(termfd, "\e[?25h"); + tcsetattr(termfd, TCSAFLUSH, &orig_termios); + close(termfd); } - close(fd); + int scriptinfd; + pid_t child; + child = run_cmd(NULL, &scriptinfd, bindings[i].command); + if (!(bindings[i].flags & NO_FILES)) { + if (state.nselected > 0) { + write_selection(scriptinfd, state.firstselected); + } else if (strcmp(state.files[state.cursor]->d_name, "..") != 0) { + write(scriptinfd, state.files[state.cursor]->d_name, state.files[state.cursor]->d_namlen); + } + } + close(scriptinfd); waitpid(child, NULL, 0); - - if (!(bindings[i].flags & SILENT)) - init_term(); + init_term(); if (bindings[i].flags & CLEAR_SELECTION) clear_selection(&state); diff --git a/config.h b/config.h index c9b3311..146696d 100644 --- a/config.h +++ b/config.h @@ -9,7 +9,7 @@ #define CD_TO_RESULT (1<<1) #define REFRESH (1<<2) #define CLEAR_SELECTION (1<<3) -#define SILENT (1<<4) +#define ONSCREEN (1<<4) #define DEVNULL " >/dev/null" @@ -17,18 +17,19 @@ struct { int key; const char *command; int flags; - const char *prompt; } bindings[] = { {'?', "less"}, - {'D', "xargs rm -rf" DEVNULL, CLEAR_SELECTION | REFRESH | SILENT}, - {'d', "xargs -I @ sh -c 'rm -rfi @ /dev/tty && head -n1 /dev/tty`\"", ONSCREEN | REFRESH | NO_FILES}, {'|', "sh -c \"`printf '> ' >/dev/tty && head -n1 /dev/tty`\"", REFRESH}, {'>', "sh -c \"`printf '> ' >/dev/tty && head -n1 /dev/tty`\"", NO_FILES | REFRESH}, + {'r', "xargs -I @ -n1 sh -c 'mv \"@\" \"`printf \"\e[1mRename \e[0;33m%%s\e[0m: \" \"@\" >&2 && head -n1 &2 && head -n1