diff --git a/src/userland/hid/usagePages/keyboard.c b/src/userland/hid/usagePages/keyboard.c index b5aef93..8a2b1ca 100644 --- a/src/userland/hid/usagePages/keyboard.c +++ b/src/userland/hid/usagePages/keyboard.c @@ -11,16 +11,16 @@ }; REQUEST(keyDown, "keyboard", "keyDown"); -REQUEST(keyUp, "keyboard", "keyDown"); +REQUEST(keyUp, "keyboard", "keyUp"); void handleKeyboard(uint32_t usage, int32_t data) { - if (!usage || !data) { - // todo: handle letting go of keys - return; - } if (usage >= sizeof(keycodes) / sizeof(char)) { printf("keyboard: unknown keycode %i\n", usage); } else if (keycodes[usage]) { - keyDown(keycodes[usage], 0); + if (data) { + keyDown(keycodes[usage], 0); + } else { + keyUp(keycodes[usage], 0); + } } } diff --git a/src/userland/hid/usagePages/keyboard.c b/src/userland/hid/usagePages/keyboard.c index b5aef93..8a2b1ca 100644 --- a/src/userland/hid/usagePages/keyboard.c +++ b/src/userland/hid/usagePages/keyboard.c @@ -11,16 +11,16 @@ }; REQUEST(keyDown, "keyboard", "keyDown"); -REQUEST(keyUp, "keyboard", "keyDown"); +REQUEST(keyUp, "keyboard", "keyUp"); void handleKeyboard(uint32_t usage, int32_t data) { - if (!usage || !data) { - // todo: handle letting go of keys - return; - } if (usage >= sizeof(keycodes) / sizeof(char)) { printf("keyboard: unknown keycode %i\n", usage); } else if (keycodes[usage]) { - keyDown(keycodes[usage], 0); + if (data) { + keyDown(keycodes[usage], 0); + } else { + keyUp(keycodes[usage], 0); + } } } diff --git a/src/userland/keyboard/main.c b/src/userland/keyboard/main.c index 1440ba1..4db5f40 100644 --- a/src/userland/keyboard/main.c +++ b/src/userland/keyboard/main.c @@ -18,6 +18,7 @@ // will be incremented every time a key is pressed. volatile uint32_t repeatingThreadId = 0; +char repeatingKey = 0; char pressedKeys[] = { 0 }; @@ -30,10 +31,24 @@ } void keyUp(char keycode) { + // 'normal' keyboards additionaly restart the key repeat for the key that was pressed before a key was let go of + if (keycode == repeatingKey) { + repeatingThreadId++; + } +} + +void keyRepeat(char keycode, uint32_t threadId) { + sleep(500); + while (threadId == repeatingThreadId) { + doKeyCallback(keycode, 0); + sleep(50); + } } void keyDown(char keycode) { doKeyCallback(keycode, 0); + repeatingKey = keycode; + fork((void *)keyRepeat, PTR(keycode), PTR(++repeatingThreadId), 0); } void initialize() {