summaryrefslogtreecommitdiff
path: root/kernel/input.c
diff options
context:
space:
mode:
authorGalen Sagarin <gps5307@rit.edu>2025-04-29 14:18:40 -0400
committerGalen Sagarin <gps5307@rit.edu>2025-04-29 14:18:40 -0400
commitae2cdd83ba4a0cae161db0b29031d5591005fa34 (patch)
tree82fbdfcbb1fe4e3b5e232db195c8c331d69489fd /kernel/input.c
parentStarted writing fat.c (diff)
parentfs header changes (diff)
downloadcomus-ae2cdd83ba4a0cae161db0b29031d5591005fa34.tar.gz
comus-ae2cdd83ba4a0cae161db0b29031d5591005fa34.tar.bz2
comus-ae2cdd83ba4a0cae161db0b29031d5591005fa34.zip
Merge branch 'main' of https://github.com/kenshineto/kern into fat32
Merging main into here
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;
+}