aboutsummaryrefslogtreecommitdiff
path: root/src/sdl/action.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/sdl/action.c')
-rw-r--r--src/sdl/action.c63
1 files changed, 63 insertions, 0 deletions
diff --git a/src/sdl/action.c b/src/sdl/action.c
new file mode 100644
index 0000000..a4dcb79
--- /dev/null
+++ b/src/sdl/action.c
@@ -0,0 +1,63 @@
+#include "../libsok/sok.h"
+#include "action.h"
+
+#define CASE_DIGIT \
+ case SDLK_0: \
+ case SDLK_1: \
+ case SDLK_2: \
+ case SDLK_3: \
+ case SDLK_4: \
+ case SDLK_5: \
+ case SDLK_6: \
+ case SDLK_7: \
+ case SDLK_8: \
+ case SDLK_9:
+
+static const sok_dir_t
+keycode_to_dir(const SDL_Keycode code) {
+ switch (code) {
+ case SDLK_UP: return SOK_DIR_UP;
+ case SDLK_LEFT: return SOK_DIR_LEFT;
+ case SDLK_DOWN: return SOK_DIR_DOWN;
+ case SDLK_RIGHT: return SOK_DIR_RIGHT;
+ default: return SOK_DIR_LAST;
+ }
+}
+
+action_t
+get_action(
+ const SDL_Keycode code
+) {
+ switch (code) {
+ case SDLK_ESCAPE:
+ case SDLK_q:
+ return (action_t) { .type = ACTION_QUIT };
+ case SDLK_UP:
+ case SDLK_DOWN:
+ case SDLK_LEFT:
+ case SDLK_RIGHT:
+ return (action_t) {
+ .type = ACTION_MOVE,
+ .data = keycode_to_dir(code)
+ };
+ case SDLK_u:
+ return (action_t) { .type = ACTION_UNDO };
+ case SDLK_n:
+ return (action_t) { .type = ACTION_NEXT };
+ CASE_DIGIT
+ return (action_t) {
+ .type = ACTION_WARP_BUF_PUSH,
+ .data = (code - SDLK_0),
+ };
+ case SDLK_DELETE:
+ return (action_t) { .type = ACTION_WARP_BUF_POP };
+ case SDLK_RETURN:
+ return (action_t) { .type = ACTION_WARP };
+ case 'r':
+ return (action_t) { .type = ACTION_RESET };
+ case 's':
+ return (action_t) { .type = ACTION_SOLVE };
+ default:
+ return (action_t) { .type = ACTION_NONE };
+ }
+}