|
|
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: */
1.1.1.4 ! root 7: const char DlgDisk_rcsid[] = "Hatari $Id: dlgDisk.c,v 1.8 2008-11-18 19:53:29 eerot Exp $";
1.1 root 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: */
1.1.1.3 root 87: static bool DlgDisk_BrowseDisk(char *dlgname, int drive, int diskid)
1.1 root 88: {
89: char *selname, *zip_path;
90: const char *tmpname;
91:
1.1.1.3 root 92: assert(drive >= 0 && drive < MAX_FLOPPYDRIVES);
93: if (ConfigureParams.DiskImage.szDiskFileName[drive][0])
94: tmpname = ConfigureParams.DiskImage.szDiskFileName[drive];
1.1 root 95: else
1.1.1.3 root 96: tmpname = ConfigureParams.DiskImage.szDiskImageDirectory;
1.1 root 97:
98: selname = SDLGui_FileSelect(tmpname, &zip_path, FALSE);
99: if (selname)
100: {
1.1.1.3 root 101: if (File_Exists(selname))
1.1 root 102: {
1.1.1.3 root 103: const char *realname;
104: realname = Floppy_SetDiskFileName(drive, selname, zip_path);
1.1 root 105: /* TODO: error dialog when this fails */
106: if (realname)
107: {
108: File_ShrinkName(dlgname, realname, diskdlg[diskid].w);
109: }
110: }
111: else
112: {
1.1.1.3 root 113: Floppy_SetDiskFileNameNone(drive);
114: dlgname[0] = '\0';
1.1 root 115: }
1.1.1.4 ! root 116: if (zip_path)
! 117: free(zip_path);
1.1 root 118: free(selname);
119: return TRUE;
120: }
121: return FALSE;
122: }
123:
124:
125: /**
126: * Let user browse given directory, set directory if one selected.
127: * return FALSE if none selected, otherwise return TRUE.
128: */
1.1.1.3 root 129: static bool DlgDisk_BrowseDir(char *dlgname, char *confname, int maxlen)
1.1 root 130: {
131: char *str, *selname;
132:
133: selname = SDLGui_FileSelect(confname, NULL, FALSE);
134: if (selname)
135: {
136: strcpy(confname, selname);
137: free(selname);
138:
1.1.1.2 root 139: str = strrchr(confname, PATHSEP);
1.1 root 140: if (str != NULL)
141: str[1] = 0;
142: File_CleanFileName(confname);
143: File_ShrinkName(dlgname, confname, maxlen);
144: return TRUE;
145: }
146: return FALSE;
147: }
148:
149: /*-----------------------------------------------------------------------*/
150: /*
151: Show and process the disk image dialog.
152: */
153: void Dialog_DiskDlg(void)
154: {
155: int but, i;
1.1.1.3 root 156: char dlgname[MAX_FLOPPYDRIVES][64], dlgdiskdir[64];
1.1 root 157: char dlgnamegdos[64], dlgnamehdimg[64];
158:
159: SDLGui_CenterDlg(diskdlg);
160:
161: /* Set up dialog to actual values: */
162:
163: /* Disk name A: */
164: if (EmulationDrives[0].bDiskInserted)
1.1.1.3 root 165: File_ShrinkName(dlgname[0], ConfigureParams.DiskImage.szDiskFileName[0],
1.1 root 166: diskdlg[DISKDLG_DISKA].w);
167: else
1.1.1.3 root 168: dlgname[0][0] = '\0';
169: diskdlg[DISKDLG_DISKA].txt = dlgname[0];
1.1 root 170:
171: /* Disk name B: */
172: if (EmulationDrives[1].bDiskInserted)
1.1.1.3 root 173: File_ShrinkName(dlgname[1], ConfigureParams.DiskImage.szDiskFileName[1],
1.1 root 174: diskdlg[DISKDLG_DISKB].w);
175: else
1.1.1.3 root 176: dlgname[1][0] = '\0';
177: diskdlg[DISKDLG_DISKB].txt = dlgname[1];
1.1 root 178:
179: /* Default image directory: */
1.1.1.3 root 180: File_ShrinkName(dlgdiskdir, ConfigureParams.DiskImage.szDiskImageDirectory,
1.1 root 181: diskdlg[DISKDLG_IMGDIR].w);
182: diskdlg[DISKDLG_IMGDIR].txt = dlgdiskdir;
183:
184: /* Auto insert disk B: */
1.1.1.3 root 185: if (ConfigureParams.DiskImage.bAutoInsertDiskB)
1.1 root 186: diskdlg[DISKDLG_AUTOB].state |= SG_SELECTED;
187: else
188: diskdlg[DISKDLG_AUTOB].state &= ~SG_SELECTED;
189:
190: /* Write protection */
191: for (i = DISKDLG_PROTOFF; i <= DISKDLG_PROTAUTO; i++)
192: {
193: diskdlg[i].state &= ~SG_SELECTED;
194: }
1.1.1.3 root 195: diskdlg[DISKDLG_PROTOFF+ConfigureParams.DiskImage.nWriteProtection].state |= SG_SELECTED;
1.1 root 196:
197: /* Boot from harddisk? */
1.1.1.3 root 198: if (ConfigureParams.HardDisk.bBootFromHardDisk)
1.1 root 199: diskdlg[DISKDLG_BOOTHD].state |= SG_SELECTED;
200: else
201: diskdlg[DISKDLG_BOOTHD].state &= ~SG_SELECTED;
202:
203: /* GEMDOS hard disk directory: */
1.1.1.3 root 204: if (ConfigureParams.HardDisk.bUseHardDiskDirectories)
205: File_ShrinkName(dlgnamegdos, ConfigureParams.HardDisk.szHardDiskDirectories[0],
1.1 root 206: diskdlg[DISKDLG_DISKGDOS].w);
207: else
1.1.1.3 root 208: dlgnamegdos[0] = '\0';
1.1 root 209: diskdlg[DISKDLG_DISKGDOS].txt = dlgnamegdos;
210:
211: /* Hard disk image: */
1.1.1.3 root 212: if (ConfigureParams.HardDisk.bUseHardDiskImage)
213: File_ShrinkName(dlgnamehdimg, ConfigureParams.HardDisk.szHardDiskImage,
1.1 root 214: diskdlg[DISKDLG_DISKHDIMG].w);
215: else
1.1.1.3 root 216: dlgnamehdimg[0] = '\0';
1.1 root 217: diskdlg[DISKDLG_DISKHDIMG].txt = dlgnamehdimg;
218:
219: /* Draw and process the dialog */
220: do
221: {
222: but = SDLGui_DoDialog(diskdlg, NULL);
223: switch (but)
224: {
225: case DISKDLG_EJECTA: /* Eject disk in drive A: */
1.1.1.3 root 226: Floppy_SetDiskFileNameNone(0);
227: dlgname[0][0] = '\0';
1.1 root 228: break;
229: case DISKDLG_BROWSEA: /* Choose a new disk A: */
1.1.1.3 root 230: DlgDisk_BrowseDisk(dlgname[0], 0, DISKDLG_DISKA);
1.1 root 231: break;
232: case DISKDLG_EJECTB: /* Eject disk in drive B: */
1.1.1.3 root 233: Floppy_SetDiskFileNameNone(1);
234: dlgname[1][0] = '\0';
1.1 root 235: break;
236: case DISKDLG_BROWSEB: /* Choose a new disk B: */
1.1.1.3 root 237: DlgDisk_BrowseDisk(dlgname[1], 1, DISKDLG_DISKB);
1.1 root 238: break;
239: case DISKDLG_BROWSEIMG:
240: DlgDisk_BrowseDir(dlgdiskdir,
1.1.1.3 root 241: ConfigureParams.DiskImage.szDiskImageDirectory,
1.1 root 242: diskdlg[DISKDLG_IMGDIR].w);
243: break;
244: case DISKDLG_CREATEIMG:
245: DlgNewDisk_Main();
246: break;
247: case DISKDLG_UNMOUNTGDOS:
1.1.1.3 root 248: ConfigureParams.HardDisk.bUseHardDiskDirectories = FALSE;
249: dlgnamegdos[0] = '\0';
1.1 root 250: break;
251: case DISKDLG_BROWSEGDOS:
252: if (DlgDisk_BrowseDir(dlgnamegdos,
1.1.1.3 root 253: ConfigureParams.HardDisk.szHardDiskDirectories[0],
1.1 root 254: diskdlg[DISKDLG_DISKGDOS].w))
1.1.1.3 root 255: ConfigureParams.HardDisk.bUseHardDiskDirectories = TRUE;
1.1 root 256: break;
257: case DISKDLG_EJECTHDIMG:
1.1.1.3 root 258: ConfigureParams.HardDisk.bUseHardDiskImage = FALSE;
259: dlgnamehdimg[0] = '\0';
1.1 root 260: break;
261: case DISKDLG_BROWSEHDIMG:
262: if (SDLGui_FileConfSelect(dlgnamehdimg,
1.1.1.3 root 263: ConfigureParams.HardDisk.szHardDiskImage,
1.1 root 264: diskdlg[DISKDLG_DISKHDIMG].w, FALSE))
1.1.1.3 root 265: ConfigureParams.HardDisk.bUseHardDiskImage = TRUE;
1.1 root 266: break;
267: }
268: }
269: while (but != DISKDLG_EXIT && but != SDLGUI_QUIT
270: && but != SDLGUI_ERROR && !bQuitProgram);
271:
272: /* Read values from dialog: */
273:
274: for (i = DISKDLG_PROTOFF; i <= DISKDLG_PROTAUTO; i++)
275: {
276: if (diskdlg[i].state & SG_SELECTED)
277: {
1.1.1.3 root 278: ConfigureParams.DiskImage.nWriteProtection = i-DISKDLG_PROTOFF;
1.1 root 279: break;
280: }
281: }
282:
1.1.1.3 root 283: ConfigureParams.DiskImage.bAutoInsertDiskB = (diskdlg[DISKDLG_AUTOB].state & SG_SELECTED);
284: ConfigureParams.HardDisk.bBootFromHardDisk = (diskdlg[DISKDLG_BOOTHD].state & SG_SELECTED);
1.1 root 285: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.