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 };
}
}
|