diff options
-rwxr-xr-x | mkkeymap.sh | 1 | ||||
-rw-r--r-- | stage3/main.c | 41 | ||||
-rw-r--r-- | util/dump2cuddlekeys/Makefile | 2 | ||||
-rw-r--r-- | util/dump2cuddlekeys/main.c | 146 |
4 files changed, 107 insertions, 83 deletions
diff --git a/mkkeymap.sh b/mkkeymap.sh index 953d1fc..65237bf 100755 --- a/mkkeymap.sh +++ b/mkkeymap.sh @@ -3,3 +3,4 @@ set -e make -qC util/dump2cuddlekeys doas loadkeys -C/dev/tty1 "$1" dumpkeys -C/dev/tty1 | util/dump2cuddlekeys/dump2cuddlekeys > "fs/keymap/$1" +echo done 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); } } diff --git a/util/dump2cuddlekeys/Makefile b/util/dump2cuddlekeys/Makefile index 07b7bb2..12ad222 100644 --- a/util/dump2cuddlekeys/Makefile +++ b/util/dump2cuddlekeys/Makefile @@ -4,5 +4,5 @@ dump2cuddlekeys: main.c dumpkeys: dumpkeys -C/dev/tty1 | grep '^keycode' | less -preview: map2cuddlekeys +preview: dump2cuddlekeys dumpkeys -C/dev/tty1 | ./dump2cuddlekeys | hexdump -C diff --git a/util/dump2cuddlekeys/main.c b/util/dump2cuddlekeys/main.c index ec0039e..eafbac3 100644 --- a/util/dump2cuddlekeys/main.c +++ b/util/dump2cuddlekeys/main.c @@ -1,6 +1,76 @@ #include <stdio.h> #include <string.h> #include <stdlib.h> +#include <ctype.h> + +struct { + char c; + const char *name; +} defs[] = { + { '\n', "Return" }, + { ' ', "space" }, + { '\b', "Delete" }, + { '!', "exclam" }, + { '&', "ampersand" }, + { '%', "percent" }, + { '$', "dollar" }, + { '\'', "apostrophe" }, + { '(', "parenleft" }, + { ')', "parenright" }, + { '*', "asterisk" }, + { '+', "plus" }, + { ',', "comma" }, + { '-', "minus" }, + { '.', "period" }, + { '/', "slash" }, + { '0', "zero" }, + { '1', "one" }, + { '2', "two" }, + { '3', "three" }, + { '4', "four" }, + { '5', "five" }, + { '6', "six" }, + { '7', "seven" }, + { '8', "eight" }, + { '9', "nine" }, + { ':', "colon" }, + { ';', "semicolon" }, + { '<', "less" }, + { '=', "equal" }, + { '>', "greater" }, + { '?', "question" }, + { '\n', "linefeed" }, + { '\\', "backslash" }, + { '\t', "Tab" }, + { '@', "at" }, + { '[', "bracketleft" }, + { ']', "bracketright" }, + { '{', "braceleft" }, + { '}', "braceright" }, + { '#', "numbersign" }, + { '^', "asciicircum" }, + { '\0', "nul" }, + { '\xe', "Shift" }, + { '_', "underscore" }, + { '"', "quotedbl" }, + { '~', "asciitilde" }, + { '`', "grave" }, +}; + +static char lookup(char *key) +{ + size_t len = strlen(key); + if (len == 1) + return key[0]; + else if (len == 2 && key[0] == '+') + return key[1]; + else for (size_t i = 0; i < sizeof defs / sizeof *defs; i++) + if (strcmp(defs[i].name, key) == 0) + return defs[i].c; + + fprintf(stderr, "unhandled: %s\n", key); + return '\0'; +} int main() { @@ -11,75 +81,23 @@ int main() ssize_t len; while ((len = getline(&line, &cap, stdin)) != -1) { int code; - char key[len+1]; + char plain[len+1]; + char shift[len+1]; - if (sscanf(line, "keycode %d = %s", &code, key) != 2) + int items = sscanf(line, "keycode %d = %s %s", &code, plain, shift); + if (items < 2 || code >= 127) continue; - char c = '\0'; - - struct { - char c; - const char *name; - } defs[] = { - { '\n', "Return" }, - { ' ', "space" }, - { '\b', "Delete" }, - { '!', "exclam" }, - { '&', "ampersand" }, - { '%', "percent" }, - { '$', "dollar" }, - { '\'', "apostrophe" }, - { '(', "parenleft" }, - { ')', "parenright" }, - { '*', "asterisk" }, - { '+', "plus" }, - { ',', "comma" }, - { '-', "minus" }, - { '.', "period" }, - { '/', "slash" }, - { '0', "zero" }, - { '1', "one" }, - { '2', "two" }, - { '3', "three" }, - { '4', "four" }, - { '5', "five" }, - { '6', "six" }, - { '7', "seven" }, - { '8', "eight" }, - { '9', "nine" }, - { ':', "colon" }, - { ';', "semicolon" }, - { '<', "less" }, - { '=', "equal" }, - { '>', "greater" }, - { '?', "question" }, - { '\n', "linefeed" }, - { '\\', "backslash" }, - { '\t', "Tab" }, - { '@', "at" }, - { '[', "bracketleft" }, - { ']', "bracketright" }, - { '(', "{" }, - { ')', "}" }, - { '#', "numbersign" }, - { '^', "asciicircum" }, - }; + char p = lookup(plain); + char s = items > 2 ? lookup(shift) : '\0'; - if (strlen(key) == 1) - c = key[0]; - else if (strlen(key) == 2 && key[0] == '+') - c = key[1]; - else for (size_t i = 0; i < sizeof defs / sizeof *defs; i++) - if (strcmp(defs[i].name, key) == 0) { - c = defs[i].c; - break; - } + if (p != '\0') { + if (s == '\0') + s = toupper(p); - if (c != '\0') - keymap[(unsigned char) code] = (char) c; - else if (strcmp(key, "nul") != 0) - {} // fprintf(stderr, "unhandled: %s\n", key); + keymap[code*2+0] = p; + keymap[code*2+1] = s; + } } if (line != NULL) |