Mercurial > molko
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 } |