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