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/keyboard/sdl-1.2 | |
| parent | 18717569acda82b26099c62410df3b398d596ba1 (diff) | |
| download | rts-9eee43d3bb24000077602a62dfdfeee2606f1589.tar.gz | |
Add support for keyboard and mouse
Diffstat (limited to 'src/keyboard/sdl-1.2')
| -rw-r--r-- | src/keyboard/sdl-1.2/src/keyboard.c | 109 |
1 files changed, 109 insertions, 0 deletions
diff --git a/src/keyboard/sdl-1.2/src/keyboard.c b/src/keyboard/sdl-1.2/src/keyboard.c new file mode 100644 index 0000000..fafa754 --- /dev/null +++ b/src/keyboard/sdl-1.2/src/keyboard.c @@ -0,0 +1,109 @@ +#include <keyboard.h> +#include <keyboard_key.h> +#include <SDL/SDL.h> +#include <stdio.h> + +static void append_key(const enum keyboard_key key, struct keyboard *const k) +{ + struct keyboard_combo *const c = &k->combo; + + for (size_t i = 0; i < sizeof c->keys / sizeof *c->keys; i++) + { + enum keyboard_key *const sel = &c->keys[i]; + + if (*sel == KEYBOARD_KEY_NONE) + { + *sel = key; + break; + } + } +} + +static void remove_key(const enum keyboard_key key, struct keyboard *const k) +{ + struct keyboard_combo *const c = &k->combo; + + for (size_t i = 0; i < sizeof c->keys / sizeof *c->keys; i++) + { + enum keyboard_key *const sel = &c->keys[i]; + + if (*sel == key) + *sel = KEYBOARD_KEY_NONE; + } +} + +static void key_event(const SDL_KeyboardEvent *const ev, + struct keyboard *const k) +{ + static const struct keymap + { + enum keyboard_key key; + SDLKey sdl_key; + } keymap[] = + { + {.key = KEYBOARD_KEY_LEFT, .sdl_key = SDLK_LEFT}, + {.key = KEYBOARD_KEY_RIGHT, .sdl_key = SDLK_RIGHT}, + {.key = KEYBOARD_KEY_UP, .sdl_key = SDLK_UP}, + {.key = KEYBOARD_KEY_DOWN, .sdl_key = SDLK_DOWN}, + {.key = KEYBOARD_KEY_LCTRL, .sdl_key = SDLK_LCTRL}, + {.key = KEYBOARD_KEY_RCTRL, .sdl_key = SDLK_RCTRL}, + {.key = KEYBOARD_KEY_LSHIFT, .sdl_key = SDLK_LSHIFT}, + {.key = KEYBOARD_KEY_RSHIFT, .sdl_key = SDLK_RSHIFT}, + {.key = KEYBOARD_KEY_EXIT, .sdl_key = SDLK_ESCAPE}, + {.key = KEYBOARD_KEY_F11, .sdl_key = SDLK_F11}, + {.key = KEYBOARD_KEY_W, .sdl_key = SDLK_w}, + {.key = KEYBOARD_KEY_A, .sdl_key = SDLK_a}, + {.key = KEYBOARD_KEY_S, .sdl_key = SDLK_s}, + {.key = KEYBOARD_KEY_D, .sdl_key = SDLK_d} + }; + + for (size_t i = 0; i < sizeof keymap / sizeof *keymap; i++) + { + const struct keymap *const km = &keymap[i]; + + if (ev->keysym.sym == km->sdl_key) + { + if (ev->state == SDL_PRESSED) + append_key(km->key, k); + else + remove_key(km->key, k); + } + } +} + +void keyboard_update(struct keyboard *const k) +{ + SDL_Event ev; + int n; + + k->oldcombo = k->combo; + + while ((n = SDL_PeepEvents(&ev, 1, SDL_GETEVENT, + SDL_KEYEVENTMASK | SDL_QUITMASK)) > 0) + { + switch (ev.type) + { + case SDL_KEYDOWN: + /* Fall through. */ + case SDL_KEYUP: + key_event(&ev.key, k); + break; + + case SDL_QUIT: + append_key(KEYBOARD_KEY_EXIT, k); + 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; + } +} |
