mirror of
https://git.planet-casio.com/Lephenixnoir/gint.git
synced 2024-12-29 13:03:36 +01:00
keydev: add low-level filter for async keyboard handlers
This commit is contained in:
parent
48db9bf09d
commit
252bd4eb41
2 changed files with 30 additions and 0 deletions
|
@ -10,6 +10,7 @@ extern "C" {
|
|||
#endif
|
||||
|
||||
#include <gint/keyboard.h>
|
||||
#include <stdbool.h>
|
||||
|
||||
/* Size of the buffer event queue */
|
||||
#define KEYBOARD_QUEUE_SIZE 32
|
||||
|
@ -128,6 +129,9 @@ typedef struct {
|
|||
|
||||
} GPACKEDENUM keydev_transform_t;
|
||||
|
||||
/* keydev_async_filter_t: Low-level asynchronous event filter. */
|
||||
typedef bool (*keydev_async_filter_t)(key_event_t event);
|
||||
|
||||
/* keydev_t: Keyboard device
|
||||
|
||||
This structure represents the state and settings of a keyboard device that
|
||||
|
@ -159,6 +163,13 @@ typedef struct {
|
|||
/* Event transforms */
|
||||
keydev_transform_t tr;
|
||||
|
||||
/* Asynchronous event filter. This is a low-level filter which is
|
||||
called when events are generated to process and filter them. It
|
||||
provides the unique ability to run keyboard-triggered code even if
|
||||
the program's main thread is busy, for instance running some sort of
|
||||
infinite loop. */
|
||||
keydev_async_filter_t async_filter;
|
||||
|
||||
// <Delayed Modifiers>
|
||||
|
||||
/* delayed_* is set when the delayed modifier is active (after a press/
|
||||
|
@ -250,6 +261,12 @@ key_event_t keydev_unqueue_event(keydev_t *d);
|
|||
must be terminated by a 0 keycode. */
|
||||
bool keydev_idle(keydev_t *d, ...);
|
||||
|
||||
/* keydev_async_filter(): Obtain current async filter */
|
||||
keydev_async_filter_t keydev_async_filter(keydev_t const *d);
|
||||
|
||||
/* keydev_set_async_filter(): Set low-level async filter */
|
||||
void keydev_set_async_filter(keydev_t *d, keydev_async_filter_t filter);
|
||||
|
||||
//---
|
||||
// High-level API to read from the device
|
||||
//---
|
||||
|
|
|
@ -31,6 +31,9 @@ static int standard_repeater(GUNUSED int key, GUNUSED int duration, int count)
|
|||
Returns false if the event cannot be pushed. */
|
||||
bool keydev_queue_push(keydev_t *d, key_event_t ev)
|
||||
{
|
||||
if(d->async_filter && !d->async_filter(ev))
|
||||
return true;
|
||||
|
||||
int next = (d->queue_end + 1) % KEYBOARD_QUEUE_SIZE;
|
||||
if(next == d->queue_next)
|
||||
{
|
||||
|
@ -147,6 +150,16 @@ void keydev_tick(keydev_t *d, uint us)
|
|||
}
|
||||
}
|
||||
|
||||
keydev_async_filter_t keydev_async_filter(keydev_t const *d)
|
||||
{
|
||||
return d->async_filter;
|
||||
}
|
||||
|
||||
void keydev_set_async_filter(keydev_t *d, keydev_async_filter_t filter)
|
||||
{
|
||||
d->async_filter = filter;
|
||||
}
|
||||
|
||||
//---
|
||||
// Keyboard event generation
|
||||
//---
|
||||
|
|
Loading…
Reference in a new issue