diff options
author | lvgx <l@vgx.fr> | 2020-05-13 07:06:59 +0200 |
---|---|---|
committer | Arun Prakash Jana <engineerarun@gmail.com> | 2020-05-13 12:29:47 +0530 |
commit | 2200a1c9be7c63dd6b2c1abc7f6324a9c79f2fe5 (patch) | |
tree | 60078d485b61901bea13a605fff7828be3e9e38d /src/nnn.c | |
parent | 770bb47dafd250c16c9c9850e641c3dc309fc45f (diff) | |
download | nnn-2200a1c9be7c63dd6b2c1abc7f6324a9c79f2fe5.tar.gz |
Allow launching plugins with Alt + plugin's key (#569)
* Allow launching plugins with Alt + plugin's key
* Fix Alt key in filter/prompts modes
* Fix handling Alt key in nextsel()
In filter mode: run the associated plugin.
In prompt mode: just throw out the Alt+key input.
In nextsel(): differentiate Alt+key and Esc
Diffstat (limited to 'src/nnn.c')
-rw-r--r-- | src/nnn.c | 37 |
1 files changed, 34 insertions, 3 deletions
@@ -2284,6 +2284,18 @@ static int reventrycmp(const void *va, const void *vb) static int (*entrycmpfn)(const void *va, const void *vb) = &entrycmp; +/* In case of an error, resets *wch to Esc */ +static int handle_alt_key(wint_t *wch) +{ + timeout(0); + int r = get_wch(wch); + if (r == ERR) + *wch = 27; + cleartimeout(); + + return r; +} + /* * Returns SEL_* if key is bound and 0 otherwise. * Also modifies the run and env pointers (used on SEL_{RUN,RUNARG}). @@ -2311,6 +2323,18 @@ static int nextsel(int presel) //DPRINTF_D(c); //DPRINTF_S(keyname(c)); + /* Handle Alt+key */ + if (c == 27) { + timeout(0); + c = getch(); + if (c != ERR) { + ungetch(c); + c = CONTROL('S'); + } else + c = 27; + settimeout(); + } + if (c == ERR && presel == MSGWAIT) c = (cfg.filtermode || filterset()) ? FILTER : CONTROL('L'); else if (c == FILTER || c == CONTROL('L')) @@ -2564,7 +2588,11 @@ static int filterentries(char *path, char *lastname) #ifndef NOMOUSE case KEY_MOUSE: // fallthrough #endif - case 27: /* Exit filter mode on Escape */ + case 27: /* Exit filter mode on Escape and Alt+key */ + if (handle_alt_key(ch) != ERR) { + unget_wch(*ch); + *ch = CONTROL('S'); + } goto end; } @@ -2776,7 +2804,10 @@ static char *xreadline(const char *prefill, const char *prompt) len -= pos; pos = 0; continue; - case 27: /* Exit prompt on Escape */ + case 27: /* Exit prompt on Escape, but just filter out Alt+key */ + if (handle_alt_key(ch) != ERR) + continue; + len = 0; goto END; } @@ -4097,7 +4128,7 @@ static void show_help(const char *path) "9x ^X Delete%-18cE Edit sel\n" "c* Toggle exe%-14c> Export list\n" "1MISC\n" - "9; ^S Select plugin%-11c= Launch app\n" + "5Alt ; ^S Select plugin%-11c= Launch app\n" "9! ^] Shell%-19c] Cmd prompt\n" "cc Connect remote%-10cu Unmount\n" "9t ^T Sort toggles%-12cs Manage session\n" |