Annotation of previous_trunk/src/shortcut.c, revision 1.1

1.1     ! root        1: /*
        !             2:   Hatari - shortcut.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:   Shortcut keys
        !             8: */
        !             9: const char ShortCut_fileid[] = "Hatari shortcut.c : " __DATE__ " " __TIME__;
        !            10: 
        !            11: #include <SDL.h>
        !            12: 
        !            13: #include "main.h"
        !            14: #include "dialog.h"
        !            15: #include "file.h"
        !            16: #include "m68000.h"
        !            17: #include "dimension.hpp"
        !            18: #include "reset.h"
        !            19: #include "screen.h"
        !            20: #include "configuration.h"
        !            21: #include "shortcut.h"
        !            22: #include "debugui.h"
        !            23: #include "sdlgui.h"
        !            24: #include "video.h"
        !            25: #include "snd.h"
        !            26: #include "statusbar.h"
        !            27: 
        !            28: static SHORTCUTKEYIDX ShortCutKey = SHORTCUT_NONE;  /* current shortcut key */
        !            29: 
        !            30: 
        !            31: /*-----------------------------------------------------------------------*/
        !            32: /**
        !            33:  * Shortcut to toggle full-screen
        !            34:  */
        !            35: static void ShortCut_FullScreen(void)
        !            36: {
        !            37:        if (!bInFullScreen)
        !            38:        {
        !            39:                Screen_EnterFullScreen();
        !            40:        }
        !            41:        else
        !            42:        {
        !            43:                Screen_ReturnFromFullScreen();
        !            44:        }
        !            45: }
        !            46: 
        !            47: 
        !            48: /*-----------------------------------------------------------------------*/
        !            49: /**
        !            50:  * Shortcut to toggle mouse grabbing mode
        !            51:  */
        !            52: static void ShortCut_MouseGrab(void)
        !            53: {
        !            54: 
        !            55:        bGrabMouse = !bGrabMouse;        /* Toggle flag */
        !            56: 
        !            57:        /* If we are in windowed mode, toggle the mouse cursor mode now: */
        !            58:        if (!bInFullScreen)
        !            59:        {
        !            60:                if (bGrabMouse)
        !            61:                {
        !            62:                        SDL_SetRelativeMouseMode(SDL_TRUE);
        !            63:             SDL_SetWindowGrab(sdlWindow, SDL_TRUE);
        !            64:             Main_SetTitle(MOUSE_LOCK_MSG);
        !            65:                }
        !            66:                else
        !            67:                {
        !            68:                        SDL_SetRelativeMouseMode(SDL_FALSE);
        !            69:             SDL_SetWindowGrab(sdlWindow, SDL_FALSE);
        !            70:             Main_SetTitle(NULL);
        !            71:                }
        !            72:        }
        !            73: }
        !            74: 
        !            75: 
        !            76: /*-----------------------------------------------------------------------*/
        !            77: /**
        !            78:  * Shortcut to sound on/off
        !            79:  */
        !            80: static void ShortCut_SoundOnOff(void)
        !            81: {
        !            82:     ConfigureParams.Sound.bEnableSound = !ConfigureParams.Sound.bEnableSound;
        !            83:     
        !            84:     Sound_Reset();
        !            85: }
        !            86: 
        !            87: /*-----------------------------------------------------------------------*/
        !            88: /**
        !            89:  * Shorcut to M68K debug interface
        !            90:  */
        !            91: void ShortCut_Debug_M68K(void)
        !            92: {
        !            93:        int running;
        !            94: 
        !            95:        running = Main_PauseEmulation(true);
        !            96:     /* Call the debugger */
        !            97:        DebugUI();
        !            98:        if (running)
        !            99:                Main_UnPauseEmulation();
        !           100: }
        !           101: 
        !           102: /*-----------------------------------------------------------------------*/
        !           103: /**
        !           104:  * Shorcut to I860 debug interface
        !           105:  */
        !           106: void ShortCut_Debug_I860(void) {
        !           107:     int running;
        !           108:     
        !           109:     if (bInFullScreen)
        !           110:         Screen_ReturnFromFullScreen();
        !           111: 
        !           112:     running = Main_PauseEmulation(true);
        !           113:     
        !           114:     /* override paused message so that user knows to look into console
        !           115:      * on how to continue in case he invoked the debugger by accident.
        !           116:      */
        !           117:     Statusbar_AddMessage("I860 Console Debugger", 100);
        !           118:     Statusbar_Update(sdlscrn);
        !           119:     
        !           120:     /* disable normal GUI alerts while on console */
        !           121:     int alertLevel = Log_SetAlertLevel(LOG_FATAL);
        !           122:     
        !           123:     /* Call the debugger */
        !           124:     nd_start_debugger();
        !           125:     Log_SetAlertLevel(alertLevel);
        !           126: 
        !           127:     if (running)
        !           128:         Main_UnPauseEmulation();
        !           129: }
        !           130: 
        !           131: /*-----------------------------------------------------------------------*/
        !           132: /**
        !           133:  * Shorcut to pausing
        !           134:  */
        !           135: static void ShortCut_Pause(void)
        !           136: {
        !           137:        if (!Main_UnPauseEmulation())
        !           138:                Main_PauseEmulation(true);
        !           139: }
        !           140: 
        !           141: /**
        !           142:  * Shorcut to switch monochrome and dimension screen
        !           143:  */
        !           144: static void ShortCut_Dimension(void)
        !           145: {
        !           146:        if (ConfigureParams.System.nMachineType==NEXT_STATION ||
        !           147:         ConfigureParams.Screen.nMonitorType==MONITOR_TYPE_DUAL) {
        !           148:                return;
        !           149:        }
        !           150:     
        !           151:     while (ConfigureParams.Screen.nMonitorNum < ND_MAX_BOARDS) {
        !           152:         if (ConfigureParams.Screen.nMonitorType==MONITOR_TYPE_CPU) {
        !           153:             ConfigureParams.Screen.nMonitorType = MONITOR_TYPE_DIMENSION;
        !           154:             ConfigureParams.Screen.nMonitorNum = 0;
        !           155:         } else {
        !           156:             ConfigureParams.Screen.nMonitorNum++;
        !           157:         }
        !           158:         if (ConfigureParams.Screen.nMonitorNum==ND_MAX_BOARDS) {
        !           159:             ConfigureParams.Screen.nMonitorType = MONITOR_TYPE_CPU;
        !           160:             ConfigureParams.Screen.nMonitorNum = 0;
        !           161:             break;
        !           162:         }
        !           163:         if (ConfigureParams.Dimension.board[ConfigureParams.Screen.nMonitorNum].bEnabled) {
        !           164:             break;
        !           165:         }
        !           166:     }
        !           167:     
        !           168:        Statusbar_UpdateInfo();
        !           169: }
        !           170: 
        !           171: 
        !           172: /*-----------------------------------------------------------------------*/
        !           173: /**
        !           174:  * Check to see if pressed any shortcut keys, and call handling function
        !           175:  */
        !           176: void ShortCut_ActKey(void)
        !           177: {
        !           178:        if (ShortCutKey == SHORTCUT_NONE)
        !           179:                return;
        !           180: 
        !           181:        switch (ShortCutKey)
        !           182:        {
        !           183:         case SHORTCUT_OPTIONS:
        !           184:                Dialog_DoProperty();           /* Show options dialog */
        !           185:                break;
        !           186:         case SHORTCUT_FULLSCREEN:
        !           187:                ShortCut_FullScreen();         /* Switch between fullscreen/windowed mode */
        !           188:                break;
        !           189:         case SHORTCUT_MOUSEGRAB:
        !           190:                ShortCut_MouseGrab();          /* Toggle mouse grab */
        !           191:                break;
        !           192:         case SHORTCUT_COLDRESET:
        !           193:                Main_UnPauseEmulation();
        !           194:                Reset_Cold();                  /* Reset emulator with 'cold' (clear all) */
        !           195:                break;
        !           196:         case SHORTCUT_SOUND:
        !           197:                ShortCut_SoundOnOff();         /* Enable/disable sound */
        !           198:                break;
        !           199:         case SHORTCUT_DEBUG_M68K:
        !           200:                ShortCut_Debug_M68K();         /* Invoke the Debug UI */
        !           201:                break;
        !           202:         case SHORTCUT_DEBUG_I860:
        !           203:                ShortCut_Debug_I860();         /* Invoke the M68K UI */
        !           204:                break;
        !           205:         case SHORTCUT_PAUSE:
        !           206:                ShortCut_Pause();              /* Invoke Pause */
        !           207:                break;
        !           208:         case SHORTCUT_QUIT:
        !           209:                Main_RequestQuit();
        !           210:                break;
        !           211:         case SHORTCUT_DIMENSION:
        !           212:                ShortCut_Dimension();
        !           213:                break;
        !           214:         case SHORTCUT_KEYS:
        !           215:         case SHORTCUT_NONE:
        !           216:                /* ERROR: cannot happen, just make compiler happy */
        !           217:         default:
        !           218:                break;
        !           219:        }
        !           220:        ShortCutKey = SHORTCUT_NONE;
        !           221: }
        !           222: 
        !           223: 
        !           224: /*-----------------------------------------------------------------------*/
        !           225: /**
        !           226:  * Invoke shortcut identified by name. This supports only keys for
        !           227:  * functionality that cannot be invoked with command line options
        !           228:  * or otherwise for remote GUIs etc.
        !           229:  */
        !           230: bool Shortcut_Invoke(const char *shortcut)
        !           231: {
        !           232:        struct {
        !           233:                SHORTCUTKEYIDX id;
        !           234:                const char *name;
        !           235:        } shortcuts[] = {
        !           236:                { SHORTCUT_MOUSEGRAB, "mousegrab" },
        !           237:                { SHORTCUT_COLDRESET, "coldreset" },
        !           238:                { SHORTCUT_WARMRESET, "warmreset" },
        !           239:                { SHORTCUT_QUIT, "quit" },
        !           240:                { SHORTCUT_NONE, NULL }
        !           241:        };
        !           242:        int i;
        !           243: 
        !           244:        if (ShortCutKey != SHORTCUT_NONE)
        !           245:        {
        !           246:                fprintf(stderr, "Shortcut invocation failed, shortcut already active\n");
        !           247:                return false;
        !           248:        }
        !           249:        for (i = 0; shortcuts[i].name; i++)
        !           250:        {
        !           251:                if (strcmp(shortcut, shortcuts[i].name) == 0)
        !           252:                {
        !           253:                        ShortCutKey = shortcuts[i].id;
        !           254:                        ShortCut_ActKey();
        !           255:                        ShortCutKey = SHORTCUT_NONE;
        !           256:                        return true;
        !           257:                }
        !           258:        }
        !           259:        fprintf(stderr, "WARNING: unknown shortcut '%s'\n\n", shortcut);
        !           260:        fprintf(stderr, "Hatari shortcuts are:\n");
        !           261:        for (i = 0; shortcuts[i].name; i++)
        !           262:        {
        !           263:                fprintf(stderr, "- %s\n", shortcuts[i].name);
        !           264:        }
        !           265:        return false;
        !           266: }
        !           267: 
        !           268: 
        !           269: /*-----------------------------------------------------------------------*/
        !           270: /**
        !           271:  * Check whether given key was any of the ones in given shortcut array.
        !           272:  * Return corresponding array index or SHORTCUT_NONE for no match
        !           273:  */
        !           274: static SHORTCUTKEYIDX ShortCut_CheckKey(int symkey, int *keys)
        !           275: {
        !           276:        SHORTCUTKEYIDX key;
        !           277:        for (key = SHORTCUT_OPTIONS; key < SHORTCUT_KEYS; key++)
        !           278:        {
        !           279:                if (symkey == keys[key])
        !           280:                        return key;
        !           281:        }
        !           282:        return SHORTCUT_NONE;
        !           283: }
        !           284: 
        !           285: /*-----------------------------------------------------------------------*/
        !           286: /**
        !           287:  * Check which Shortcut key is pressed/released.
        !           288:  * If press is set, store the key array index.
        !           289:  * Return zero if key didn't match to a shortcut
        !           290:  */
        !           291: int ShortCut_CheckKeys(int modkey, int symkey, bool press)
        !           292: {
        !           293:        SHORTCUTKEYIDX key;
        !           294: 
        !           295: #if defined(__APPLE__)
        !           296:     if ((modkey&(KMOD_RCTRL|KMOD_LCTRL)) && (modkey&(KMOD_RALT|KMOD_LALT)))
        !           297: #else
        !           298:        if (modkey & (KMOD_RALT|KMOD_LGUI|KMOD_RGUI|KMOD_MODE))
        !           299: #endif
        !           300:                key = ShortCut_CheckKey(symkey, ConfigureParams.Shortcut.withModifier);
        !           301:        else
        !           302:                key = ShortCut_CheckKey(symkey, ConfigureParams.Shortcut.withoutModifier);
        !           303: 
        !           304:        if (key == SHORTCUT_NONE)
        !           305:                return 0;
        !           306:        if (press) {
        !           307:                ShortCutKey = key;
        !           308:                fprintf(stderr,"Short :%x\n",ShortCutKey);
        !           309:        }
        !           310:        return 1;
        !           311: }

unix.superglobalmegacorp.com

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