aboutsummaryrefslogtreecommitdiff
path: root/src/mouse
diff options
context:
space:
mode:
authorXavier Del Campo Romero <xavi.dcr@tutanota.com>2022-02-24 17:55:57 +0100
committerXavier Del Campo Romero <xavi.dcr@tutanota.com>2022-03-30 08:20:21 +0200
commit9eee43d3bb24000077602a62dfdfeee2606f1589 (patch)
tree0e5f8efef62b068e252fe9c98c14fec723e0a7a3 /src/mouse
parent18717569acda82b26099c62410df3b398d596ba1 (diff)
downloadrts-9eee43d3bb24000077602a62dfdfeee2606f1589.tar.gz
Add support for keyboard and mouse
Diffstat (limited to 'src/mouse')
-rw-r--r--src/mouse/CMakeLists.txt13
-rw-r--r--src/mouse/inc/mouse.h32
-rw-r--r--src/mouse/ps1/src/mouse.c9
-rw-r--r--src/mouse/sdl-1.2/src/mouse.c80
-rw-r--r--src/mouse/src/mouse.c14
5 files changed, 148 insertions, 0 deletions
diff --git a/src/mouse/CMakeLists.txt b/src/mouse/CMakeLists.txt
new file mode 100644
index 0000000..b4814f9
--- /dev/null
+++ b/src/mouse/CMakeLists.txt
@@ -0,0 +1,13 @@
+set(src "src/mouse.c")
+set(inc "inc")
+
+if(PS1_BUILD)
+ set(src ${src} "ps1/src/mouse.c")
+elseif(SDL1_2_BUILD)
+ set(src ${src} "sdl-1.2/src/mouse.c")
+ set(deps ${deps} SDL)
+endif()
+
+add_library(mouse ${src})
+target_include_directories(mouse PUBLIC ${inc})
+target_link_libraries(mouse PUBLIC ${deps} PRIVATE ${privdeps})
diff --git a/src/mouse/inc/mouse.h b/src/mouse/inc/mouse.h
new file mode 100644
index 0000000..a4b4044
--- /dev/null
+++ b/src/mouse/inc/mouse.h
@@ -0,0 +1,32 @@
+#ifndef MOUSE_H
+#define MOUSE_H
+
+#include <stdbool.h>
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+enum mouse_button
+{
+ MOUSE_BUTTON_LEFT,
+ MOUSE_BUTTON_RIGHT
+};
+
+struct mouse
+{
+ short x, y;
+ int mask, oldmask;
+};
+
+void mouse_init(struct mouse *m);
+void mouse_update(struct mouse *m);
+bool mouse_justpressed(const struct mouse *m, enum mouse_button b);
+bool mouse_justreleased(const struct mouse *m, enum mouse_button b);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* MOUSE_H */
diff --git a/src/mouse/ps1/src/mouse.c b/src/mouse/ps1/src/mouse.c
new file mode 100644
index 0000000..78ea425
--- /dev/null
+++ b/src/mouse/ps1/src/mouse.c
@@ -0,0 +1,9 @@
+#include <mouse.h>
+
+void mouse_update(struct mouse *const m)
+{
+}
+
+void mouse_init(struct mouse *const m)
+{
+}
diff --git a/src/mouse/sdl-1.2/src/mouse.c b/src/mouse/sdl-1.2/src/mouse.c
new file mode 100644
index 0000000..381ac0e
--- /dev/null
+++ b/src/mouse/sdl-1.2/src/mouse.c
@@ -0,0 +1,80 @@
+#include <mouse.h>
+#include <SDL/SDL.h>
+#include <stdint.h>
+#include <inttypes.h>
+#include <stdio.h>
+#include <string.h>
+
+static void mouse_click(const SDL_MouseButtonEvent *const ev,
+ struct mouse *const m)
+{
+ int mask;
+
+ switch (ev->button)
+ {
+ case 1:
+ mask = 1 << MOUSE_BUTTON_LEFT;
+ break;
+
+ case 3:
+ mask = 1 << MOUSE_BUTTON_RIGHT;
+ break;
+
+ default:
+ return;
+ }
+
+ if (ev->state == SDL_PRESSED)
+ m->mask |= mask;
+ else
+ m->mask &= ~mask;
+}
+
+static void mouse_event(const SDL_MouseMotionEvent *const ev,
+ struct mouse *const m)
+{
+ m->x = ev->x;
+ m->y = ev->y;
+}
+
+void mouse_update(struct mouse *const m)
+{
+ SDL_Event ev;
+ int n;
+
+ m->oldmask = m->mask;
+
+ while ((n = SDL_PeepEvents(&ev, 1, SDL_GETEVENT, SDL_MOUSEMOTIONMASK
+ | SDL_MOUSEBUTTONDOWNMASK | SDL_MOUSEBUTTONUPMASK)) > 0)
+ {
+ switch (ev.type)
+ {
+ case SDL_MOUSEBUTTONDOWN:
+ /* Fall through. */
+ case SDL_MOUSEBUTTONUP:
+ mouse_click(&ev.button, m);
+ break;
+
+ case SDL_MOUSEMOTION:
+ mouse_event(&ev.motion, m);
+ break;
+
+ default:
+ fprintf(stderr, "%s: unexpected SDL_Event %d\n",
+ __func__, ev.type);
+ break;
+ }
+ }
+
+ if (n < 0)
+ {
+ fprintf(stderr, "%s: SDL_PeepEvents: %s\n",
+ __func__, SDL_GetError());
+ return;
+ }
+}
+
+void mouse_init(struct mouse *const m)
+{
+ memset(m, 0, sizeof *m);
+}
diff --git a/src/mouse/src/mouse.c b/src/mouse/src/mouse.c
new file mode 100644
index 0000000..5f5c059
--- /dev/null
+++ b/src/mouse/src/mouse.c
@@ -0,0 +1,14 @@
+#include <mouse.h>
+#include <stdbool.h>
+
+bool mouse_justpressed(const struct mouse *const m,
+ const enum mouse_button b)
+{
+ return m->mask & (1 << b) && !(m->oldmask & (1 << b));
+}
+
+bool mouse_justreleased(const struct mouse *const m,
+ const enum mouse_button b)
+{
+ return !(m->mask & (1 << b)) && m->oldmask & (1 << b);
+}