aboutsummaryrefslogtreecommitdiff
path: root/src/sdl/action.c
blob: 72b6fb23b2911a226d2269a8ef2cc38c4bc569ca (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
#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 };
  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 };
  }
}