diff options
| author | Albert Cervin <albert@acervin.com> | 2022-11-26 00:03:10 +0100 |
|---|---|---|
| committer | Albert Cervin <albert@acervin.com> | 2022-11-27 18:21:08 +0100 |
| commit | 78410b18e5d4d117b714eb9f34c689920c32a985 (patch) | |
| tree | 386f792af7dd8deccdb454182f047b63fc5bc2ce /src/keyboard.c | |
| parent | c40a1cfa0f1ecfddac06c7143c2dd974126ddad3 (diff) | |
| download | dged-78410b18e5d4d117b714eb9f34c689920c32a985.tar.gz dged-78410b18e5d4d117b714eb9f34c689920c32a985.tar.xz dged-78410b18e5d4d117b714eb9f34c689920c32a985.zip | |
Implement the reactor
Currently only supports Linux through epoll.
Diffstat (limited to 'src/keyboard.c')
| -rw-r--r-- | src/keyboard.c | 28 |
1 files changed, 23 insertions, 5 deletions
diff --git a/src/keyboard.c b/src/keyboard.c index 2cf9e8c..012ec5a 100644 --- a/src/keyboard.c +++ b/src/keyboard.c @@ -1,11 +1,17 @@ #include "keyboard.h" +#include "reactor.h" +#include <errno.h> #include <string.h> #include <unistd.h> -struct keyboard keyboard_create() { +struct keyboard keyboard_create(struct reactor *reactor) { // TODO: should input term stuff be set here? - return (struct keyboard){}; + return (struct keyboard){ + .reactor_event_id = + reactor_register_interest(reactor, STDIN_FILENO, ReadInterest), + .has_data = false, + }; } void parse_keys(uint8_t *bytes, uint32_t nbytes, struct key *out_keys, @@ -35,15 +41,27 @@ void parse_keys(uint8_t *bytes, uint32_t nbytes, struct key *out_keys, *out_nkeys = nkps; } -struct keyboard_update keyboard_begin_frame(struct keyboard *kbd) { - uint8_t bytes[32] = {0}; - int nbytes = read(STDIN_FILENO, bytes, 32); +struct keyboard_update keyboard_begin_frame(struct keyboard *kbd, + struct reactor *reactor) { struct keyboard_update upd = (struct keyboard_update){.keys = {0}, .nkeys = 0}; + if (!kbd->has_data) { + if (reactor_poll_event(reactor, kbd->reactor_event_id)) { + kbd->has_data = true; + } else { + return upd; + } + } + + uint8_t bytes[32] = {0}; + int nbytes = read(STDIN_FILENO, bytes, 32); + if (nbytes > 0) { parse_keys(bytes, nbytes, upd.keys, &upd.nkeys); + } else if (nbytes == EAGAIN) { + kbd->has_data = false; } return upd; |
