#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: #define CASE_DIR \ case SDLK_UP: \ case SDLK_DOWN: \ case SDLK_LEFT: \ case SDLK_RIGHT: \ case SDLK_h: \ case SDLK_j: \ case SDLK_k: \ case SDLK_l: static const sok_dir_t keycode_to_dir(const SDL_Keycode code) { switch (code) { case SDLK_UP: return SOK_DIR_UP; case SDLK_k: return SOK_DIR_UP; case SDLK_LEFT: return SOK_DIR_LEFT; case SDLK_h: return SOK_DIR_LEFT; case SDLK_DOWN: return SOK_DIR_DOWN; case SDLK_j: return SOK_DIR_DOWN; case SDLK_RIGHT: return SOK_DIR_RIGHT; case SDLK_l: return SOK_DIR_RIGHT; default: return SOK_DIR_LAST; } } static action_t get_key_action( const SDL_Keycode code ) { switch (code) { case SDLK_ESCAPE: case SDLK_q: return (action_t) { .type = ACTION_QUIT }; CASE_DIR return (action_t) { .type = ACTION_MOVE, .data = keycode_to_dir(code) }; case SDLK_u: return (action_t) { .type = ACTION_UNDO }; case SDLK_SPACE: 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 SDLK_r: return (action_t) { .type = ACTION_RESET }; case SDLK_s: return (action_t) { .type = ACTION_SOLVE }; case SDLK_EQUALS: return (action_t) { .type = ACTION_ZOOM_IN, .data = 1 }; case SDLK_MINUS: return (action_t) { .type = ACTION_ZOOM_OUT, .data = -1 }; case SDLK_F11: return (action_t) { .type = ACTION_FULLSCREEN }; default: return (action_t) { .type = ACTION_NONE }; } } static action_t get_wheel_action( const Sint32 y ) { if (y > 0) { return (action_t) { .type = ACTION_ZOOM_IN, .data = y }; } else if (y < 0) { return (action_t) { .type = ACTION_ZOOM_OUT, .data = -y }; } else { return (action_t) { .type = ACTION_NONE }; } } action_t get_action( const SDL_Event * const ev ) { switch (ev->type) { case SDL_QUIT: return (action_t) { .type = ACTION_QUIT }; break; case SDL_KEYUP: return get_key_action(ev->key.keysym.sym); break; case SDL_MOUSEWHEEL: return get_wheel_action(ev->wheel.y); break; default: // ignore event return (action_t) { .type = ACTION_NONE }; } }