diff options
Diffstat (limited to 'apps/plugins/sdl/src/video/ataricommon/SDL_atarievents.c')
-rw-r--r-- | apps/plugins/sdl/src/video/ataricommon/SDL_atarievents.c | 234 |
1 files changed, 234 insertions, 0 deletions
diff --git a/apps/plugins/sdl/src/video/ataricommon/SDL_atarievents.c b/apps/plugins/sdl/src/video/ataricommon/SDL_atarievents.c new file mode 100644 index 0000000000..8831275306 --- /dev/null +++ b/apps/plugins/sdl/src/video/ataricommon/SDL_atarievents.c | |||
@@ -0,0 +1,234 @@ | |||
1 | /* | ||
2 | SDL - Simple DirectMedia Layer | ||
3 | Copyright (C) 1997-2012 Sam Lantinga | ||
4 | |||
5 | This library is free software; you can redistribute it and/or | ||
6 | modify it under the terms of the GNU Lesser General Public | ||
7 | License as published by the Free Software Foundation; either | ||
8 | version 2.1 of the License, or (at your option) any later version. | ||
9 | |||
10 | This library is distributed in the hope that it will be useful, | ||
11 | but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
13 | Lesser General Public License for more details. | ||
14 | |||
15 | You should have received a copy of the GNU Lesser General Public | ||
16 | License along with this library; if not, write to the Free Software | ||
17 | Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | ||
18 | |||
19 | Sam Lantinga | ||
20 | slouken@libsdl.org | ||
21 | */ | ||
22 | #include "SDL_config.h" | ||
23 | |||
24 | /* | ||
25 | * Atari keyboard events manager | ||
26 | * | ||
27 | * Patrice Mandin | ||
28 | * | ||
29 | * This routines choose what the final event manager will be | ||
30 | */ | ||
31 | |||
32 | #include <mint/cookie.h> | ||
33 | #include <mint/osbind.h> | ||
34 | |||
35 | #include "../../events/SDL_sysevents.h" | ||
36 | #include "../../events/SDL_events_c.h" | ||
37 | |||
38 | #include "SDL_atarikeys.h" | ||
39 | #include "SDL_atarievents_c.h" | ||
40 | #include "SDL_biosevents_c.h" | ||
41 | #include "SDL_gemdosevents_c.h" | ||
42 | #include "SDL_ikbdevents_c.h" | ||
43 | |||
44 | enum { | ||
45 | MCH_ST=0, | ||
46 | MCH_STE, | ||
47 | MCH_TT, | ||
48 | MCH_F30, | ||
49 | MCH_CLONE, | ||
50 | MCH_ARANYM | ||
51 | }; | ||
52 | |||
53 | /* The translation tables from a console scancode to a SDL keysym */ | ||
54 | static SDLKey keymap[ATARIBIOS_MAXKEYS]; | ||
55 | static char *keytab_normal; | ||
56 | |||
57 | void (*Atari_ShutdownEvents)(void); | ||
58 | |||
59 | static void Atari_InitializeEvents(_THIS) | ||
60 | { | ||
61 | const char *envr; | ||
62 | long cookie_mch; | ||
63 | |||
64 | /* Test if we are on an Atari machine or not */ | ||
65 | if (Getcookie(C__MCH, &cookie_mch) == C_NOTFOUND) { | ||
66 | cookie_mch = 0; | ||
67 | } | ||
68 | cookie_mch >>= 16; | ||
69 | |||
70 | /* Default is Ikbd, the faster except for clones */ | ||
71 | switch(cookie_mch) { | ||
72 | case MCH_ST: | ||
73 | case MCH_STE: | ||
74 | case MCH_TT: | ||
75 | case MCH_F30: | ||
76 | case MCH_ARANYM: | ||
77 | this->InitOSKeymap=AtariIkbd_InitOSKeymap; | ||
78 | this->PumpEvents=AtariIkbd_PumpEvents; | ||
79 | Atari_ShutdownEvents=AtariIkbd_ShutdownEvents; | ||
80 | break; | ||
81 | default: | ||
82 | this->InitOSKeymap=AtariGemdos_InitOSKeymap; | ||
83 | this->PumpEvents=AtariGemdos_PumpEvents; | ||
84 | Atari_ShutdownEvents=AtariGemdos_ShutdownEvents; | ||
85 | break; | ||
86 | } | ||
87 | |||
88 | envr = SDL_getenv("SDL_ATARI_EVENTSDRIVER"); | ||
89 | |||
90 | if (!envr) { | ||
91 | return; | ||
92 | } | ||
93 | |||
94 | if (SDL_strcmp(envr, "ikbd") == 0) { | ||
95 | this->InitOSKeymap=AtariIkbd_InitOSKeymap; | ||
96 | this->PumpEvents=AtariIkbd_PumpEvents; | ||
97 | Atari_ShutdownEvents=AtariIkbd_ShutdownEvents; | ||
98 | } | ||
99 | |||
100 | if (SDL_strcmp(envr, "gemdos") == 0) { | ||
101 | this->InitOSKeymap=AtariGemdos_InitOSKeymap; | ||
102 | this->PumpEvents=AtariGemdos_PumpEvents; | ||
103 | Atari_ShutdownEvents=AtariGemdos_ShutdownEvents; | ||
104 | } | ||
105 | |||
106 | if (SDL_strcmp(envr, "bios") == 0) { | ||
107 | this->InitOSKeymap=AtariBios_InitOSKeymap; | ||
108 | this->PumpEvents=AtariBios_PumpEvents; | ||
109 | Atari_ShutdownEvents=AtariBios_ShutdownEvents; | ||
110 | } | ||
111 | } | ||
112 | |||
113 | void Atari_InitOSKeymap(_THIS) | ||
114 | { | ||
115 | Atari_InitializeEvents(this); | ||
116 | |||
117 | SDL_Atari_InitInternalKeymap(this); | ||
118 | |||
119 | /* Call choosen routine */ | ||
120 | this->InitOSKeymap(this); | ||
121 | } | ||
122 | |||
123 | void SDL_Atari_InitInternalKeymap(_THIS) | ||
124 | { | ||
125 | int i; | ||
126 | _KEYTAB *key_tables; | ||
127 | |||
128 | /* Read system tables for scancode -> ascii translation */ | ||
129 | key_tables = (_KEYTAB *) Keytbl(KT_NOCHANGE, KT_NOCHANGE, KT_NOCHANGE); | ||
130 | keytab_normal = key_tables->unshift; | ||
131 | |||
132 | /* Initialize keymap */ | ||
133 | for ( i=0; i<ATARIBIOS_MAXKEYS; i++ ) | ||
134 | keymap[i] = SDLK_UNKNOWN; | ||
135 | |||
136 | /* Functions keys */ | ||
137 | for ( i = 0; i<10; i++ ) | ||
138 | keymap[SCANCODE_F1 + i] = SDLK_F1+i; | ||
139 | |||
140 | /* Cursor keypad */ | ||
141 | keymap[SCANCODE_HELP] = SDLK_HELP; | ||
142 | keymap[SCANCODE_UNDO] = SDLK_UNDO; | ||
143 | keymap[SCANCODE_INSERT] = SDLK_INSERT; | ||
144 | keymap[SCANCODE_CLRHOME] = SDLK_HOME; | ||
145 | keymap[SCANCODE_UP] = SDLK_UP; | ||
146 | keymap[SCANCODE_DOWN] = SDLK_DOWN; | ||
147 | keymap[SCANCODE_RIGHT] = SDLK_RIGHT; | ||
148 | keymap[SCANCODE_LEFT] = SDLK_LEFT; | ||
149 | |||
150 | /* Special keys */ | ||
151 | keymap[SCANCODE_ESCAPE] = SDLK_ESCAPE; | ||
152 | keymap[SCANCODE_BACKSPACE] = SDLK_BACKSPACE; | ||
153 | keymap[SCANCODE_TAB] = SDLK_TAB; | ||
154 | keymap[SCANCODE_ENTER] = SDLK_RETURN; | ||
155 | keymap[SCANCODE_DELETE] = SDLK_DELETE; | ||
156 | keymap[SCANCODE_LEFTCONTROL] = SDLK_LCTRL; | ||
157 | keymap[SCANCODE_LEFTSHIFT] = SDLK_LSHIFT; | ||
158 | keymap[SCANCODE_RIGHTSHIFT] = SDLK_RSHIFT; | ||
159 | keymap[SCANCODE_LEFTALT] = SDLK_LALT; | ||
160 | keymap[SCANCODE_CAPSLOCK] = SDLK_CAPSLOCK; | ||
161 | } | ||
162 | |||
163 | void Atari_PumpEvents(_THIS) | ||
164 | { | ||
165 | Atari_InitializeEvents(this); | ||
166 | |||
167 | /* Call choosen routine */ | ||
168 | this->PumpEvents(this); | ||
169 | } | ||
170 | |||
171 | /* Atari to Unicode charset translation table */ | ||
172 | |||
173 | Uint16 SDL_AtariToUnicodeTable[256]={ | ||
174 | /* Standard ASCII characters from 0x00 to 0x7e */ | ||
175 | /* Unicode stuff from 0x7f to 0xff */ | ||
176 | |||
177 | 0x0000,0x0001,0x0002,0x0003,0x0004,0x0005,0x0006,0x0007, | ||
178 | 0x0008,0x0009,0x000A,0x000B,0x000C,0x000D,0x000E,0x000F, | ||
179 | 0x0010,0x0011,0x0012,0x0013,0x0014,0x0015,0x0016,0x0017, | ||
180 | 0x0018,0x0019,0x001A,0x001B,0x001C,0x001D,0x001E,0x001F, | ||
181 | 0x0020,0x0021,0x0022,0x0023,0x0024,0x0025,0x0026,0x0027, | ||
182 | 0x0028,0x0029,0x002A,0x002B,0x002C,0x002D,0x002E,0x002F, | ||
183 | 0x0030,0x0031,0x0032,0x0033,0x0034,0x0035,0x0036,0x0037, | ||
184 | 0x0038,0x0039,0x003A,0x003B,0x003C,0x003D,0x003E,0x003F, | ||
185 | |||
186 | 0x0040,0x0041,0x0042,0x0043,0x0044,0x0045,0x0046,0x0047, | ||
187 | 0x0048,0x0049,0x004A,0x004B,0x004C,0x004D,0x004E,0x004F, | ||
188 | 0x0050,0x0051,0x0052,0x0053,0x0054,0x0055,0x0056,0x0057, | ||
189 | 0x0058,0x0059,0x005A,0x005B,0x005C,0x005D,0x005E,0x005F, | ||
190 | 0x0060,0x0061,0x0062,0x0063,0x0064,0x0065,0x0066,0x0067, | ||
191 | 0x0068,0x0069,0x006A,0x006B,0x006C,0x006D,0x006E,0x006F, | ||
192 | 0x0070,0x0071,0x0072,0x0073,0x0074,0x0075,0x0076,0x0077, | ||
193 | 0x0078,0x0079,0x007A,0x007B,0x007C,0x007D,0x007E,0x0394, | ||
194 | |||
195 | 0x00C7,0x00FC,0x00E9,0x00E2,0x00E4,0x00E0,0x00E5,0x00E7, | ||
196 | 0x00EA,0x00EB,0x00E8,0x00EF,0x00EE,0x00EC,0x00C4,0x00C5, | ||
197 | 0x00C9,0x00E6,0x00C6,0x00F4,0x00F6,0x00F2,0x00FB,0x00F9, | ||
198 | 0x00FF,0x00D6,0x00DC,0x00A2,0x00A3,0x00A5,0x00DF,0x0192, | ||
199 | 0x00E1,0x00ED,0x00F3,0x00FA,0x00F1,0x00D1,0x00AA,0x00BA, | ||
200 | 0x00BF,0x2310,0x00AC,0x00BD,0x00BC,0x00A1,0x00AB,0x00BB, | ||
201 | 0x00C3,0x00F5,0x00D8,0x00F8,0x0153,0x0152,0x00C0,0x00C3, | ||
202 | 0x00D5,0x00A8,0x00B4,0x2020,0x00B6,0x00A9,0x00AE,0x2122, | ||
203 | |||
204 | 0x0133,0x0132,0x05D0,0x05D1,0x05D2,0x05D3,0x05D4,0x05D5, | ||
205 | 0x05D6,0x05D7,0x05D8,0x05D9,0x05DB,0x05DC,0x05DE,0x05E0, | ||
206 | 0x05E1,0x05E2,0x05E4,0x05E6,0x05E7,0x05E8,0x05E9,0x05EA, | ||
207 | 0x05DF,0x05DA,0x05DD,0x05E3,0x05E5,0x00A7,0x2038,0x221E, | ||
208 | 0x03B1,0x03B2,0x0393,0x03C0,0x03A3,0x03C3,0x00B5,0x03C4, | ||
209 | 0x03A6,0x0398,0x03A9,0x03B4,0x222E,0x03C6,0x2208,0x2229, | ||
210 | 0x2261,0x00B1,0x2265,0x2264,0x2320,0x2321,0x00F7,0x2248, | ||
211 | 0x00B0,0x2022,0x00B7,0x221A,0x207F,0x00B2,0x00B3,0x00AF | ||
212 | }; | ||
213 | |||
214 | SDL_keysym *SDL_Atari_TranslateKey(int scancode, SDL_keysym *keysym, | ||
215 | SDL_bool pressed) | ||
216 | { | ||
217 | int asciicode = 0; | ||
218 | |||
219 | /* Set the keysym information */ | ||
220 | keysym->scancode = scancode; | ||
221 | keysym->mod = KMOD_NONE; | ||
222 | keysym->sym = keymap[scancode]; | ||
223 | keysym->unicode = 0; | ||
224 | |||
225 | if (keysym->sym == SDLK_UNKNOWN) { | ||
226 | keysym->sym = asciicode = keytab_normal[scancode]; | ||
227 | } | ||
228 | |||
229 | if (SDL_TranslateUNICODE && pressed) { | ||
230 | keysym->unicode = SDL_AtariToUnicodeTable[asciicode]; | ||
231 | } | ||
232 | |||
233 | return(keysym); | ||
234 | } | ||