diff options
Diffstat (limited to 'stage3/main.c')
-rw-r--r-- | stage3/main.c | 41 |
1 files changed, 23 insertions, 18 deletions
diff --git a/stage3/main.c b/stage3/main.c index 8b8654f..9a6f431 100644 --- a/stage3/main.c +++ b/stage3/main.c @@ -27,31 +27,36 @@ void keyboard_handler() str buffer = NILS; usize cap = 0; print(S("$ ")); + bool shift = false; for (;;) { event *e = yield(nil); + u8 code = e->data.scancode; + free(e); - char c = keymap[e->data.scancode]; - if (c != '\0') { - if (c == '\b') { - if (buffer.len > 0) { - print_char(c); - buffer.len--; - } - } else if (c == '\n') { - print_char(c); - shell_run_cmd(buffer); - buffer.len = 0; - print(S("$ ")); - } else { + bool stop = (code & (1 << 7)) != 0; + code &= ~(1 << 7); + + char c = keymap[code*2+shift]; + if (c == '\xe') { + shift = !stop; + } else if (stop) { + } else if (c == '\b') { + if (buffer.len > 0) { print_char(c); - if (buffer.len == cap) - buffer.data = realloc(buffer.data, cap = cap ? cap*2 : 1); - buffer.data[buffer.len++] = c; + buffer.len--; } + } else if (c == '\n') { + print_char(c); + shell_run_cmd(buffer); + buffer.len = 0; + print(S("$ ")); + } else if (c != '\0') { + print_char(c); + if (buffer.len == cap) + buffer.data = realloc(buffer.data, cap = cap ? cap*2 : 1); + buffer.data[buffer.len++] = c; } - - free(e); } } |