add bash/Emacs-like ctrl-key navigation

Also fixes backspace going back to EOL.
This commit is contained in:
Devin J. Pohly 2018-04-16 17:22:18 -05:00
parent 5a01a6e38f
commit 78d2ef00f1
1 changed files with 23 additions and 5 deletions

View File

@ -22,8 +22,7 @@
#include "desktop.h" #include "desktop.h"
#include "ncui.h" #include "ncui.h"
#define KEY_ENTER_ASCII 10 #define KEY_CTRL(c) ((c) & 0x1f)
#define KEY_BACKSPACE_ASCII 127
int main(void) int main(void)
{ {
@ -86,7 +85,8 @@ int main(void)
switch(input_key) switch(input_key)
{ {
case KEY_ENTER_ASCII: case KEY_CTRL('J'): // Enter
case KEY_CTRL('M'): // Return
if(form.active == form.fields[4]) if(form.active == form.fields[4])
{ {
/* checks for buffer errors */ /* checks for buffer errors */
@ -140,16 +140,20 @@ int main(void)
} }
case KEY_DOWN: case KEY_DOWN:
case KEY_CTRL('I'): // Tab
case KEY_CTRL('N'):
form_driver(form.form, REQ_NEXT_FIELD); form_driver(form.form, REQ_NEXT_FIELD);
form_driver(form.form, REQ_END_LINE); form_driver(form.form, REQ_END_LINE);
break; break;
case KEY_UP: case KEY_UP:
case KEY_CTRL('P'):
form_driver(form.form, REQ_PREV_FIELD); form_driver(form.form, REQ_PREV_FIELD);
form_driver(form.form, REQ_END_LINE); form_driver(form.form, REQ_END_LINE);
break; break;
case KEY_RIGHT: case KEY_RIGHT:
case KEY_CTRL('F'):
if(form.active == form.fields[0]) if(form.active == form.fields[0])
{ {
de_id = ((de_id + 1) == de_count) ? 0 : de_id + 1; de_id = ((de_id + 1) == de_count) ? 0 : de_id + 1;
@ -163,6 +167,7 @@ int main(void)
break; break;
case KEY_LEFT: case KEY_LEFT:
case KEY_CTRL('B'):
if(form.active == form.fields[0]) if(form.active == form.fields[0])
{ {
de_id = (de_id == 0) ? (de_count - 1) : de_id - 1; de_id = (de_id == 0) ? (de_count - 1) : de_id - 1;
@ -175,16 +180,29 @@ int main(void)
break; break;
case KEY_BACKSPACE_ASCII:
case KEY_BACKSPACE: case KEY_BACKSPACE:
case KEY_CTRL('H'): // Backspace
form_driver(form.form, REQ_DEL_PREV); form_driver(form.form, REQ_DEL_PREV);
form_driver(form.form, REQ_END_LINE);
break; break;
case KEY_DC: case KEY_DC:
case KEY_CTRL('D'):
form_driver(form.form, REQ_DEL_CHAR); form_driver(form.form, REQ_DEL_CHAR);
break; break;
case KEY_CTRL('C'):
case KEY_CTRL('U'):
form_driver(form.form, REQ_CLR_FIELD);
break;
case KEY_CTRL('A'):
form_driver(form.form, REQ_BEG_LINE);
break;
case KEY_CTRL('E'):
form_driver(form.form, REQ_END_LINE);
break;
case KEY_F(1): case KEY_F(1):
end_form(&form); end_form(&form);
endwin(); endwin();