1 /*
2 * ============================================================================
3 * Title: Event Handling Driver for SDL1
4 * Author: J. Zbiciak
5 * ============================================================================
6 * This is the platform-specific driver for SDL 1.x.
7 * ============================================================================
8 */
9
10 #include "config.h"
11 #include "sdl_jzintv.h"
12 #include "event/event_tbl.h"
13 #include "event/event_plat.h"
14 #include "event/event_sdl_pvt.h"
15
16 /* ======================================================================== */
17 /* SDK_KEYMAP -- Maps SDLK values to EVENT values. */
18 /* ======================================================================== */
19 static const event_num_t sdl_keymap[] =
20 {
21 [SDLK_UNKNOWN] = EVENT_UNKNOWN,
22 [SDLK_BACKSPACE] = EVENT_BACKSPACE,
23 [SDLK_TAB] = EVENT_TAB,
24 [SDLK_CLEAR] = EVENT_CLEAR,
25 [SDLK_RETURN] = EVENT_RETURN,
26 [SDLK_PAUSE] = EVENT_PAUSE,
27 [SDLK_ESCAPE] = EVENT_ESCAPE,
28 [SDLK_SPACE] = EVENT_SPACE,
29 [SDLK_EXCLAIM] = EVENT_EXCLAIM,
30 [SDLK_QUOTEDBL] = EVENT_QUOTEDBL,
31 [SDLK_HASH] = EVENT_HASH,
32 [SDLK_DOLLAR] = EVENT_DOLLAR,
33 [SDLK_AMPERSAND] = EVENT_AMPERSAND,
34 [SDLK_QUOTE] = EVENT_QUOTE,
35 [SDLK_LEFTPAREN] = EVENT_LEFTPAREN,
36 [SDLK_RIGHTPAREN] = EVENT_RIGHTPAREN,
37 [SDLK_ASTERISK] = EVENT_ASTERISK,
38 [SDLK_PLUS] = EVENT_PLUS,
39 [SDLK_COMMA] = EVENT_COMMA,
40 [SDLK_MINUS] = EVENT_MINUS,
41 [SDLK_PERIOD] = EVENT_PERIOD,
42 [SDLK_SLASH] = EVENT_SLASH,
43 [SDLK_0] = EVENT_0,
44 [SDLK_1] = EVENT_1,
45 [SDLK_2] = EVENT_2,
46 [SDLK_3] = EVENT_3,
47 [SDLK_4] = EVENT_4,
48 [SDLK_5] = EVENT_5,
49 [SDLK_6] = EVENT_6,
50 [SDLK_7] = EVENT_7,
51 [SDLK_8] = EVENT_8,
52 [SDLK_9] = EVENT_9,
53 [SDLK_COLON] = EVENT_COLON,
54 [SDLK_SEMICOLON] = EVENT_SEMICOLON,
55 [SDLK_LESS] = EVENT_LESS,
56 [SDLK_EQUALS] = EVENT_EQUALS,
57 [SDLK_GREATER] = EVENT_GREATER,
58 [SDLK_QUESTION] = EVENT_QUESTION,
59 [SDLK_AT] = EVENT_AT,
60 [SDLK_LEFTBRACKET] = EVENT_LEFTBRACKET,
61 [SDLK_BACKSLASH] = EVENT_BACKSLASH,
62 [SDLK_RIGHTBRACKET] = EVENT_RIGHTBRACKET,
63 [SDLK_CARET] = EVENT_CARET,
64 [SDLK_UNDERSCORE] = EVENT_UNDERSCORE,
65 [SDLK_BACKQUOTE] = EVENT_BACKQUOTE,
66 [SDLK_a] = EVENT_A,
67 [SDLK_b] = EVENT_B,
68 [SDLK_c] = EVENT_C,
69 [SDLK_d] = EVENT_D,
70 [SDLK_e] = EVENT_E,
71 [SDLK_f] = EVENT_F,
72 [SDLK_g] = EVENT_G,
73 [SDLK_h] = EVENT_H,
74 [SDLK_i] = EVENT_I,
75 [SDLK_j] = EVENT_J,
76 [SDLK_k] = EVENT_K,
77 [SDLK_l] = EVENT_L,
78 [SDLK_m] = EVENT_M,
79 [SDLK_n] = EVENT_N,
80 [SDLK_o] = EVENT_O,
81 [SDLK_p] = EVENT_P,
82 [SDLK_q] = EVENT_Q,
83 [SDLK_r] = EVENT_R,
84 [SDLK_s] = EVENT_S,
85 [SDLK_t] = EVENT_T,
86 [SDLK_u] = EVENT_U,
87 [SDLK_v] = EVENT_V,
88 [SDLK_w] = EVENT_W,
89 [SDLK_x] = EVENT_X,
90 [SDLK_y] = EVENT_Y,
91 [SDLK_z] = EVENT_Z,
92 [SDLK_DELETE] = EVENT_DELETE,
93 #if !defined(__EMSCRIPTEN__)
94 [SDLK_WORLD_0] = EVENT_SCANCODE_000,
95 [SDLK_WORLD_1] = EVENT_SCANCODE_001,
96 [SDLK_WORLD_2] = EVENT_SCANCODE_002,
97 [SDLK_WORLD_3] = EVENT_SCANCODE_003,
98 [SDLK_WORLD_4] = EVENT_SCANCODE_004,
99 [SDLK_WORLD_5] = EVENT_SCANCODE_005,
100 [SDLK_WORLD_6] = EVENT_SCANCODE_006,
101 [SDLK_WORLD_7] = EVENT_SCANCODE_007,
102 [SDLK_WORLD_8] = EVENT_SCANCODE_008,
103 [SDLK_WORLD_9] = EVENT_SCANCODE_009,
104 [SDLK_WORLD_10] = EVENT_SCANCODE_00A,
105 [SDLK_WORLD_11] = EVENT_SCANCODE_00B,
106 [SDLK_WORLD_12] = EVENT_SCANCODE_00C,
107 [SDLK_WORLD_13] = EVENT_SCANCODE_00D,
108 [SDLK_WORLD_14] = EVENT_SCANCODE_00E,
109 [SDLK_WORLD_15] = EVENT_SCANCODE_00F,
110 [SDLK_WORLD_16] = EVENT_SCANCODE_010,
111 [SDLK_WORLD_17] = EVENT_SCANCODE_011,
112 [SDLK_WORLD_18] = EVENT_SCANCODE_012,
113 [SDLK_WORLD_19] = EVENT_SCANCODE_013,
114 [SDLK_WORLD_20] = EVENT_SCANCODE_014,
115 [SDLK_WORLD_21] = EVENT_SCANCODE_015,
116 [SDLK_WORLD_22] = EVENT_SCANCODE_016,
117 [SDLK_WORLD_23] = EVENT_SCANCODE_017,
118 [SDLK_WORLD_24] = EVENT_SCANCODE_018,
119 [SDLK_WORLD_25] = EVENT_SCANCODE_019,
120 [SDLK_WORLD_26] = EVENT_SCANCODE_01A,
121 [SDLK_WORLD_27] = EVENT_SCANCODE_01B,
122 [SDLK_WORLD_28] = EVENT_SCANCODE_01C,
123 [SDLK_WORLD_29] = EVENT_SCANCODE_01D,
124 [SDLK_WORLD_30] = EVENT_SCANCODE_01E,
125 [SDLK_WORLD_31] = EVENT_SCANCODE_01F,
126 [SDLK_WORLD_32] = EVENT_SCANCODE_020,
127 [SDLK_WORLD_33] = EVENT_SCANCODE_021,
128 [SDLK_WORLD_34] = EVENT_SCANCODE_022,
129 [SDLK_WORLD_35] = EVENT_SCANCODE_023,
130 [SDLK_WORLD_36] = EVENT_SCANCODE_024,
131 [SDLK_WORLD_37] = EVENT_SCANCODE_025,
132 [SDLK_WORLD_38] = EVENT_SCANCODE_026,
133 [SDLK_WORLD_39] = EVENT_SCANCODE_027,
134 [SDLK_WORLD_40] = EVENT_SCANCODE_028,
135 [SDLK_WORLD_41] = EVENT_SCANCODE_029,
136 [SDLK_WORLD_42] = EVENT_SCANCODE_02A,
137 [SDLK_WORLD_43] = EVENT_SCANCODE_02B,
138 [SDLK_WORLD_44] = EVENT_SCANCODE_02C,
139 [SDLK_WORLD_45] = EVENT_SCANCODE_02D,
140 [SDLK_WORLD_46] = EVENT_SCANCODE_02E,
141 [SDLK_WORLD_47] = EVENT_SCANCODE_02F,
142 [SDLK_WORLD_48] = EVENT_SCANCODE_030,
143 [SDLK_WORLD_49] = EVENT_SCANCODE_031,
144 [SDLK_WORLD_50] = EVENT_SCANCODE_032,
145 [SDLK_WORLD_51] = EVENT_SCANCODE_033,
146 [SDLK_WORLD_52] = EVENT_SCANCODE_034,
147 [SDLK_WORLD_53] = EVENT_SCANCODE_035,
148 [SDLK_WORLD_54] = EVENT_SCANCODE_036,
149 [SDLK_WORLD_55] = EVENT_SCANCODE_037,
150 [SDLK_WORLD_56] = EVENT_SCANCODE_038,
151 [SDLK_WORLD_57] = EVENT_SCANCODE_039,
152 [SDLK_WORLD_58] = EVENT_SCANCODE_03A,
153 [SDLK_WORLD_59] = EVENT_SCANCODE_03B,
154 [SDLK_WORLD_60] = EVENT_SCANCODE_03C,
155 [SDLK_WORLD_61] = EVENT_SCANCODE_03D,
156 [SDLK_WORLD_62] = EVENT_SCANCODE_03E,
157 [SDLK_WORLD_63] = EVENT_SCANCODE_03F,
158 [SDLK_WORLD_64] = EVENT_SCANCODE_040,
159 [SDLK_WORLD_65] = EVENT_SCANCODE_041,
160 [SDLK_WORLD_66] = EVENT_SCANCODE_042,
161 [SDLK_WORLD_67] = EVENT_SCANCODE_043,
162 [SDLK_WORLD_68] = EVENT_SCANCODE_044,
163 [SDLK_WORLD_69] = EVENT_SCANCODE_045,
164 [SDLK_WORLD_70] = EVENT_SCANCODE_046,
165 [SDLK_WORLD_71] = EVENT_SCANCODE_047,
166 [SDLK_WORLD_72] = EVENT_SCANCODE_048,
167 [SDLK_WORLD_73] = EVENT_SCANCODE_049,
168 [SDLK_WORLD_74] = EVENT_SCANCODE_04A,
169 [SDLK_WORLD_75] = EVENT_SCANCODE_04B,
170 [SDLK_WORLD_76] = EVENT_SCANCODE_04C,
171 [SDLK_WORLD_77] = EVENT_SCANCODE_04D,
172 [SDLK_WORLD_78] = EVENT_SCANCODE_04E,
173 [SDLK_WORLD_79] = EVENT_SCANCODE_04F,
174 [SDLK_WORLD_80] = EVENT_SCANCODE_050,
175 [SDLK_WORLD_81] = EVENT_SCANCODE_051,
176 [SDLK_WORLD_82] = EVENT_SCANCODE_052,
177 [SDLK_WORLD_83] = EVENT_SCANCODE_053,
178 [SDLK_WORLD_84] = EVENT_SCANCODE_054,
179 [SDLK_WORLD_85] = EVENT_SCANCODE_055,
180 [SDLK_WORLD_86] = EVENT_SCANCODE_056,
181 [SDLK_WORLD_87] = EVENT_SCANCODE_057,
182 [SDLK_WORLD_88] = EVENT_SCANCODE_058,
183 [SDLK_WORLD_89] = EVENT_SCANCODE_059,
184 [SDLK_WORLD_90] = EVENT_SCANCODE_05A,
185 [SDLK_WORLD_91] = EVENT_SCANCODE_05B,
186 [SDLK_WORLD_92] = EVENT_SCANCODE_05C,
187 [SDLK_WORLD_93] = EVENT_SCANCODE_05D,
188 [SDLK_WORLD_94] = EVENT_SCANCODE_05E,
189 [SDLK_WORLD_95] = EVENT_SCANCODE_05F,
190 #endif
191 [SDLK_KP0] = EVENT_KP_0,
192 [SDLK_KP1] = EVENT_KP_1,
193 [SDLK_KP2] = EVENT_KP_2,
194 [SDLK_KP3] = EVENT_KP_3,
195 [SDLK_KP4] = EVENT_KP_4,
196 [SDLK_KP5] = EVENT_KP_5,
197 [SDLK_KP6] = EVENT_KP_6,
198 [SDLK_KP7] = EVENT_KP_7,
199 [SDLK_KP8] = EVENT_KP_8,
200 [SDLK_KP9] = EVENT_KP_9,
201 [SDLK_KP_PERIOD] = EVENT_KP_PERIOD,
202 [SDLK_KP_DIVIDE] = EVENT_KP_DIVIDE,
203 [SDLK_KP_MULTIPLY] = EVENT_KP_MULTIPLY,
204 [SDLK_KP_MINUS] = EVENT_KP_MINUS,
205 [SDLK_KP_PLUS] = EVENT_KP_PLUS,
206 [SDLK_KP_ENTER] = EVENT_KP_ENTER,
207 [SDLK_KP_EQUALS] = EVENT_KP_EQUALS,
208 [SDLK_UP] = EVENT_UP,
209 [SDLK_DOWN] = EVENT_DOWN,
210 [SDLK_RIGHT] = EVENT_RIGHT,
211 [SDLK_LEFT] = EVENT_LEFT,
212 [SDLK_INSERT] = EVENT_INSERT,
213 [SDLK_HOME] = EVENT_HOME,
214 [SDLK_END] = EVENT_END,
215 [SDLK_PAGEUP] = EVENT_PAGEUP,
216 [SDLK_PAGEDOWN] = EVENT_PAGEDOWN,
217 [SDLK_F1] = EVENT_F1,
218 [SDLK_F2] = EVENT_F2,
219 [SDLK_F3] = EVENT_F3,
220 [SDLK_F4] = EVENT_F4,
221 [SDLK_F5] = EVENT_F5,
222 [SDLK_F6] = EVENT_F6,
223 [SDLK_F7] = EVENT_F7,
224 [SDLK_F8] = EVENT_F8,
225 [SDLK_F9] = EVENT_F9,
226 [SDLK_F10] = EVENT_F10,
227 [SDLK_F11] = EVENT_F11,
228 [SDLK_F12] = EVENT_F12,
229 [SDLK_F13] = EVENT_F13,
230 [SDLK_F14] = EVENT_F14,
231 [SDLK_F15] = EVENT_F15,
232 [SDLK_NUMLOCK] = EVENT_NUMLOCK,
233 [SDLK_CAPSLOCK] = EVENT_CAPSLOCK,
234 [SDLK_SCROLLOCK] = EVENT_SCROLLOCK,
235 [SDLK_RSHIFT] = EVENT_RSHIFT,
236 [SDLK_LSHIFT] = EVENT_LSHIFT,
237 [SDLK_RCTRL] = EVENT_RCTRL,
238 [SDLK_LCTRL] = EVENT_LCTRL,
239 [SDLK_RALT] = EVENT_RALT,
240 [SDLK_LALT] = EVENT_LALT,
241 [SDLK_RMETA] = EVENT_RMETA,
242 [SDLK_LMETA] = EVENT_LMETA,
243 #if !defined(__EMSCRIPTEN__)
244 [SDLK_LSUPER] = EVENT_LSUPER,
245 [SDLK_RSUPER] = EVENT_RSUPER,
246 [SDLK_EURO] = EVENT_EURO,
247 #endif
248 [SDLK_MODE] = EVENT_MODE,
249 [SDLK_COMPOSE] = EVENT_COMPOSE,
250 [SDLK_HELP] = EVENT_HELP,
251 [SDLK_PRINT] = EVENT_PRINT,
252 [SDLK_SYSREQ] = EVENT_SYSREQ,
253 [SDLK_BREAK] = EVENT_BREAK,
254 [SDLK_MENU] = EVENT_MENU,
255 [SDLK_POWER] = EVENT_POWER,
256 [SDLK_UNDO] = EVENT_UNDO,
257 };
258
259 /* ======================================================================== */
260 /* EVENT_SDL_TRANSLATE_KEY -- Translate an SDLKey to event_num_t. */
261 /* ======================================================================== */
event_sdl_translate_key(const SDL_Event * const event)262 event_num_t event_sdl_translate_key(const SDL_Event *const event)
263 {
264 const SDLKey key = event->key.keysym.sym;
265
266 if (key >= SDLK_LAST)
267 return EVENT_UNKNOWN;
268
269 return sdl_keymap[key];
270 }
271 /* ======================================================================== */
272 /* EVENT_SDL_UNHANDLED_EVENT -- Hook for SDL-version specific events. */
273 /* Returns true if the event ended up queuing a COMBO, false otherwise. */
274 /* ======================================================================== */
event_sdl_unhandled_event(evt_pvt_t * const evt_pvt,const SDL_Event * const event)275 bool event_sdl_unhandled_event(evt_pvt_t *const evt_pvt,
276 const SDL_Event *const event)
277 {
278 switch (event->type)
279 {
280 /* ---------------------------------------------------------------- */
281 /* Activation events: Only look at whether we're iconified or */
282 /* not, and convert it to an up/down event on EVENT_HIDE. */
283 /* ---------------------------------------------------------------- */
284 case SDL_ACTIVEEVENT:
285 {
286 if (event->active.state & SDL_APPACTIVE)
287 event_enqueue(evt_pvt, event->active.gain ? EV_UP : EV_DOWN,
288 EVENT_HIDE);
289 break;
290 }
291 default:
292 break;
293 }
294 return false;
295 }
296
297 /* ======================================================================== */
298 /* This program is free software; you can redistribute it and/or modify */
299 /* it under the terms of the GNU General Public License as published by */
300 /* the Free Software Foundation; either version 2 of the License, or */
301 /* (at your option) any later version. */
302 /* */
303 /* This program is distributed in the hope that it will be useful, */
304 /* but WITHOUT ANY WARRANTY; without even the implied warranty of */
305 /* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU */
306 /* General Public License for more details. */
307 /* */
308 /* You should have received a copy of the GNU General Public License along */
309 /* with this program; if not, write to the Free Software Foundation, Inc., */
310 /* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */
311 /* ======================================================================== */
312 /* Copyright (c) 2020-+Inf, Joseph Zbiciak */
313 /* ======================================================================== */
314