comparison libmlk-core/mlk/core/event.c @ 431:8f59201dc76b

core: cleanup hierarchy
author David Demelier <markand@malikania.fr>
date Sat, 15 Oct 2022 20:23:14 +0200
parents src/libmlk-core/core/event.c@460c78706989
children dfc65293d984
comparison
equal deleted inserted replaced
430:1645433e008d 431:8f59201dc76b
1 /*
2 * event.c -- event management
3 *
4 * Copyright (c) 2020-2022 David Demelier <markand@malikania.fr>
5 *
6 * Permission to use, copy, modify, and/or distribute this software for any
7 * purpose with or without fee is hereby granted, provided that the above
8 * copyright notice and this permission notice appear in all copies.
9 *
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17 */
18
19 #include <SDL.h>
20
21 #include "event.h"
22
23 /* Maintain with enum key constants in key.h */
24 static const struct {
25 SDL_Keycode key;
26 enum key value;
27 } keymap[] = {
28 { SDLK_RETURN, KEY_ENTER },
29 { SDLK_ESCAPE, KEY_ESCAPE },
30 { SDLK_BACKSPACE, KEY_BACKSPACE },
31 { SDLK_TAB, KEY_TAB },
32 { SDLK_SPACE, KEY_SPACE },
33 { SDLK_EXCLAIM, KEY_EXCLAIM },
34 { SDLK_QUOTEDBL, KEY_DOUBLE_QUOTE },
35 { SDLK_HASH, KEY_HASH },
36 { SDLK_PERCENT, KEY_PERCENT },
37 { SDLK_DOLLAR, KEY_DOLLAR },
38 { SDLK_AMPERSAND, KEY_AMPERSAND },
39 { SDLK_QUOTE, KEY_QUOTE },
40 { SDLK_LEFTPAREN, KEY_LEFT_PAREN },
41 { SDLK_RIGHTPAREN, KEY_RIGHT_PAREN },
42 { SDLK_ASTERISK, KEY_ASTERISK },
43 { SDLK_PLUS, KEY_PLUS },
44 { SDLK_COMMA, KEY_COMMA },
45 { SDLK_MINUS, KEY_MINUS },
46 { SDLK_PERIOD, KEY_PERIOD },
47 { SDLK_SLASH, KEY_SLASH },
48 { SDLK_0, KEY_0 },
49 { SDLK_1, KEY_1 },
50 { SDLK_2, KEY_2 },
51 { SDLK_3, KEY_3 },
52 { SDLK_4, KEY_4 },
53 { SDLK_5, KEY_5 },
54 { SDLK_6, KEY_6 },
55 { SDLK_7, KEY_7 },
56 { SDLK_8, KEY_8 },
57 { SDLK_9, KEY_9 },
58 { SDLK_COLON, KEY_COLON },
59 { SDLK_SEMICOLON, KEY_SEMICOLON },
60 { SDLK_LESS, KEY_LESS },
61 { SDLK_EQUALS, KEY_EQUALS },
62 { SDLK_GREATER, KEY_GREATER },
63 { SDLK_QUESTION, KEY_QUESTION },
64 { SDLK_AT, KEY_AT },
65 { SDLK_LEFTBRACKET, KEY_LEFT_BRACKET },
66 { SDLK_BACKSLASH, KEY_BACKSLASH },
67 { SDLK_RIGHTBRACKET, KEY_RIGHT_BRACKET },
68 { SDLK_CARET, KEY_CARET },
69 { SDLK_UNDERSCORE, KEY_UNDERSCORE },
70 { SDLK_BACKQUOTE, KEY_BACKQUOTE },
71 { SDLK_a, KEY_a },
72 { SDLK_b, KEY_b },
73 { SDLK_c, KEY_c },
74 { SDLK_d, KEY_d },
75 { SDLK_e, KEY_e },
76 { SDLK_f, KEY_f },
77 { SDLK_g, KEY_g },
78 { SDLK_h, KEY_h },
79 { SDLK_i, KEY_i },
80 { SDLK_j, KEY_j },
81 { SDLK_k, KEY_k },
82 { SDLK_l, KEY_l },
83 { SDLK_m, KEY_m },
84 { SDLK_n, KEY_n },
85 { SDLK_o, KEY_o },
86 { SDLK_p, KEY_p },
87 { SDLK_q, KEY_q },
88 { SDLK_r, KEY_r },
89 { SDLK_s, KEY_s },
90 { SDLK_t, KEY_t },
91 { SDLK_u, KEY_u },
92 { SDLK_v, KEY_v },
93 { SDLK_w, KEY_w },
94 { SDLK_x, KEY_x },
95 { SDLK_y, KEY_y },
96 { SDLK_z, KEY_z },
97 { SDLK_CAPSLOCK, KEY_CAPSLOCK },
98 { SDLK_F1, KEY_F1 },
99 { SDLK_F2, KEY_F2 },
100 { SDLK_F3, KEY_F3 },
101 { SDLK_F4, KEY_F4 },
102 { SDLK_F5, KEY_F5 },
103 { SDLK_F6, KEY_F6 },
104 { SDLK_F7, KEY_F7 },
105 { SDLK_F8, KEY_F8 },
106 { SDLK_F9, KEY_F9 },
107 { SDLK_F10, KEY_F10 },
108 { SDLK_F11, KEY_F11 },
109 { SDLK_F12, KEY_F12 },
110 { SDLK_F13, KEY_F13 },
111 { SDLK_F14, KEY_F14 },
112 { SDLK_F15, KEY_F15 },
113 { SDLK_F16, KEY_F16 },
114 { SDLK_F17, KEY_F17 },
115 { SDLK_F18, KEY_F18 },
116 { SDLK_F19, KEY_F19 },
117 { SDLK_F20, KEY_F20 },
118 { SDLK_F21, KEY_F21 },
119 { SDLK_F22, KEY_F22 },
120 { SDLK_F23, KEY_F23 },
121 { SDLK_F24, KEY_F24 },
122 { SDLK_PRINTSCREEN, KEY_PRINTSCREEN },
123 { SDLK_SCROLLLOCK, KEY_SCROLL_LOCK },
124 { SDLK_PAUSE, KEY_PAUSE },
125 { SDLK_INSERT, KEY_INSERT },
126 { SDLK_HOME, KEY_HOME },
127 { SDLK_PAGEUP, KEY_PAGEUP },
128 { SDLK_DELETE, KEY_DELETE },
129 { SDLK_END, KEY_END },
130 { SDLK_PAGEDOWN, KEY_PAGEDOWN },
131 { SDLK_RIGHT, KEY_RIGHT },
132 { SDLK_LEFT, KEY_LEFT },
133 { SDLK_DOWN, KEY_DOWN },
134 { SDLK_UP, KEY_UP },
135 { SDLK_KP_DIVIDE, KEY_KP_DIVIDE },
136 { SDLK_KP_MULTIPLY, KEY_KP_MULTIPLY },
137 { SDLK_KP_MINUS, KEY_KP_MINUS },
138 { SDLK_KP_PLUS, KEY_KP_PLUS },
139 { SDLK_KP_ENTER, KEY_KP_ENTER },
140 { SDLK_KP_1, KEY_KP_1 },
141 { SDLK_KP_2, KEY_KP_2 },
142 { SDLK_KP_3, KEY_KP_3 },
143 { SDLK_KP_4, KEY_KP_4 },
144 { SDLK_KP_5, KEY_KP_5 },
145 { SDLK_KP_6, KEY_KP_6 },
146 { SDLK_KP_7, KEY_KP_7 },
147 { SDLK_KP_8, KEY_KP_8 },
148 { SDLK_KP_9, KEY_KP_9 },
149 { SDLK_KP_0, KEY_KP_0 },
150 { SDLK_KP_PERIOD, KEY_KP_PERIOD },
151 { SDLK_KP_COMMA, KEY_KP_COMMA },
152 { SDLK_MENU, KEY_MENU },
153 { SDLK_MUTE, KEY_MUTE },
154 { SDLK_VOLUMEUP, KEY_VOLUME_UP },
155 { SDLK_VOLUMEDOWN, KEY_VOLUME_DOWN },
156 { SDLK_LCTRL, KEY_LCTRL },
157 { SDLK_LSHIFT, KEY_LSHIFT },
158 { SDLK_LALT, KEY_LALT },
159 { SDLK_LGUI, KEY_LSUPER },
160 { SDLK_RCTRL, KEY_RCTRL },
161 { SDLK_RSHIFT, KEY_RSHIFT },
162 { SDLK_RALT, KEY_RALT },
163 { SDLK_RGUI, KEY_RSUPER },
164 { 0, -1 }
165 };
166
167 /* Maintain with enum mouse_button constants in mouse.h */
168 static const struct {
169 int key;
170 enum mouse_button value;
171 } buttons[] = {
172 { SDL_BUTTON_LEFT, MOUSE_BUTTON_LEFT },
173 { SDL_BUTTON_MIDDLE, MOUSE_BUTTON_MIDDLE },
174 { SDL_BUTTON_RIGHT, MOUSE_BUTTON_RIGHT },
175 { -1, MOUSE_BUTTON_NONE }
176 };
177
178 static void
179 convert_key(const SDL_Event *event, union event *ev)
180 {
181 ev->type = event->type == SDL_KEYDOWN ? EVENT_KEYDOWN : EVENT_KEYUP;
182 ev->key.key = KEY_UNKNOWN;
183
184 for (size_t i = 0; keymap[i].key != 0; ++i) {
185 if (keymap[i].key == event->key.keysym.sym) {
186 ev->key.key = keymap[i].value;
187 break;
188 }
189 }
190 }
191
192 static void
193 convert_mouse(const SDL_Event *event, union event *ev)
194 {
195 ev->type = EVENT_MOUSE;
196 ev->mouse.buttons = 0;
197 ev->mouse.x = event->motion.x;
198 ev->mouse.y = event->motion.y;
199
200 if (event->motion.state & SDL_BUTTON_LMASK)
201 ev->mouse.buttons |= MOUSE_BUTTON_LEFT;
202 if (event->motion.state & SDL_BUTTON_MMASK)
203 ev->mouse.buttons |= MOUSE_BUTTON_MIDDLE;
204 if (event->motion.state & SDL_BUTTON_RMASK)
205 ev->mouse.buttons |= MOUSE_BUTTON_RIGHT;
206 }
207
208 static void
209 convert_click(const SDL_Event *event, union event *ev)
210 {
211 ev->type = event->type == SDL_MOUSEBUTTONDOWN ? EVENT_CLICKDOWN : EVENT_CLICKUP;
212 ev->click.button = MOUSE_BUTTON_NONE;
213 ev->click.x = event->button.x;
214 ev->click.y = event->button.y;
215 ev->click.clicks = event->button.clicks;
216
217 for (size_t i = 0; buttons[i].value != MOUSE_BUTTON_NONE; ++i) {
218 if (buttons[i].key == event->button.button) {
219 ev->click.button = buttons[i].value;
220 break;
221 }
222 }
223 }
224
225 int
226 event_poll(union event *ev)
227 {
228 SDL_Event event;
229
230 /*
231 * Loop until we find an event we want to report, we skip unneeded
232 * ones.
233 */
234 while (SDL_PollEvent(&event)) {
235 switch (event.type) {
236 case SDL_QUIT:
237 ev->type = EVENT_QUIT;
238 return 1;
239 case SDL_KEYDOWN:
240 case SDL_KEYUP:
241 convert_key(&event, ev);
242 return 1;
243 case SDL_MOUSEMOTION:
244 convert_mouse(&event, ev);
245 return 1;
246 case SDL_MOUSEBUTTONDOWN:
247 case SDL_MOUSEBUTTONUP:
248 convert_click(&event, ev);
249 return 1;
250 default:
251 continue;
252 }
253 }
254
255 return 0;
256 }