add: hold down key && core: create get_key to simplify keyboard usage

This commit is contained in:
2024-10-09 22:58:06 +02:00
parent fc8bc6a495
commit 06ade25a46
5 changed files with 54 additions and 48 deletions

View File

@ -75,11 +75,44 @@ void auto_complete(void)
}
}
void shell_init(void)
static char *get_line(void)
{
char *line;
kprintf(PROMPT);
while ((line = get_line())) {
size_t i = 0;
struct key_event ev;
while (1) {
ev = get_key();
// kprintf("%d %d\n", ev.scan_code, ev.c);
if (ev.c == '\n')
break;
char *buf = screen->line;
i = strlen(screen->line);
const size_t size = sizeof(screen->line);
if (ev.scan_code) {
if (ev.scan_code == KEY_BACKSPACE && i) {
buf[--i] = '\0';
move_cursor(LEFT);
terminal_putchar(' ');
move_cursor(LEFT);
} else if (ev.scan_code == KEY_TAB && i) {
auto_complete();
} else if (ev.c && i < size - 1) {
kprintf("%c", ev.c);
buf[i++] = ev.c;
}
if (i >= size)
break;
}
}
kprintf("\n");
screen->line[i] = '\0';
}
void shell_init()
{
while (1) {
kprintf(PROMPT);
get_line();
bool invalid = true;
for (unsigned i = 0; i < NB_CMDS; i++) {
if (!strncmp(cmds[i].name, screen->line,
@ -96,6 +129,5 @@ void shell_init(void)
kprintf(KERN_WARNING "invalid command: %s\n",
screen->line);
memset(screen->line, '\0', sizeof(screen->line));
kprintf(PROMPT);
}
}