Annotation of hatari/src/gui-sdl/dlgFloppy.c, revision 1.1.1.7

1.1       root        1: /*
                      2:   Hatari - dlgFloppy.c
                      3: 
1.1.1.4   root        4:   This file is distributed under the GNU General Public License, version 2
                      5:   or at your option any later version. Read the file gpl.txt for details.
1.1       root        6: */
                      7: const char DlgFloppy_fileid[] = "Hatari dlgFloppy.c : " __DATE__ " " __TIME__;
                      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: 
1.1.1.5   root       18: #define FLOPPYDLG_ENABLE_A    3
                     19: #define FLOPPYDLG_HEADS_DS_A  4
                     20: #define FLOPPYDLG_EJECTA      5
                     21: #define FLOPPYDLG_BROWSEA     6
                     22: #define FLOPPYDLG_DISKA       7
                     23: 
                     24: #define FLOPPYDLG_ENABLE_B    9
                     25: #define FLOPPYDLG_HEADS_DS_B  10
                     26: #define FLOPPYDLG_EJECTB      11
                     27: #define FLOPPYDLG_BROWSEB     12
                     28: #define FLOPPYDLG_DISKB       13
                     29: 
                     30: #define FLOPPYDLG_IMGDIR      15
                     31: #define FLOPPYDLG_BROWSEIMG   16
                     32: #define FLOPPYDLG_AUTOB       17
                     33: #define FLOPPYDLG_FASTFLOPPY  18
                     34: #define FLOPPYDLG_CREATEIMG   19
                     35: #define FLOPPYDLG_PROTOFF     21
                     36: #define FLOPPYDLG_PROTON      22
                     37: #define FLOPPYDLG_PROTAUTO    23
                     38: #define FLOPPYDLG_EXIT        24
1.1       root       39: 
                     40: 
                     41: /* The floppy disks dialog: */
                     42: static SGOBJ floppydlg[] =
                     43: {
                     44:        { SGBOX, 0, 0, 0,0, 64,20, NULL },
                     45:        { SGTEXT, 0, 0, 25,1, 12,1, "Floppy disks" },
1.1.1.5   root       46: 
1.1       root       47:        { SGTEXT, 0, 0, 2,3, 8,1, "Drive A:" },
1.1.1.6   root       48:        { SGCHECKBOX, 0, 0, 12,3,  9,1, "En_abled" },
                     49:        { SGCHECKBOX, 0, 0, 23,3, 14,1, "_Double Sided" },
                     50:        { SGBUTTON,   0, 0, 46,3,  7,1, "_Eject" },
                     51:        { SGBUTTON,   0, 0, 54,3,  8,1, "B_rowse" },
1.1       root       52:        { SGTEXT, 0, 0, 3,4, 58,1, NULL },
1.1.1.5   root       53: 
1.1       root       54:        { SGTEXT, 0, 0, 2,6, 8,1, "Drive B:" },
1.1.1.6   root       55:        { SGCHECKBOX, 0, 0, 12,6,  9,1, "Ena_bled" },
                     56:        { SGCHECKBOX, 0, 0, 23,6, 14,1, "Doub_le Sided" },
                     57:        { SGBUTTON,   0, 0, 46,6,  7,1, "E_ject" },
                     58:        { SGBUTTON,   0, 0, 54,6,  8,1, "Bro_wse" },
1.1       root       59:        { SGTEXT, 0, 0, 3,7, 58,1, NULL },
1.1.1.5   root       60: 
1.1       root       61:        { SGTEXT, 0, 0, 2,9, 32,1, "Default floppy images directory:" },
                     62:        { SGTEXT, 0, 0, 3,10, 58,1, NULL },
1.1.1.6   root       63:        { SGBUTTON,   0, 0, 54, 9,  8,1, "Brow_se" },
                     64:        { SGCHECKBOX, 0, 0,  2,12, 15,1, "Auto _insert B" },
                     65:        { SGCHECKBOX, 0, 0,  2,14, 20,1, "_Fast floppy access" },
                     66:        { SGBUTTON,   0, 0, 42,14, 20,1, "_Create blank image" },
1.1       root       67:        { SGTEXT, 0, 0, 2,16, 17,1, "Write protection:" },
1.1.1.6   root       68:        { SGRADIOBUT, 0, 0, 21,16,  5,1, "_Off" },
                     69:        { SGRADIOBUT, 0, 0, 28,16,  4,1, "O_n" },
                     70:        { SGRADIOBUT, 0, 0, 34,16,  6,1, "A_uto" },
1.1       root       71:        { SGBUTTON, SG_DEFAULT, 0, 22,18, 20,1, "Back to main menu" },
1.1.1.7 ! root       72:        { SGSTOP, 0, 0, 0,0, 0,0, NULL }
1.1       root       73: };
                     74: 
                     75: 
1.1.1.2   root       76: #define DLGMOUNT_A       2
                     77: #define DLGMOUNT_B       3
                     78: #define DLGMOUNT_CANCEL  4
                     79: 
                     80: /* The "Alert"-dialog: */
                     81: static SGOBJ alertdlg[] =
                     82: {
                     83:        { SGBOX, 0, 0, 0,0, 40,6, NULL },
                     84:        { SGTEXT, 0, 0, 3,1, 30,1, "Insert last created disk to?" },
1.1.1.6   root       85:        { SGBUTTON, 0, 0,  3,4, 10,1, "Drive _A:" },
                     86:        { SGBUTTON, 0, 0, 15,4, 10,1, "Drive _B:" },
                     87:        { SGBUTTON, SG_CANCEL, 0, 27,4, 10,1, "_Cancel" },
1.1.1.7 ! root       88:        { SGSTOP, 0, 0, 0,0, 0,0, NULL }
1.1.1.2   root       89: };
                     90: 
                     91: 
1.1       root       92: /**
                     93:  * Let user browse given disk, insert disk if one selected.
                     94:  */
1.1.1.2   root       95: static void DlgDisk_BrowseDisk(char *dlgname, int drive, int diskid)
1.1       root       96: {
                     97:        char *selname, *zip_path;
1.1.1.2   root       98:        const char *tmpname, *realname;
1.1       root       99: 
                    100:        assert(drive >= 0 && drive < MAX_FLOPPYDRIVES);
                    101:        if (ConfigureParams.DiskImage.szDiskFileName[drive][0])
                    102:                tmpname = ConfigureParams.DiskImage.szDiskFileName[drive];
                    103:        else
                    104:                tmpname = ConfigureParams.DiskImage.szDiskImageDirectory;
                    105: 
1.1.1.6   root      106:        selname = SDLGui_FileSelect("Floppy image:", tmpname, &zip_path, false);
1.1.1.2   root      107:        if (!selname)
                    108:                return;
                    109: 
                    110:        if (File_Exists(selname))
1.1       root      111:        {
1.1.1.2   root      112:                realname = Floppy_SetDiskFileName(drive, selname, zip_path);
                    113:                if (realname)
                    114:                        File_ShrinkName(dlgname, realname, floppydlg[diskid].w);
                    115:        }
                    116:        else
                    117:        {
                    118:                Floppy_SetDiskFileNameNone(drive);
                    119:                dlgname[0] = '\0';
1.1       root      120:        }
1.1.1.7 ! root      121:        free(zip_path);
1.1.1.2   root      122:        free(selname);
1.1       root      123: }
                    124: 
                    125: 
                    126: /**
                    127:  * Let user browse given directory, set directory if one selected.
                    128:  */
1.1.1.2   root      129: static void DlgDisk_BrowseDir(char *dlgname, char *confname, int maxlen)
1.1       root      130: {
                    131:        char *str, *selname;
                    132: 
1.1.1.6   root      133:        selname = SDLGui_FileSelect("Floppy image directory:", confname, NULL, false);
1.1.1.2   root      134:        if (!selname)
                    135:                return;
                    136: 
                    137:        strcpy(confname, selname);
                    138:        free(selname);
                    139: 
                    140:        str = strrchr(confname, PATHSEP);
                    141:        if (str != NULL)
                    142:                str[1] = 0;
                    143:        File_CleanFileName(confname);
                    144:        File_ShrinkName(dlgname, confname, maxlen);
                    145: }
                    146: 
                    147: 
                    148: /**
                    149:  * Ask whether new disk should be inserted to A: or B: and if yes, insert.
                    150:  */
                    151: static void DlgFloppy_QueryInsert(char *namea, int ida, char *nameb, int idb, const char *path)
                    152: {
                    153:        const char *realname;
                    154:        int diskid, dlgid;
                    155:        char *dlgname;
1.1       root      156: 
1.1.1.2   root      157:        SDLGui_CenterDlg(alertdlg);
1.1.1.6   root      158:        switch (SDLGui_DoDialog(alertdlg, NULL, false))
1.1.1.2   root      159:        {
                    160:                case DLGMOUNT_A:
                    161:                        dlgname = namea;
                    162:                        dlgid = ida;
                    163:                        diskid = 0;
                    164:                        break;
                    165:                case DLGMOUNT_B:
                    166:                        dlgname = nameb;
                    167:                        dlgid = idb;
                    168:                        diskid = 1;
                    169:                        break;
                    170:                default:
                    171:                        return;
1.1       root      172:        }
1.1.1.2   root      173: 
                    174:        realname = Floppy_SetDiskFileName(diskid, path, NULL);
                    175:        if (realname)
                    176:                File_ShrinkName(dlgname, realname, floppydlg[dlgid].w);
1.1       root      177: }
                    178: 
                    179: 
                    180: /**
                    181:  * Show and process the floppy disk image dialog.
                    182:  */
                    183: void DlgFloppy_Main(void)
                    184: {
                    185:        int but, i;
1.1.1.2   root      186:        char *newdisk;
1.1       root      187:        char dlgname[MAX_FLOPPYDRIVES][64], dlgdiskdir[64];
                    188: 
                    189:        SDLGui_CenterDlg(floppydlg);
                    190: 
                    191:        /* Set up dialog to actual values: */
                    192: 
                    193:        /* Disk name A: */
                    194:        if (EmulationDrives[0].bDiskInserted)
                    195:                File_ShrinkName(dlgname[0], ConfigureParams.DiskImage.szDiskFileName[0],
                    196:                                floppydlg[FLOPPYDLG_DISKA].w);
                    197:        else
                    198:                dlgname[0][0] = '\0';
                    199:        floppydlg[FLOPPYDLG_DISKA].txt = dlgname[0];
                    200: 
                    201:        /* Disk name B: */
                    202:        if (EmulationDrives[1].bDiskInserted)
                    203:                File_ShrinkName(dlgname[1], ConfigureParams.DiskImage.szDiskFileName[1],
                    204:                                floppydlg[FLOPPYDLG_DISKB].w);
                    205:        else
                    206:                dlgname[1][0] = '\0';
                    207:        floppydlg[FLOPPYDLG_DISKB].txt = dlgname[1];
                    208: 
                    209:        /* Default image directory: */
                    210:        File_ShrinkName(dlgdiskdir, ConfigureParams.DiskImage.szDiskImageDirectory,
                    211:                        floppydlg[FLOPPYDLG_IMGDIR].w);
                    212:        floppydlg[FLOPPYDLG_IMGDIR].txt = dlgdiskdir;
                    213: 
                    214:        /* Auto insert disk B: */
                    215:        if (ConfigureParams.DiskImage.bAutoInsertDiskB)
                    216:                floppydlg[FLOPPYDLG_AUTOB].state |= SG_SELECTED;
                    217:        else
                    218:                floppydlg[FLOPPYDLG_AUTOB].state &= ~SG_SELECTED;
                    219: 
                    220:        /* Write protection */
                    221:        for (i = FLOPPYDLG_PROTOFF; i <= FLOPPYDLG_PROTAUTO; i++)
                    222:        {
                    223:                floppydlg[i].state &= ~SG_SELECTED;
                    224:        }
                    225:        floppydlg[FLOPPYDLG_PROTOFF+ConfigureParams.DiskImage.nWriteProtection].state |= SG_SELECTED;
                    226: 
1.1.1.3   root      227:        /* Fast floppy access */
                    228:        if (ConfigureParams.DiskImage.FastFloppy)
                    229:                floppydlg[FLOPPYDLG_FASTFLOPPY].state |= SG_SELECTED;
1.1       root      230:        else
1.1.1.3   root      231:                floppydlg[FLOPPYDLG_FASTFLOPPY].state &= ~SG_SELECTED;
1.1       root      232: 
1.1.1.5   root      233:        /* Enable/disable drives A: and B: */
                    234:        if (ConfigureParams.DiskImage.EnableDriveA)
                    235:                floppydlg[FLOPPYDLG_ENABLE_A].state |= SG_SELECTED;
                    236:        else
                    237:                floppydlg[FLOPPYDLG_ENABLE_A].state &= ~SG_SELECTED;
                    238: 
                    239:        if (ConfigureParams.DiskImage.EnableDriveB)
                    240:                floppydlg[FLOPPYDLG_ENABLE_B].state |= SG_SELECTED;
                    241:        else
                    242:                floppydlg[FLOPPYDLG_ENABLE_B].state &= ~SG_SELECTED;
                    243: 
                    244:        /* Set drives to single sided or double sided */
                    245:        if (ConfigureParams.DiskImage.DriveA_NumberOfHeads == 2)
                    246:                floppydlg[FLOPPYDLG_HEADS_DS_A].state |= SG_SELECTED;
                    247:        else
                    248:                floppydlg[FLOPPYDLG_HEADS_DS_A].state &= ~SG_SELECTED;
                    249: 
                    250:        if (ConfigureParams.DiskImage.DriveB_NumberOfHeads == 2)
                    251:                floppydlg[FLOPPYDLG_HEADS_DS_B].state |= SG_SELECTED;
                    252:        else
                    253:                floppydlg[FLOPPYDLG_HEADS_DS_B].state &= ~SG_SELECTED;
                    254: 
                    255: 
1.1       root      256:        /* Draw and process the dialog */
                    257:        do
                    258:        {
1.1.1.6   root      259:                but = SDLGui_DoDialog(floppydlg, NULL, false);
1.1       root      260:                switch (but)
                    261:                {
                    262:                 case FLOPPYDLG_EJECTA:                         /* Eject disk in drive A: */
                    263:                        Floppy_SetDiskFileNameNone(0);
                    264:                        dlgname[0][0] = '\0';
                    265:                        break;
                    266:                 case FLOPPYDLG_BROWSEA:                        /* Choose a new disk A: */
                    267:                        DlgDisk_BrowseDisk(dlgname[0], 0, FLOPPYDLG_DISKA);
                    268:                        break;
                    269:                 case FLOPPYDLG_EJECTB:                         /* Eject disk in drive B: */
                    270:                        Floppy_SetDiskFileNameNone(1);
                    271:                        dlgname[1][0] = '\0';
                    272:                        break;
                    273:                case FLOPPYDLG_BROWSEB:                         /* Choose a new disk B: */
                    274:                        DlgDisk_BrowseDisk(dlgname[1], 1, FLOPPYDLG_DISKB);
                    275:                        break;
                    276:                 case FLOPPYDLG_BROWSEIMG:
                    277:                        DlgDisk_BrowseDir(dlgdiskdir,
                    278:                                         ConfigureParams.DiskImage.szDiskImageDirectory,
                    279:                                         floppydlg[FLOPPYDLG_IMGDIR].w);
                    280:                        break;
                    281:                 case FLOPPYDLG_CREATEIMG:
1.1.1.2   root      282:                        newdisk = DlgNewDisk_Main();
                    283:                        if (newdisk)
                    284:                        {
                    285:                                DlgFloppy_QueryInsert(dlgname[0], FLOPPYDLG_DISKA,
                    286:                                                      dlgname[1], FLOPPYDLG_DISKB,
                    287:                                                      newdisk);
                    288:                                free(newdisk);
                    289:                        }
1.1       root      290:                        break;
                    291:                }
                    292:        }
                    293:        while (but != FLOPPYDLG_EXIT && but != SDLGUI_QUIT
                    294:                && but != SDLGUI_ERROR && !bQuitProgram);
                    295: 
                    296:        /* Read values from dialog: */
                    297: 
                    298:        for (i = FLOPPYDLG_PROTOFF; i <= FLOPPYDLG_PROTAUTO; i++)
                    299:        {
                    300:                if (floppydlg[i].state & SG_SELECTED)
                    301:                {
                    302:                        ConfigureParams.DiskImage.nWriteProtection = i-FLOPPYDLG_PROTOFF;
                    303:                        break;
                    304:                }
                    305:        }
                    306: 
                    307:        ConfigureParams.DiskImage.bAutoInsertDiskB = (floppydlg[FLOPPYDLG_AUTOB].state & SG_SELECTED);
1.1.1.3   root      308:        ConfigureParams.DiskImage.FastFloppy = (floppydlg[FLOPPYDLG_FASTFLOPPY].state & SG_SELECTED);
1.1.1.5   root      309:        ConfigureParams.DiskImage.EnableDriveA = (floppydlg[FLOPPYDLG_ENABLE_A].state & SG_SELECTED);
                    310:        ConfigureParams.DiskImage.EnableDriveB = (floppydlg[FLOPPYDLG_ENABLE_B].state & SG_SELECTED);
                    311:        ConfigureParams.DiskImage.DriveA_NumberOfHeads = ( (floppydlg[FLOPPYDLG_HEADS_DS_A].state & SG_SELECTED) ? 2 : 1 );
                    312:        ConfigureParams.DiskImage.DriveB_NumberOfHeads = ( (floppydlg[FLOPPYDLG_HEADS_DS_B].state & SG_SELECTED) ? 2 : 1 );
1.1       root      313: }

unix.superglobalmegacorp.com

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