static void keycode_run() { for (;;) { halt(); key_t key; bool avail; while ((avail = kb_getkey(&key)) != false) { if (key.ch) { tty_printf( TTY_CONSOLE, "Keycode: \033[%c]%02x\033[-] meta=%02x '%c'\n", key.brk == KEYBRK_UP ? 'e' : '2', key.code, key.meta, key.ch); } else { tty_printf( TTY_CONSOLE, "Keycode: \033[%c]%02x\033[-] meta=%02x\n", key.brk == KEYBRK_UP ? 'e' : '2', key.code, key.meta); } if ((key.brk == KEYBRK_UP) && (key.meta & META_ALT) && (key.code == KEY_TAB)) { switch_mode(&mode_command); return; } } } }
static void command_run() { char cmd[256]; int cmdlen = 0; for (;;) { halt(); key_t key; bool avail; while ((avail = kb_getkey(&key)) != false) { // If a printable character was typed, append it to the command. if (key.ch >= 32 && key.ch < 127) { if (cmdlen < arrsize(cmd) - 1) { cmd[cmdlen] = key.ch; tty_printc(TTY_CONSOLE, cmd[cmdlen]); cmdlen++; } } // Handle special keys (like enter, backspace). else if (key.brk == KEYBRK_DOWN) { if (key.code == KEY_ENTER) { tty_printc(TTY_CONSOLE, '\n'); // Strip trailing whitespace. while (cmdlen > 0 && cmd[cmdlen - 1] == ' ') cmdlen--; cmd[cmdlen] = 0; // Execute the command. bool cont = command_exec(cmd); cmdlen = 0; if (cont) command_prompt(); else return; } else if (key.code == KEY_BACKSPACE && cmdlen > 0) { tty_printc(TTY_CONSOLE, '\b'); cmdlen--; } } } } }
void kb_wait(void) { int key; while((key = kb_getkey()) == -1) { /* put the processor to sleep while waiting for keypresses, but first * make sure interrupts are enabled, or we'll sleep forever */ __asm { sti hlt } } kb_putback(key); }