diff options
author | Freya Murphy <freya@freyacat.org> | 2025-04-29 12:17:32 -0400 |
---|---|---|
committer | Freya Murphy <freya@freyacat.org> | 2025-04-29 12:17:32 -0400 |
commit | 7602ce3b97c893359406655afa515a616084655e (patch) | |
tree | 780b17c226f9e110d20c26f920dea6f162bdb4ee /kernel/input.c | |
parent | change queue structures (diff) | |
download | comus-7602ce3b97c893359406655afa515a616084655e.tar.gz comus-7602ce3b97c893359406655afa515a616084655e.tar.bz2 comus-7602ce3b97c893359406655afa515a616084655e.zip |
input manager
Diffstat (limited to '')
-rw-r--r-- | kernel/input.c | 93 |
1 files changed, 93 insertions, 0 deletions
diff --git a/kernel/input.c b/kernel/input.c new file mode 100644 index 0000000..2073950 --- /dev/null +++ b/kernel/input.c @@ -0,0 +1,93 @@ +#include <comus/input.h> + +struct mouse_event_buf { + struct mouse_event data[N_MOUSEEV]; + size_t start; + size_t end; + size_t len; +}; + +struct keycode_buf { + struct keycode data[N_KEYCODE]; + size_t start; + size_t end; + size_t len; +}; + +static struct keycode_buf keycode_buffer = { + .start = 0, + .end = 0, + .len = 0, +}; + +static struct mouse_event_buf mouse_event_buffer = { + .start = 0, + .end = 0, + .len = 0, +}; + +void keycode_push(struct keycode *ev) +{ + // save keycode + keycode_buffer.data[keycode_buffer.end] = *ev; + + // update pointers + keycode_buffer.end++; + keycode_buffer.end %= N_KEYCODE; + if (keycode_buffer.len < N_KEYCODE) { + keycode_buffer.len++; + } else { + keycode_buffer.start++; + keycode_buffer.start %= N_KEYCODE; + } +} + +int keycode_pop(struct keycode *ev) +{ + if (keycode_buffer.len < 1) + return 1; + + *ev = keycode_buffer.data[keycode_buffer.start]; + keycode_buffer.len--; + keycode_buffer.start++; + keycode_buffer.start %= N_KEYCODE; + return 0; +} + +size_t keycode_len(void) +{ + return keycode_buffer.len; +} + +void mouse_event_push(struct mouse_event *ev) +{ + // save mouse_event + mouse_event_buffer.data[mouse_event_buffer.end] = *ev; + + // update pointers + mouse_event_buffer.end++; + mouse_event_buffer.end %= N_KEYCODE; + if (mouse_event_buffer.len < N_KEYCODE) { + mouse_event_buffer.len++; + } else { + mouse_event_buffer.start++; + mouse_event_buffer.start %= N_KEYCODE; + } +} + +int mouse_event_pop(struct mouse_event *ev) +{ + if (mouse_event_buffer.len < 1) + return 1; + + *ev = mouse_event_buffer.data[mouse_event_buffer.start]; + mouse_event_buffer.len--; + mouse_event_buffer.start++; + mouse_event_buffer.start %= N_KEYCODE; + return 0; +} + +size_t mouse_event_len(void) +{ + return mouse_event_buffer.len; +} |