summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xmkkeymap.sh1
-rw-r--r--stage3/main.c41
-rw-r--r--util/dump2cuddlekeys/Makefile2
-rw-r--r--util/dump2cuddlekeys/main.c146
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)