Annotation of previous/src/keymap.c, revision 1.1.1.2

1.1       root        1: /*
                      2:   Hatari - keymap.c
                      3: 
                      4:   This file is distributed under the GNU Public License, version 2 or at
                      5:   your option any later version. Read the file gpl.txt for details.
                      6: 
                      7:   Here we process a key press and the remapping of the scancodes.
                      8: */
                      9: const char Keymap_fileid[] = "Hatari keymap.c : " __DATE__ " " __TIME__;
                     10: 
                     11: #include <ctype.h>
                     12: #include "main.h"
                     13: #include "keymap.h"
                     14: #include "configuration.h"
                     15: #include "file.h"
                     16: #include "shortcut.h"
                     17: #include "str.h"
                     18: #include "screen.h"
                     19: #include "debugui.h"
                     20: #include "log.h"
1.1.1.2 ! root       21: #include "ioMem.h"
        !            22: #include "m68000.h"
        !            23: 
        !            24: #include "SDL.h"
        !            25: 
        !            26: 
        !            27: /*
        !            28:  
        !            29:  Byte at address 0x0200e00a contains modifier key values:
        !            30:  
        !            31:  x--- ----  valid
        !            32:  -x-- ----  alt_right
        !            33:  --x- ----  alt_left
        !            34:  ---x ----  command_right
        !            35:  ---- x---  command_left
        !            36:  ---- -x--  shift_right
        !            37:  ---- --x-  shift_left
        !            38:  ---- ---x  control
        !            39:  
        !            40:  
        !            41:  Byte at address 0x0200e00b contains key values:
        !            42:  
        !            43:  x--- ----  key up (1) or down (0)
        !            44:  -xxx xxxx  key_code
        !            45:  
        !            46:  */
        !            47: 
        !            48: 
        !            49: void Keymap_Init(void) {
        !            50:     if(ConfigureParams.Keyboard.bDisableKeyRepeat)
        !            51:         SDL_EnableKeyRepeat(0, 0);
        !            52:     else
        !            53:         SDL_EnableKeyRepeat(SDL_DEFAULT_REPEAT_DELAY, SDL_DEFAULT_REPEAT_INTERVAL);
        !            54: }
        !            55: 
        !            56: Uint8 nextkeycode;
        !            57: Uint8 modkeys;
        !            58: Uint8 ralt;
        !            59: Uint8 lalt;
        !            60: Uint8 rcom;
        !            61: Uint8 lcom;
        !            62: Uint8 rshift;
        !            63: Uint8 lshift;
        !            64: Uint8 ctrl;
        !            65: 
        !            66: 
        !            67: void Keyboard_Read0(void) {
        !            68: //    Log_Printf(LOG_WARN, "Keyboard read at $%08x PC=$%08x\n", IoAccessCurrentAddress, m68k_getpc());
        !            69:     IoMem[IoAccessCurrentAddress & 0x1FFFF]=0xA0;
        !            70: }
        !            71: 
        !            72: void Keyboard_Read1(void) {
        !            73: //    Log_Printf(LOG_WARN, "Keyboard read at $%08x PC=$%08x\n", IoAccessCurrentAddress, m68k_getpc());
        !            74:     IoMem[IoAccessCurrentAddress & 0x1FFFF]=0xF0;
        !            75: }
        !            76: 
        !            77: void Keyboard_Read2(void) {
        !            78: //    Log_Printf(LOG_WARN, "Keyboard read at $%08x PC=$%08x\n", IoAccessCurrentAddress, m68k_getpc());
        !            79:     IoMem[IoAccessCurrentAddress & 0x1FFFF]=0x13;
        !            80: }
        !            81: 
        !            82: void Keycode_Read(void) {
        !            83: //    Log_Printf(LOG_WARN, "Keycode read at $%08x PC=$%08x\n", IoAccessCurrentAddress, m68k_getpc());
        !            84:     IoMem[0xe002]=0x93;
        !            85:     IoMem[0xe008]=0x10;
        !            86:     
        !            87:     IoMem[0xe00a]=modkeys; // Set modifier Keys
        !            88:     IoMem[0xe00b]=nextkeycode; // Press virtual Key
        !            89:     nextkeycode=nextkeycode | 0x80; // Automatically release virtual Key
        !            90: }
        !            91: 
        !            92: 
        !            93: void KeyTranslator(SDL_keysym *sdlkey) { // Translate SDL Keys to NeXT Keycodes
        !            94:     Log_Printf(LOG_WARN, "Key pressed: %s\n", SDL_GetKeyName(sdlkey->sym));
        !            95: 
        !            96:     int symkey = sdlkey->sym;
        !            97:        int modkey = sdlkey->mod;
        !            98:     if (ShortCut_CheckKeys(modkey, symkey, 1)) // Check if we pressed a shortcut
        !            99:         ShortCut_ActKey();
        !           100:     else
        !           101: 
        !           102:     switch (sdlkey->sym) {
        !           103:         
        !           104:         case SDLK_RIGHTBRACKET: nextkeycode = 0x04;
        !           105:             break;
        !           106:         case SDLK_LEFTBRACKET: nextkeycode = 0x05;
        !           107:             break;
        !           108:         case SDLK_i: nextkeycode = 0x06;
        !           109:             break;
        !           110:         case SDLK_o: nextkeycode = 0x07;
        !           111:             break;
        !           112:         case SDLK_p: nextkeycode = 0x08;
        !           113:             break;
        !           114:         case SDLK_LEFT: nextkeycode = 0x09;
        !           115:             break;
        !           116:         case SDLK_KP0: nextkeycode = 0x0B;
        !           117:             break;
        !           118:         case SDLK_KP_PERIOD: nextkeycode = 0x0C;
        !           119:             break;
        !           120:         case SDLK_KP_ENTER: nextkeycode = 0x0D;
        !           121:             break;
        !           122:         case SDLK_DOWN: nextkeycode = 0x0F;
        !           123:             break;
        !           124:         case SDLK_RIGHT: nextkeycode = 0x10;
        !           125:             break;
        !           126:         case SDLK_KP1: nextkeycode = 0x11;
        !           127:             break;
        !           128:         case SDLK_KP4: nextkeycode = 0x12;
        !           129:             break;
        !           130:         case SDLK_KP6: nextkeycode = 0x13;
        !           131:             break;
        !           132:         case SDLK_KP3: nextkeycode = 0x14;
        !           133:             break;
        !           134:         case SDLK_KP_PLUS: nextkeycode = 0x15;
        !           135:             break;
        !           136:         case SDLK_UP: nextkeycode = 0x16;
        !           137:             break;
        !           138:         case SDLK_KP2: nextkeycode = 0x17;
        !           139:             break;
        !           140:         case SDLK_KP5: nextkeycode = 0x18;
        !           141:             break;
        !           142:         case SDLK_BACKSPACE: nextkeycode = 0x1B;
        !           143:             break;
        !           144:         case SDLK_EQUALS: nextkeycode = 0x1C;
        !           145:             break;
        !           146:         case SDLK_MINUS: nextkeycode = 0x1D;
        !           147:             break;
        !           148:         case SDLK_8: nextkeycode = 0x1E;
        !           149:             break;
        !           150:         case SDLK_9: nextkeycode = 0x1F;
        !           151:             break;
        !           152:         case SDLK_0: nextkeycode = 0x20;
        !           153:             break;
        !           154:         case SDLK_KP7: nextkeycode = 0x21;
        !           155:             break;
        !           156:         case SDLK_KP8: nextkeycode = 0x22;
        !           157:             break;
        !           158:         case SDLK_KP9: nextkeycode = 0x23;
        !           159:             break;
        !           160:         case SDLK_KP_MINUS: nextkeycode = 0x24;
        !           161:             break;
        !           162:         case SDLK_KP_MULTIPLY: nextkeycode = 0x25;
        !           163:             break;
        !           164:         case SDLK_BACKQUOTE: nextkeycode = 0x26;
        !           165:             break;
        !           166:         case SDLK_KP_EQUALS: nextkeycode = 0x27;
        !           167:             break;
        !           168:         case SDLK_KP_DIVIDE: nextkeycode = 0x28;
        !           169:             break;            
        !           170:         case SDLK_RETURN: nextkeycode = 0x2A;
        !           171:             break;
        !           172:         case SDLK_BACKSLASH: nextkeycode = 0x2B;
        !           173:             break;
        !           174:         case SDLK_SEMICOLON: nextkeycode = 0x2C;
        !           175:             break;
        !           176:         case SDLK_l: nextkeycode = 0x2D;
        !           177:             break;
        !           178:         case SDLK_COMMA: nextkeycode = 0x2E;
        !           179:             break;
        !           180:         case SDLK_PERIOD: nextkeycode = 0x2F;
        !           181:             break;
        !           182:         case SDLK_SLASH: nextkeycode = 0x30;
        !           183:             break;
        !           184:         case SDLK_z: nextkeycode = 0x31;
        !           185:             break;
        !           186:         case SDLK_x: nextkeycode = 0x32;
        !           187:             break;
        !           188:         case SDLK_c: nextkeycode = 0x33;
        !           189:             break;
        !           190:         case SDLK_v: nextkeycode = 0x34;
        !           191:             break;
        !           192:         case SDLK_b: nextkeycode = 0x35;
        !           193:             break;
        !           194:         case SDLK_m: nextkeycode = 0x36;
        !           195:             break;
        !           196:         case SDLK_n: nextkeycode = 0x37;
        !           197:             break;
        !           198:         case SDLK_SPACE: nextkeycode = 0x38;
        !           199:             break;
        !           200:         case SDLK_a: nextkeycode = 0x39;
        !           201:             break;
        !           202:         case SDLK_s: nextkeycode = 0x3A;
        !           203:             break;
        !           204:         case SDLK_d: nextkeycode = 0x3B;
        !           205:             break;
        !           206:         case SDLK_f: nextkeycode = 0x3C;
        !           207:             break;            
        !           208:         case SDLK_g: nextkeycode = 0x3D;
        !           209:             break;
        !           210:         case SDLK_k: nextkeycode = 0x3E;
        !           211:             break;
        !           212:         case SDLK_j: nextkeycode = 0x3F;
        !           213:             break;
        !           214:         case SDLK_h: nextkeycode = 0x40;
        !           215:             break;
        !           216:         case SDLK_TAB: nextkeycode = 0x41;
        !           217:             break;
        !           218:         case SDLK_q: nextkeycode = 0x42;
        !           219:             break;
        !           220:         case SDLK_w: nextkeycode = 0x43;
        !           221:             break;
        !           222:         case SDLK_e: nextkeycode = 0x44;
        !           223:             break;
        !           224:         case SDLK_r: nextkeycode = 0x45;
        !           225:             break;
        !           226:         case SDLK_u: nextkeycode = 0x46;
        !           227:             break;
        !           228:         case SDLK_y: nextkeycode = 0x47;
        !           229:             break;
        !           230:         case SDLK_t: nextkeycode = 0x48;
        !           231:             break;
        !           232:         case SDLK_ESCAPE: nextkeycode = 0x49;
        !           233:             break;
        !           234:         case SDLK_1: nextkeycode = 0x4A;
        !           235:             break;
        !           236:         case SDLK_2: nextkeycode = 0x4B;
        !           237:             break;
        !           238:         case SDLK_3: nextkeycode = 0x4C;
        !           239:             break;
        !           240:         case SDLK_4: nextkeycode = 0x4D;
        !           241:             break;
        !           242:         case SDLK_7: nextkeycode = 0x4E;
        !           243:             break;
        !           244:         case SDLK_6: nextkeycode = 0x4F;
        !           245:             break;
        !           246:         case SDLK_5: nextkeycode = 0x50;
        !           247:             break;
        !           248:             
        !           249:         /* Modifier Keys */
        !           250:         case SDLK_RMETA: ctrl = 0x01;
        !           251:             break;
        !           252:         case SDLK_LMETA: ctrl = 0x01;
        !           253:             break;
        !           254:         case SDLK_LSHIFT: lshift = 0x02;
        !           255:             break;
        !           256:         case SDLK_RSHIFT: rshift = 0x04;
        !           257:             break;
        !           258:         case SDLK_LCTRL: lcom = 0x08;
        !           259:             break;
        !           260:         case SDLK_RCTRL: rcom = 0x10;
        !           261:             break;
        !           262:         case SDLK_LALT: lalt = 0x20;
        !           263:             break;
        !           264:         case SDLK_RALT: ralt = 0x40;
        !           265:             break;
        !           266:         case SDLK_CAPSLOCK: lshift = 0x02, rshift = 0x04;
        !           267:             break;
        !           268:             
        !           269:         /* Special keys not yet emulated:
        !           270:          SOUND_UP_KEY           0x1A
        !           271:          SOUND_DOWN_KEY         0x02
        !           272:          BRIGHTNESS_UP_KEY      0x19
        !           273:          BRIGHTNESS_DOWN_KEY   0x01
        !           274:          POWER_KEY              0x58
        !           275:          */
        !           276: 
        !           277:         default: break;
        !           278:     }
        !           279:     modkeys = 0x80 | ralt | lalt | rcom | lcom | rshift | lshift | ctrl;
        !           280:     Log_Printf(LOG_WARN, "Modkeys: $%02x\n", modkeys);
        !           281: }
        !           282: 
        !           283: 
        !           284: void KeyRelease(SDL_keysym *sdlkey) { //release modifier Keys
        !           285:     int symkey = sdlkey->sym;
        !           286:        int modkey = sdlkey->mod;
        !           287:     if (ShortCut_CheckKeys(modkey, symkey, 0))
        !           288:                return;
        !           289: 
        !           290:     switch (sdlkey->sym) {
        !           291:             
        !           292:         case SDLK_RMETA: ctrl = 0x00;
        !           293:             break;
        !           294:         case SDLK_LMETA: ctrl = 0x00;
        !           295:             break;
        !           296:         case SDLK_LSHIFT: lshift = 0x00;
        !           297:             break;
        !           298:         case SDLK_RSHIFT: rshift = 0x00;
        !           299:             break;
        !           300:         case SDLK_LCTRL: lcom = 0x00;
        !           301:             break;
        !           302:         case SDLK_RCTRL: rcom = 0x00;
        !           303:             break;
        !           304:         case SDLK_LALT: lalt = 0x00;
        !           305:             break;
        !           306:         case SDLK_RALT: ralt = 0x00;
        !           307:             break;
        !           308:         case SDLK_CAPSLOCK: lshift = 0x00, rshift = 0x00;
        !           309:             break;
        !           310:         default: break;
        !           311:     }
        !           312:     modkeys = 0x80 | ralt | lalt | rcom | lcom | rshift | lshift | ctrl;
        !           313:     Log_Printf(LOG_WARN, "Modkeys: $%02x\n", modkeys);
        !           314: }
1.1       root      315: 
                    316: 
                    317: 
                    318: /*-----------------------------------------------------------------------*/
                    319: /**
                    320:  * User press key down
                    321:  */
                    322: void Keymap_KeyDown(SDL_keysym *sdlkey)
                    323: {
                    324:        bool bPreviousKeyState;
                    325:        char STScanCode;
                    326:        int symkey = sdlkey->sym;
                    327:        int modkey = sdlkey->mod;
                    328: 
                    329:        /*fprintf(stderr, "keydown: sym=%i scan=%i mod=$%x\n",symkey, sdlkey->scancode, modkey);*/
                    330: 
                    331:        if (ShortCut_CheckKeys(modkey, symkey, 1))
                    332:                return;
                    333: 
                    334: }
                    335: 
                    336: 
                    337: /*-----------------------------------------------------------------------*/
                    338: /**
                    339:  * User released key
                    340:  */
                    341: void Keymap_KeyUp(SDL_keysym *sdlkey)
                    342: {
                    343:        char STScanCode;
                    344:        int symkey = sdlkey->sym;
                    345:        int modkey = sdlkey->mod;
                    346: 
                    347:        /*fprintf(stderr, "keyup: sym=%i scan=%i mod=$%x\n",symkey, sdlkey->scancode, modkey);*/
                    348: 
                    349:        /* Ignore short-cut keys here */
                    350: 
                    351:        if (ShortCut_CheckKeys(modkey, symkey, 0))
                    352:                return;
                    353: 
                    354: 
                    355: }
                    356: 
                    357: /*-----------------------------------------------------------------------*/
                    358: /**
                    359:  * Simulate press or release of a key corresponding to given character
                    360:  */
                    361: void Keymap_SimulateCharacter(char asckey, bool press)
                    362: {
                    363:        SDL_keysym sdlkey;
                    364: 
                    365:        sdlkey.mod = KMOD_NONE;
                    366:        sdlkey.scancode = 0;
                    367:        if (isupper(asckey)) {
                    368:                if (press) {
                    369:                        sdlkey.sym = SDLK_LSHIFT;
                    370:                        Keymap_KeyDown(&sdlkey);
                    371:                }
                    372:                sdlkey.sym = tolower(asckey);
                    373:                sdlkey.mod = KMOD_LSHIFT;
                    374:        } else {
                    375:                sdlkey.sym = asckey;
                    376:        }
                    377:        if (press) {
                    378:                Keymap_KeyDown(&sdlkey);
                    379:        } else {
                    380:                Keymap_KeyUp(&sdlkey);
                    381:                if (isupper(asckey)) {
                    382:                        sdlkey.sym = SDLK_LSHIFT;
                    383:                        Keymap_KeyUp(&sdlkey);
                    384:                }
                    385:        }
                    386: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.