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 44enum { 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 */ 54static SDLKey keymap[ATARIBIOS_MAXKEYS]; 55static char *keytab_normal; 56 57void (*Atari_ShutdownEvents)(void); 58 59static 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 113void 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 123void 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 163void 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 173Uint16 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 214SDL_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} 235