Annotation of previous/src/change.c, revision 1.1

1.1     ! root        1: /*
        !             2:   Hatari - change.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:   This code handles run-time configuration changes. We keep all our
        !             8:   configuration details in a structure called 'ConfigureParams'.  Before
        !             9:   doing he changes, a backup copy is done of this structure. When
        !            10:   the changes are done, these are compared to see whether emulator
        !            11:   needs to be rebooted
        !            12: */
        !            13: const char Change_fileid[] = "Hatari change.c : " __DATE__ " " __TIME__;
        !            14: 
        !            15: #include <ctype.h>
        !            16: #include "main.h"
        !            17: #include "configuration.h"
        !            18: #include "change.h"
        !            19: #include "dialog.h"
        !            20: #include "ioMem.h"
        !            21: #include "m68000.h"
        !            22: #include "options.h"
        !            23: #include "reset.h"
        !            24: #include "screen.h"
        !            25: #include "statusbar.h"
        !            26: #include "video.h"
        !            27: #include "hatari-glue.h"
        !            28: 
        !            29: 
        !            30: /*-----------------------------------------------------------------------*/
        !            31: /**
        !            32:  * Check if user needs to be warned that changes will take place after reset.
        !            33:  * Return true if wants to reset.
        !            34:  */
        !            35: bool Change_DoNeedReset(CNF_PARAMS *current, CNF_PARAMS *changed)
        !            36: {
        !            37:                return true;
        !            38: }
        !            39: 
        !            40: 
        !            41: /*-----------------------------------------------------------------------*/
        !            42: /**
        !            43:  * Copy details back to configuration and perform reset.
        !            44:  */
        !            45: void Change_CopyChangedParamsToConfiguration(CNF_PARAMS *current, CNF_PARAMS *changed, bool bForceReset)
        !            46: {
        !            47:        bool NeedReset;
        !            48:        bool bReInitGemdosDrive = false;
        !            49:        bool bReInitAcsiEmu = false;
        !            50:        bool bReInitIDEEmu = false;
        !            51:        bool bReInitIoMem = false;
        !            52:        bool bScreenModeChange = false;
        !            53:        bool bReInitMidi = false;
        !            54:        bool bFloppyInsert[MAX_FLOPPYDRIVES];
        !            55:        int i;
        !            56: 
        !            57:        /* Do we need to warn user that changes will only take effect after reset? */
        !            58:        if (bForceReset)
        !            59:                NeedReset = bForceReset;
        !            60:        else
        !            61:                NeedReset = Change_DoNeedReset(current, changed);
        !            62: 
        !            63: 
        !            64:        /* Copy details to configuration,
        !            65:         * so it can be saved out or set on reset
        !            66:         */
        !            67:        if (changed != &ConfigureParams)
        !            68:        {
        !            69:                ConfigureParams = *changed;
        !            70:        }
        !            71: 
        !            72:        /* Copy details to global, if we reset copy them all */
        !            73:        Configuration_Apply(NeedReset);
        !            74: 
        !            75: 
        !            76:        /* Re-init IO memory map? */
        !            77:        if (bReInitIoMem)
        !            78:        {
        !            79:                IoMem_Init();
        !            80:        }
        !            81: 
        !            82: 
        !            83:        /* Force things associated with screen change */
        !            84:        if (bScreenModeChange)
        !            85:        {
        !            86:                Screen_ModeChanged();
        !            87:        }
        !            88: 
        !            89:        /* Do we need to perform reset? */
        !            90:        if (NeedReset)
        !            91:        {
        !            92:                Reset_Cold();
        !            93:        }
        !            94: 
        !            95:        /* Go into/return from full screen if flagged */
        !            96:        if (!bInFullScreen && ConfigureParams.Screen.bFullScreen)
        !            97:                Screen_EnterFullScreen();
        !            98:        else if (bInFullScreen && !ConfigureParams.Screen.bFullScreen)
        !            99:                Screen_ReturnFromFullScreen();
        !           100: 
        !           101:        /* update statusbar info (CPU, MHz, mem etc) */
        !           102:        Statusbar_UpdateInfo();
        !           103: }
        !           104: 
        !           105: 
        !           106: /*-----------------------------------------------------------------------*/
        !           107: /**
        !           108:  * Change given Hatari options
        !           109:  * Return false if parsing failed, true otherwise
        !           110:  */
        !           111: static bool Change_Options(int argc, const char *argv[])
        !           112: {
        !           113:        bool bOK;
        !           114:        CNF_PARAMS current;
        !           115: 
        !           116:        Main_PauseEmulation(false);
        !           117: 
        !           118:        /* get configuration changes */
        !           119:        current = ConfigureParams;
        !           120:        ConfigureParams.Screen.bFullScreen = bInFullScreen;
        !           121:        bOK = Opt_ParseParameters(argc, argv);
        !           122: 
        !           123:        /* Check if reset is required and ask user if he really wants to continue */
        !           124:        if (bOK && Change_DoNeedReset(&current, &ConfigureParams)
        !           125:            && current.Log.nAlertDlgLogLevel >= LOG_WARN) {
        !           126:                bOK = DlgAlert_Query("The emulated system must be "
        !           127:                                     "reset to apply these changes. "
        !           128:                                     "Apply changes now and reset "
        !           129:                                     "the emulator?");
        !           130:        }
        !           131:        /* Copy details to configuration */
        !           132:        if (bOK) {
        !           133:                Change_CopyChangedParamsToConfiguration(&current, &ConfigureParams, false);
        !           134:        } else {
        !           135:                ConfigureParams = current;
        !           136:        }
        !           137: 
        !           138:        Main_UnPauseEmulation();
        !           139:        return bOK;
        !           140: }
        !           141: 
        !           142: 
        !           143: /*-----------------------------------------------------------------------*/
        !           144: /**
        !           145:  * Parse given command line and change Hatari options accordingly
        !           146:  * Return false if parsing failed or there were no args, true otherwise
        !           147:  */
        !           148: bool Change_ApplyCommandline(char *cmdline)
        !           149: {
        !           150:        int i, argc, inarg;
        !           151:        const char **argv;
        !           152:        bool ret;
        !           153: 
        !           154:        /* count args */
        !           155:        inarg = argc = 0;
        !           156:        for (i = 0; cmdline[i]; i++)
        !           157:        {
        !           158:                if (isspace(cmdline[i]))
        !           159:                {
        !           160:                        inarg = 0;
        !           161:                        continue;
        !           162:                }
        !           163:                if (!inarg)
        !           164:                {
        !           165:                        inarg++;
        !           166:                        argc++;
        !           167:                }
        !           168:        }
        !           169:        if (!argc)
        !           170:        {
        !           171:                return false;
        !           172:        }
        !           173:        /* 2 = "hatari" + NULL */
        !           174:        argv = malloc((argc+2) * sizeof(char*));
        !           175:        if (!argv)
        !           176:        {
        !           177:                perror("command line alloc");
        !           178:                return false;
        !           179:        }
        !           180: 
        !           181:        /* parse them to array */
        !           182:        fprintf(stderr, "Command line with '%d' arguments:\n", argc);
        !           183:        inarg = argc = 0;
        !           184:        argv[argc++] = "hatari";
        !           185:        for (i = 0; cmdline[i]; i++)
        !           186:        {
        !           187:                if (isspace(cmdline[i]))
        !           188:                {
        !           189:                        cmdline[i] = '\0';
        !           190:                        if (inarg)
        !           191:                        {
        !           192:                                fprintf(stderr, "- '%s'\n", argv[argc-1]);
        !           193:                        }
        !           194:                        inarg = 0;
        !           195:                        continue;
        !           196:                }
        !           197:                if (!inarg)
        !           198:                {
        !           199:                        argv[argc++] = &(cmdline[i]);
        !           200:                        inarg++;
        !           201:                }
        !           202:        }
        !           203:        if (inarg)
        !           204:        {
        !           205:                fprintf(stderr, "- '%s'\n", argv[argc-1]);
        !           206:        }
        !           207:        argv[argc] = NULL;
        !           208:        
        !           209:        /* do args */
        !           210:        ret = Change_Options(argc, argv);
        !           211:        free((void *)argv);
        !           212:        return ret;
        !           213: }

unix.superglobalmegacorp.com

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