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:
parent
39c6b86219
commit
0553a0802f
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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);
|
||||
|
@ -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.
@ -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,
|
||||
|
BIN
util/toaru.tic
BIN
util/toaru.tic
Binary file not shown.
Loading…
x
Reference in New Issue
Block a user