diff options
| author | Xavier Del Campo Romero <xavi.dcr@tutanota.com> | 2022-02-24 17:55:57 +0100 |
|---|---|---|
| committer | Xavier Del Campo Romero <xavi.dcr@tutanota.com> | 2022-03-30 08:20:21 +0200 |
| commit | 9eee43d3bb24000077602a62dfdfeee2606f1589 (patch) | |
| tree | 0e5f8efef62b068e252fe9c98c14fec723e0a7a3 /src/mouse | |
| parent | 18717569acda82b26099c62410df3b398d596ba1 (diff) | |
| download | rts-9eee43d3bb24000077602a62dfdfeee2606f1589.tar.gz | |
Add support for keyboard and mouse
Diffstat (limited to 'src/mouse')
| -rw-r--r-- | src/mouse/CMakeLists.txt | 13 | ||||
| -rw-r--r-- | src/mouse/inc/mouse.h | 32 | ||||
| -rw-r--r-- | src/mouse/ps1/src/mouse.c | 9 | ||||
| -rw-r--r-- | src/mouse/sdl-1.2/src/mouse.c | 80 | ||||
| -rw-r--r-- | src/mouse/src/mouse.c | 14 |
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); +} |
