diff --git a/include/gint/drivers/keydev.h b/include/gint/drivers/keydev.h index 233d78f..9d68017 100644 --- a/include/gint/drivers/keydev.h +++ b/include/gint/drivers/keydev.h @@ -284,8 +284,11 @@ void keydev_set_transform(keydev_t *d, keydev_transform_t tr); @next_us Delay between subsequent repeats (microseconds) */ void keydev_set_standard_repeats(keydev_t *d, int first_us, int next_us); -/* keydev_read(): Retrieve the next transformed event */ -key_event_t keydev_read(keydev_t *d); +/* keydev_read(): Retrieve the next transformed event + If there is no event, returns an event with type KEYEV_NONE, unless + [wait=true], in which case waits for an event to occur or *timeout to + become non-zero (if timeout is not NULL), whichever comes first. */ +key_event_t keydev_read(keydev_t *d, bool wait, volatile int *timeout); #ifdef __cplusplus } diff --git a/src/keysc/getkey.c b/src/keysc/getkey.c index c1a28e4..4912170 100644 --- a/src/keysc/getkey.c +++ b/src/keysc/getkey.c @@ -35,7 +35,7 @@ key_event_t getkey_opt(int opt, volatile int *timeout) while(1) { - e = keydev_read(d); + e = keydev_read(d, true, timeout); if(e.type == KEYEV_NONE && timeout && *timeout) break; /* Skip repeat events that are not enabled by options */ diff --git a/src/keysc/keydev.c b/src/keysc/keydev.c index d797739..05052ba 100644 --- a/src/keysc/keydev.c +++ b/src/keysc/keydev.c @@ -3,6 +3,7 @@ //--- #include +#include #include #include #include @@ -239,7 +240,7 @@ void keydev_set_standard_repeats(keydev_t *d, int first, int next) } /* keydev_read(): Retrieve the next transformed event */ -key_event_t keydev_read(keydev_t *d) +key_event_t keydev_read(keydev_t *d, bool wait, volatile int *timeout) { #define opt(NAME) (d->tr.enabled & KEYDEV_TR_ ## NAME) key_event_t e; @@ -248,7 +249,12 @@ key_event_t keydev_read(keydev_t *d) { e = keydev_unqueue_event(d); if(e.type == KEYEV_NONE) - return e; + { + if(!wait || (timeout && *timeout)) + return e; + sleep(); + continue; + } int k = e.key; e.mod = (opt(ALL_MODS) != 0);