Annotation of hatari/src/gui-sdl/dlgDisk.c, revision 1.1

1.1     ! root        1: /*
        !             2:   Hatari - dlgDisk.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: const char DlgDisk_rcsid[] = "Hatari $Id: dlgDisk.c,v 1.1 2008/02/23 22:14:21 thothy Exp $";
        !             8: 
        !             9: #include <assert.h>
        !            10: #include "main.h"
        !            11: #include "configuration.h"
        !            12: #include "dialog.h"
        !            13: #include "sdlgui.h"
        !            14: #include "file.h"
        !            15: #include "floppy.h"
        !            16: 
        !            17: 
        !            18: #define DISKDLG_EJECTA      4
        !            19: #define DISKDLG_BROWSEA     5
        !            20: #define DISKDLG_DISKA       6
        !            21: #define DISKDLG_EJECTB      8
        !            22: #define DISKDLG_BROWSEB     9
        !            23: #define DISKDLG_DISKB       10
        !            24: #define DISKDLG_IMGDIR      12
        !            25: #define DISKDLG_BROWSEIMG   13
        !            26: #define DISKDLG_AUTOB       14
        !            27: #define DISKDLG_CREATEIMG   15
        !            28: #define DISKDLG_PROTOFF     17
        !            29: #define DISKDLG_PROTON      18
        !            30: #define DISKDLG_PROTAUTO    19
        !            31: #define DISKDLG_EJECTHDIMG  23
        !            32: #define DISKDLG_BROWSEHDIMG 24
        !            33: #define DISKDLG_DISKHDIMG   25
        !            34: #define DISKDLG_UNMOUNTGDOS 27
        !            35: #define DISKDLG_BROWSEGDOS  28
        !            36: #define DISKDLG_DISKGDOS    29
        !            37: #define DISKDLG_BOOTHD      30
        !            38: #define DISKDLG_EXIT        31
        !            39: 
        !            40: 
        !            41: /* The disks dialog: */
        !            42: static SGOBJ diskdlg[] =
        !            43: {
        !            44:        { SGBOX, 0, 0, 0,0, 64,25, NULL },
        !            45: 
        !            46:        { SGBOX, 0, 0, 1,1, 62,12, NULL },
        !            47:        { SGTEXT, 0, 0, 25,1, 12,1, "Floppy disks" },
        !            48:        { SGTEXT, 0, 0, 2,2, 8,1, "Drive A:" },
        !            49:        { SGBUTTON, 0, 0, 46,2, 7,1, "Eject" },
        !            50:        { SGBUTTON, 0, 0, 54,2, 8,1, "Browse" },
        !            51:        { SGTEXT, 0, 0, 3,3, 58,1, NULL },
        !            52:        { SGTEXT, 0, 0, 2,4, 8,1, "Drive B:" },
        !            53:        { SGBUTTON, 0, 0, 46,4, 7,1, "Eject" },
        !            54:        { SGBUTTON, 0, 0, 54,4, 8,1, "Browse" },
        !            55:        { SGTEXT, 0, 0, 3,5, 58,1, NULL },
        !            56:        { SGTEXT, 0, 0, 2,7, 32,1, "Default floppy images directory:" },
        !            57:        { SGTEXT, 0, 0, 3,8, 58,1, NULL },
        !            58:        { SGBUTTON, 0, 0, 54,7, 8,1, "Browse" },
        !            59:        { SGCHECKBOX, 0, 0, 2,10, 16,1, "Auto insert B" },
        !            60:        { SGBUTTON, 0, 0, 42,10, 20,1, "Create blank image" },
        !            61:        { SGTEXT, 0, 0, 2,12, 17,1, "Write protection:" },
        !            62:        { SGRADIOBUT, 0, 0, 21,12, 5,1, "Off" },
        !            63:        { SGRADIOBUT, 0, 0, 28,12, 5,1, "On" },
        !            64:        { SGRADIOBUT, 0, 0, 34,12, 6,1, "Auto" },
        !            65: 
        !            66:        { SGBOX, 0, 0, 1,14, 62,8, NULL },
        !            67:        { SGTEXT, 0, 0, 27,14, 10,1, "Hard disks" },
        !            68:        { SGTEXT, 0, 0, 2,15, 9,1, "HD image:" },
        !            69:        { SGBUTTON, 0, 0, 46,15, 7,1, "Eject" },
        !            70:        { SGBUTTON, 0, 0, 54,15, 8,1, "Browse" },
        !            71:        { SGTEXT, 0, 0, 3,16, 58,1, NULL },
        !            72:        { SGTEXT, 0, 0, 2,17, 13,1, "GEMDOS drive:" },
        !            73:        { SGBUTTON, 0, 0, 46,17, 7,1, "Eject" },
        !            74:        { SGBUTTON, 0, 0, 54,17, 8,1, "Browse" },
        !            75:        { SGTEXT, 0, 0, 3,18, 58,1, NULL },
        !            76:        { SGCHECKBOX, 0, 0, 2,20, 14,1, "Boot from HD" },
        !            77: 
        !            78:        { SGBUTTON, SG_DEFAULT, 0, 22,23, 20,1, "Back to main menu" },
        !            79:        { -1, 0, 0, 0,0, 0,0, NULL }
        !            80: };
        !            81: 
        !            82: 
        !            83: /**
        !            84:  * Let user browse given disk, insert disk if one selected.
        !            85:  * return FALSE if no disk selected, otherwise return TRUE.
        !            86:  */
        !            87: static BOOL DlgDisk_BrowseDisk(char *dlgname, int drive, int diskid)
        !            88: {
        !            89:        char *selname, *zip_path;
        !            90:        const char *tmpname;
        !            91: 
        !            92:        assert(drive >= 0 && drive < 2);
        !            93:        if (EmulationDrives[drive].bDiskInserted)
        !            94:                tmpname = EmulationDrives[drive].szFileName;
        !            95:        else
        !            96:                tmpname = DialogParams.DiskImage.szDiskImageDirectory;
        !            97: 
        !            98:        selname = SDLGui_FileSelect(tmpname, &zip_path, FALSE);
        !            99:        if (selname)
        !           100:        {
        !           101:                if (!File_DoesFileNameEndWithSlash(selname) && File_Exists(selname))
        !           102:                {
        !           103:                        char *realname;
        !           104:                        /* FIXME: This shouldn't be done here but in Dialog_CopyDialogParamsToConfiguration */
        !           105:                        realname = Floppy_ZipInsertDiskIntoDrive(drive, selname, zip_path);
        !           106:                        /* TODO: error dialog when this fails */
        !           107:                        if (realname)
        !           108:                        {
        !           109:                                File_ShrinkName(dlgname, realname, diskdlg[diskid].w);
        !           110:                                free(realname);
        !           111:                        }
        !           112:                        if (zip_path)
        !           113:                                free(zip_path);
        !           114:                }
        !           115:                else
        !           116:                {
        !           117:                        /* FIXME: This shouldn't be done here but in Dialog_CopyDialogParamsToConfiguration */
        !           118:                        Floppy_EjectDiskFromDrive(0, FALSE);
        !           119:                        dlgname[0] = 0;
        !           120:                }
        !           121:                free(selname);
        !           122:                return TRUE;
        !           123:        }
        !           124:        return FALSE;
        !           125: }
        !           126: 
        !           127: 
        !           128: /**
        !           129:  * Let user browse given directory, set directory if one selected.
        !           130:  * return FALSE if none selected, otherwise return TRUE.
        !           131:  */
        !           132: static BOOL DlgDisk_BrowseDir(char *dlgname, char *confname, int maxlen)
        !           133: {
        !           134:        char *str, *selname;
        !           135: 
        !           136:        selname = SDLGui_FileSelect(confname, NULL, FALSE);
        !           137:        if (selname)
        !           138:        {
        !           139:                strcpy(confname, selname);
        !           140:                free(selname);
        !           141: 
        !           142:                str = strrchr(confname, '/');
        !           143:                if (str != NULL)
        !           144:                        str[1] = 0;
        !           145:                File_CleanFileName(confname);
        !           146:                File_ShrinkName(dlgname, confname, maxlen);
        !           147:                return TRUE;
        !           148:        }
        !           149:        return FALSE;
        !           150: }
        !           151: 
        !           152: /*-----------------------------------------------------------------------*/
        !           153: /*
        !           154:   Show and process the disk image dialog.
        !           155: */
        !           156: void Dialog_DiskDlg(void)
        !           157: {
        !           158:        int but, i;
        !           159:        char dlgnamea[64], dlgnameb[64], dlgdiskdir[64];
        !           160:        char dlgnamegdos[64], dlgnamehdimg[64];
        !           161: 
        !           162:        SDLGui_CenterDlg(diskdlg);
        !           163: 
        !           164:        /* Set up dialog to actual values: */
        !           165: 
        !           166:        /* Disk name A: */
        !           167:        if (EmulationDrives[0].bDiskInserted)
        !           168:                File_ShrinkName(dlgnamea, EmulationDrives[0].szFileName,
        !           169:                                diskdlg[DISKDLG_DISKA].w);
        !           170:        else
        !           171:                dlgnamea[0] = 0;
        !           172:        diskdlg[DISKDLG_DISKA].txt = dlgnamea;
        !           173: 
        !           174:        /* Disk name B: */
        !           175:        if (EmulationDrives[1].bDiskInserted)
        !           176:                File_ShrinkName(dlgnameb, EmulationDrives[1].szFileName,
        !           177:                                diskdlg[DISKDLG_DISKB].w);
        !           178:        else
        !           179:                dlgnameb[0] = 0;
        !           180:        diskdlg[DISKDLG_DISKB].txt = dlgnameb;
        !           181: 
        !           182:        /* Default image directory: */
        !           183:        File_ShrinkName(dlgdiskdir, DialogParams.DiskImage.szDiskImageDirectory,
        !           184:                        diskdlg[DISKDLG_IMGDIR].w);
        !           185:        diskdlg[DISKDLG_IMGDIR].txt = dlgdiskdir;
        !           186: 
        !           187:        /* Auto insert disk B: */
        !           188:        if (DialogParams.DiskImage.bAutoInsertDiskB)
        !           189:                diskdlg[DISKDLG_AUTOB].state |= SG_SELECTED;
        !           190:        else
        !           191:                diskdlg[DISKDLG_AUTOB].state &= ~SG_SELECTED;
        !           192: 
        !           193:        /* Write protection */
        !           194:        for (i = DISKDLG_PROTOFF; i <= DISKDLG_PROTAUTO; i++)
        !           195:        {
        !           196:                diskdlg[i].state &= ~SG_SELECTED;
        !           197:        }
        !           198:        diskdlg[DISKDLG_PROTOFF+DialogParams.DiskImage.nWriteProtection].state |= SG_SELECTED;
        !           199: 
        !           200:        /* Boot from harddisk? */
        !           201:        if (DialogParams.HardDisk.bBootFromHardDisk)
        !           202:                diskdlg[DISKDLG_BOOTHD].state |= SG_SELECTED;
        !           203:        else
        !           204:                diskdlg[DISKDLG_BOOTHD].state &= ~SG_SELECTED;
        !           205: 
        !           206:        /* GEMDOS hard disk directory: */
        !           207:        if (DialogParams.HardDisk.bUseHardDiskDirectories)
        !           208:                File_ShrinkName(dlgnamegdos, DialogParams.HardDisk.szHardDiskDirectories[0],
        !           209:                                diskdlg[DISKDLG_DISKGDOS].w);
        !           210:        else
        !           211:                dlgnamegdos[0] = 0;
        !           212:        diskdlg[DISKDLG_DISKGDOS].txt = dlgnamegdos;
        !           213: 
        !           214:        /* Hard disk image: */
        !           215:        if (DialogParams.HardDisk.bUseHardDiskImage)
        !           216:                File_ShrinkName(dlgnamehdimg, DialogParams.HardDisk.szHardDiskImage,
        !           217:                                diskdlg[DISKDLG_DISKHDIMG].w);
        !           218:        else
        !           219:                dlgnamehdimg[0] = 0;
        !           220:        diskdlg[DISKDLG_DISKHDIMG].txt = dlgnamehdimg;
        !           221: 
        !           222:        /* Draw and process the dialog */
        !           223:        do
        !           224:        {
        !           225:                but = SDLGui_DoDialog(diskdlg, NULL);
        !           226:                switch (but)
        !           227:                {
        !           228:                 case DISKDLG_EJECTA:                         /* Eject disk in drive A: */
        !           229:                        Floppy_EjectDiskFromDrive(0, FALSE);
        !           230:                        dlgnamea[0] = 0;
        !           231:                        break;
        !           232:                 case DISKDLG_BROWSEA:                        /* Choose a new disk A: */
        !           233:                        DlgDisk_BrowseDisk(dlgnamea, 0, DISKDLG_DISKA);
        !           234:                        break;
        !           235:                 case DISKDLG_EJECTB:                         /* Eject disk in drive B: */
        !           236:                        Floppy_EjectDiskFromDrive(1, FALSE);
        !           237:                        dlgnameb[0] = 0;
        !           238:                        break;
        !           239:                case DISKDLG_BROWSEB:                         /* Choose a new disk B: */
        !           240:                        DlgDisk_BrowseDisk(dlgnameb, 1, DISKDLG_DISKB);
        !           241:                        break;
        !           242:                 case DISKDLG_BROWSEIMG:
        !           243:                        DlgDisk_BrowseDir(dlgdiskdir,
        !           244:                                         DialogParams.DiskImage.szDiskImageDirectory,
        !           245:                                         diskdlg[DISKDLG_IMGDIR].w);
        !           246:                        break;
        !           247:                 case DISKDLG_CREATEIMG:
        !           248:                        DlgNewDisk_Main();
        !           249:                        break;
        !           250:                 case DISKDLG_UNMOUNTGDOS:
        !           251:                        DialogParams.HardDisk.bUseHardDiskDirectories = FALSE;
        !           252:                        dlgnamegdos[0] = 0;
        !           253:                        break;
        !           254:                 case DISKDLG_BROWSEGDOS:
        !           255:                        if (DlgDisk_BrowseDir(dlgnamegdos,
        !           256:                                             DialogParams.HardDisk.szHardDiskDirectories[0],
        !           257:                                             diskdlg[DISKDLG_DISKGDOS].w))
        !           258:                                DialogParams.HardDisk.bUseHardDiskDirectories = TRUE;
        !           259:                        break;
        !           260:                 case DISKDLG_EJECTHDIMG:
        !           261:                        DialogParams.HardDisk.bUseHardDiskImage = FALSE;
        !           262:                        dlgnamehdimg[0] = 0;
        !           263:                        break;
        !           264:                 case DISKDLG_BROWSEHDIMG:
        !           265:                        if (SDLGui_FileConfSelect(dlgnamehdimg,
        !           266:                                                  DialogParams.HardDisk.szHardDiskImage,
        !           267:                                                  diskdlg[DISKDLG_DISKHDIMG].w, FALSE))
        !           268:                                DialogParams.HardDisk.bUseHardDiskImage = TRUE;
        !           269:                        break;
        !           270:                }
        !           271:        }
        !           272:        while (but != DISKDLG_EXIT && but != SDLGUI_QUIT
        !           273:                && but != SDLGUI_ERROR && !bQuitProgram);
        !           274: 
        !           275:        /* Read values from dialog: */
        !           276: 
        !           277:        for (i = DISKDLG_PROTOFF; i <= DISKDLG_PROTAUTO; i++)
        !           278:        {
        !           279:                if (diskdlg[i].state & SG_SELECTED)
        !           280:                {
        !           281:                        DialogParams.DiskImage.nWriteProtection = i-DISKDLG_PROTOFF;
        !           282:                        break;
        !           283:                }
        !           284:        }
        !           285: 
        !           286:        DialogParams.DiskImage.bAutoInsertDiskB = (diskdlg[DISKDLG_AUTOB].state & SG_SELECTED);
        !           287:        DialogParams.HardDisk.bBootFromHardDisk = (diskdlg[DISKDLG_BOOTHD].state & SG_SELECTED);
        !           288: }

unix.superglobalmegacorp.com

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