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