summaryrefslogtreecommitdiff
path: root/kernel/input.c
diff options
context:
space:
mode:
authorFreya Murphy <freya@freyacat.org>2025-04-29 12:17:32 -0400
committerFreya Murphy <freya@freyacat.org>2025-04-29 12:17:32 -0400
commit7602ce3b97c893359406655afa515a616084655e (patch)
tree780b17c226f9e110d20c26f920dea6f162bdb4ee /kernel/input.c
parentchange queue structures (diff)
downloadcomus-7602ce3b97c893359406655afa515a616084655e.tar.gz
comus-7602ce3b97c893359406655afa515a616084655e.tar.bz2
comus-7602ce3b97c893359406655afa515a616084655e.zip
input manager
Diffstat (limited to '')
-rw-r--r--kernel/input.c93
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;
+}