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