diff options
author | Lizzy Fleckenstein <lizzy@vlhl.dev> | 2023-12-19 03:58:32 +0100 |
---|---|---|
committer | Lizzy Fleckenstein <lizzy@vlhl.dev> | 2023-12-19 03:58:32 +0100 |
commit | 68b40f6327efeff0437d77c487f0175a9d53110a (patch) | |
tree | 94dbe458dea5939802634460de5bcdc4278db9d5 /stage3/main.c | |
parent | 1468a45629b8d36357a0b2f597a33adb9f4f8d17 (diff) | |
download | cuddles-68b40f6327efeff0437d77c487f0175a9d53110a.tar.xz |
implement shift key
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); } } |