Support DEL, HOME, END, INS, shift+TAB

Adds support for these keys in lib/kbd, adds mappings to terminfo,
supports them in the terminal, and adds support for HOME, END and DEL
to the shell.

Closes #71.
This commit is contained in:
Kevin Lange 2015-08-20 10:34:59 -07:00
parent 39c6b86219
commit 0553a0802f
8 changed files with 142 additions and 7 deletions

View File

@ -484,6 +484,11 @@ void key_event(int ret, key_event_t * event) {
if (event->modifiers & KEY_MOD_LEFT_ALT || event->modifiers & KEY_MOD_RIGHT_ALT) {
handle_input('\033');
}
if ((event->modifiers & KEY_MOD_LEFT_SHIFT || event->modifiers & KEY_MOD_RIGHT_SHIFT) &&
event->key == '\t') {
handle_input_s("\033[Z");
return;
}
handle_input(event->key);
} else {
if (event->action == KEY_ACTION_UP) return;
@ -544,6 +549,15 @@ void key_event(int ret, key_event_t * event) {
case KEY_PAGE_DOWN:
handle_input_s("\033[6~");
break;
case KEY_HOME:
handle_input_s("\033OH");
break;
case KEY_END:
handle_input_s("\033OF");
break;
case KEY_DEL:
handle_input_s("\033[3~");
break;
}
}
}

View File

@ -834,6 +834,11 @@ void key_event(int ret, key_event_t * event) {
if (event->modifiers & KEY_MOD_LEFT_ALT || event->modifiers & KEY_MOD_RIGHT_ALT) {
handle_input('\033');
}
if ((event->modifiers & KEY_MOD_LEFT_SHIFT || event->modifiers & KEY_MOD_RIGHT_SHIFT) &&
event->key == '\t') {
handle_input_s("\033[Z");
return;
}
handle_input(event->key);
} else {
if (event->action == KEY_ACTION_UP) return;
@ -918,6 +923,18 @@ void key_event(int ret, key_event_t * event) {
handle_input_s("\033[6~");
}
break;
case KEY_HOME:
handle_input_s("\033OH");
break;
case KEY_END:
handle_input_s("\033OF");
break;
case KEY_DEL:
handle_input_s("\033[3~");
break;
case KEY_INSERT:
handle_input_s("\033[2~");
break;
}
}
}

View File

@ -141,6 +141,21 @@ kbd_key_t kbd_key(key_event_state_t * state, unsigned char c) {
case 0x5b:
state->kbd_state = KBD_ESC_B;
return KEY_NONE;
case 'O':
state->kbd_state = KBD_ESC_O;
return KEY_NONE;
default:
state->kbd_state = KBD_NORMAL;
return c;
}
case KBD_ESC_O:
switch (c) {
case 'H':
state->kbd_state = KBD_NORMAL;
return KEY_HOME;
case 'F':
state->kbd_state = KBD_NORMAL;
return KEY_END;
default:
state->kbd_state = KBD_NORMAL;
return c;
@ -159,10 +174,41 @@ kbd_key_t kbd_key(key_event_state_t * state, unsigned char c) {
case 0x44:
state->kbd_state = KBD_NORMAL;
return KEY_ARROW_LEFT;
case '2':
case '3':
case '4':
case '5':
case '6':
state->kbd_esc_buf = c;
state->kbd_state = KBD_ESC_EXT;
return KEY_NONE;
default:
state->kbd_state = KBD_NORMAL;
return c;
state->kbd_state = KBD_NORMAL;
return c;
}
case KBD_ESC_EXT:
switch (c) {
case '~':
switch (state->kbd_esc_buf) {
case '2':
state->kbd_state = KBD_NORMAL;
return KEY_INSERT;
case '3':
state->kbd_state = KBD_NORMAL;
return KEY_DEL;
case '5':
state->kbd_state = KBD_NORMAL;
return KEY_PAGE_UP;
case '6':
state->kbd_state = KBD_NORMAL;
return KEY_PAGE_DOWN;
default:
return c;
}
default:
return c;
}
default:
return KEY_BAD_STATE;
}
@ -347,18 +393,30 @@ int kbd_scancode(key_event_state_t * state, unsigned char c, key_event_t * event
case 0x4D:
event->keycode = KEY_ARROW_RIGHT;
break;
case 0x50:
event->keycode = KEY_ARROW_DOWN;
break;
case 0x4B:
event->keycode = KEY_ARROW_LEFT;
case 0x47:
event->keycode = KEY_HOME;
break;
case 0x49:
event->keycode = KEY_PAGE_UP;
break;
case 0x4B:
event->keycode = KEY_ARROW_LEFT;
break;
case 0x4F:
event->keycode = KEY_END;
break;
case 0x50:
event->keycode = KEY_ARROW_DOWN;
break;
case 0x51:
event->keycode = KEY_PAGE_DOWN;
break;
case 0x52:
event->keycode = KEY_INSERT;
break;
case 0x53:
event->keycode = KEY_DEL;
break;
default:
break;
}

View File

@ -5,6 +5,8 @@
#define KBD_ESC_A 1
#define KBD_ESC_B 2
#define KBD_FUNC 3
#define KBD_ESC_O 4
#define KBD_ESC_EXT 5
#define KEY_NONE 0
#define KEY_BACKSPACE 8
@ -68,6 +70,11 @@
#define KEY_PAGE_DOWN 2013
#define KEY_PAGE_UP 2014
#define KEY_HOME 2015
#define KEY_END 2016
#define KEY_DEL 2017
#define KEY_INSERT 2018
#define KEY_SCANCODE_F1 0x3b
#define KEY_SCANCODE_F2 0x3c
#define KEY_SCANCODE_F3 0x3d
@ -124,6 +131,8 @@ typedef struct {
int kr_shift;
int kr_alt;
int kr_super;
int kbd_esc_buf;
} key_event_state_t;
kbd_key_t kbd_key(key_event_state_t * state, unsigned char c);

View File

@ -99,6 +99,38 @@ int rline(char * buffer, int buf_size, rline_callbacks_t * callbacks) {
}
}
continue;
case KEY_HOME:
while (context.offset > 0) {
printf("\033[D");
context.offset--;
}
fflush(stdout);
continue;
case KEY_END:
while (context.offset < context.collected) {
printf("\033[C");
context.offset++;
}
fflush(stdout);
continue;
case KEY_DEL:
if (context.collected) {
if (context.offset == context.collected) {
continue;
}
int remaining = context.collected - context.offset;
for (int i = 1; i < remaining; ++i) {
printf("%c", context.buffer[context.offset + i]);
context.buffer[context.offset + i - 1] = context.buffer[context.offset + i];
}
printf(" ");
for (int i = 0; i < remaining; ++i) {
printf("\033[D");
}
context.collected--;
fflush(stdout);
}
continue;
case KEY_BACKSPACE:
if (context.collected) {
if (!context.offset) {

Binary file not shown.

View File

@ -53,6 +53,11 @@ toaru|toaru terminal,
kf10=\E[21~,
kf11=\E[23~,
kf12=\E[24~,
kcbt=\E[Z,
kdch1=\E[3~,
kend=\EOF,
khome=\EOH,
kich1=\E[2~,
toaru-vga|toaru vga terminal,
use=toaru,

Binary file not shown.