1 /*
2  *  Prefs_Amiga.i - Global preferences, Amiga specific stuff
3  *
4  *  Frodo (C) 1994-1997,2002 Christian Bauer
5  */
6 
7 #include <intuition/intuition.h>
8 #include <intuition/gadgetclass.h>
9 #include <libraries/asl.h>
10 #include <proto/exec.h>
11 #include <proto/gadtools.h>
12 #include <proto/asl.h>
13 #include <proto/dos.h>
14 
15 extern "C" {
16 #include "AmigaGUI.h"
17 }
18 
19 
20 // Flag: All done, close prefs window
21 static bool done, result;
22 
23 // Pointer to preferences being edited
24 static Prefs *prefs;
25 
26 // Pointer to prefs file name
27 static char *path;
28 
29 // File requesters
30 struct FileRequester *open_req, *save_req, *drive_req;
31 
32 // Prototypes
33 static void set_values(void);
34 static void get_values(void);
35 static void ghost_gadgets(void);
36 static void get_drive(int i);
37 
38 
39 /*
40  *  Show preferences editor (synchronously)
41  *  prefs_name points to the file name of the preferences (which may be changed)
42  */
43 
ShowEditor(bool startup,char * prefs_name)44 bool Prefs::ShowEditor(bool startup, char *prefs_name)
45 {
46 	done = result = FALSE;
47 	prefs = this;
48 	path = prefs_name;
49 	open_req = save_req = NULL;
50 
51 	// Open prefs window
52 	if (!SetupScreen()) {
53 		if (!OpenPrefsWindow()) {
54 
55 			// Allocate file requesters
56 			open_req = (struct FileRequester *)AllocAslRequestTags(ASL_FileRequest,
57 				ASLFR_Window, (ULONG)PrefsWnd,
58 				ASLFR_SleepWindow, TRUE,
59 				ASLFR_TitleText, (ULONG)"Frodo: Open preferences...",
60 				ASLFR_RejectIcons, TRUE,
61 				TAG_DONE);
62 			save_req = (struct FileRequester *)AllocAslRequestTags(ASL_FileRequest,
63 				ASLFR_Window, (ULONG)PrefsWnd,
64 				ASLFR_SleepWindow, TRUE,
65 				ASLFR_TitleText, (ULONG)"Frodo: Save preferences as...",
66 				ASLFR_DoSaveMode, TRUE,
67 				ASLFR_RejectIcons, TRUE,
68 				TAG_DONE);
69 			drive_req = (struct FileRequester *)AllocAslRequestTags(ASL_FileRequest,
70 				ASLFR_Window, (ULONG)PrefsWnd,
71 				ASLFR_SleepWindow, TRUE,
72 				ASLFR_RejectIcons, TRUE,
73 				TAG_DONE);
74 
75 			// Handle prefs window
76 			set_values();
77 			while (!done) {
78 				WaitPort(PrefsWnd->UserPort);
79 				HandlePrefsIDCMP();
80 			}
81 
82 			// Free file requesters
83 			FreeAslRequest(open_req);
84 			FreeAslRequest(save_req);
85 			FreeAslRequest(drive_req);
86 		}
87 		ClosePrefsWindow();
88 	}
89 	CloseDownScreen();
90 
91 	return result;
92 }
93 
94 
95 /*
96  *  Set the values of the gadgets
97  */
98 
set_values(void)99 static void set_values(void)
100 {
101 	prefs->Check();
102 
103 	GT_SetGadgetAttrs(PrefsGadgets[GDX_NormalCycles], PrefsWnd, NULL, GTIN_Number, prefs->NormalCycles, TAG_DONE);
104 	GT_SetGadgetAttrs(PrefsGadgets[GDX_BadLineCycles], PrefsWnd, NULL, GTIN_Number, prefs->BadLineCycles, TAG_DONE);
105 	GT_SetGadgetAttrs(PrefsGadgets[GDX_CIACycles], PrefsWnd, NULL, GTIN_Number, prefs->CIACycles, TAG_DONE);
106 	GT_SetGadgetAttrs(PrefsGadgets[GDX_FloppyCycles], PrefsWnd, NULL, GTIN_Number, prefs->FloppyCycles, TAG_DONE);
107 	GT_SetGadgetAttrs(PrefsGadgets[GDX_SkipFrames], PrefsWnd, NULL, GTIN_Number, prefs->SkipFrames, TAG_DONE);
108 
109 	GT_SetGadgetAttrs(PrefsGadgets[GDX_SIDType], PrefsWnd, NULL, GTCY_Active, prefs->SIDType, TAG_DONE);
110 	GT_SetGadgetAttrs(PrefsGadgets[GDX_REUSize], PrefsWnd, NULL, GTCY_Active, prefs->REUSize, TAG_DONE);
111 
112 	GT_SetGadgetAttrs(PrefsGadgets[GDX_SpritesOn], PrefsWnd, NULL, GTCB_Checked, prefs->SpritesOn, TAG_DONE);
113 	GT_SetGadgetAttrs(PrefsGadgets[GDX_SpriteCollisions], PrefsWnd, NULL, GTCB_Checked, prefs->SpriteCollisions, TAG_DONE);
114 	GT_SetGadgetAttrs(PrefsGadgets[GDX_Joystick2On], PrefsWnd, NULL, GTCB_Checked, prefs->Joystick2On, TAG_DONE);
115 	GT_SetGadgetAttrs(PrefsGadgets[GDX_JoystickSwap], PrefsWnd, NULL, GTCB_Checked, prefs->JoystickSwap, TAG_DONE);
116 	GT_SetGadgetAttrs(PrefsGadgets[GDX_LimitSpeed], PrefsWnd, NULL, GTCB_Checked, prefs->LimitSpeed, TAG_DONE);
117 	GT_SetGadgetAttrs(PrefsGadgets[GDX_FastReset], PrefsWnd, NULL, GTCB_Checked, prefs->FastReset, TAG_DONE);
118 	GT_SetGadgetAttrs(PrefsGadgets[GDX_CIAIRQHack], PrefsWnd, NULL, GTCB_Checked, prefs->CIAIRQHack, TAG_DONE);
119 	GT_SetGadgetAttrs(PrefsGadgets[GDX_SIDFilters], PrefsWnd, NULL, GTCB_Checked, prefs->SIDFilters, TAG_DONE);
120 
121 	GT_SetGadgetAttrs(PrefsGadgets[GDX_DrivePath8], PrefsWnd, NULL, GTST_String, (ULONG)prefs->DrivePath[0], TAG_DONE);
122 	GT_SetGadgetAttrs(PrefsGadgets[GDX_DrivePath9], PrefsWnd, NULL, GTST_String, (ULONG)prefs->DrivePath[1], TAG_DONE);
123 	GT_SetGadgetAttrs(PrefsGadgets[GDX_DrivePath10], PrefsWnd, NULL, GTST_String, (ULONG)prefs->DrivePath[2], TAG_DONE);
124 	GT_SetGadgetAttrs(PrefsGadgets[GDX_DrivePath11], PrefsWnd, NULL, GTST_String, (ULONG)prefs->DrivePath[3], TAG_DONE);
125 
126 	GT_SetGadgetAttrs(PrefsGadgets[GDX_DriveType8], PrefsWnd, NULL, GTCY_Active, prefs->DriveType[0], TAG_DONE);
127 	GT_SetGadgetAttrs(PrefsGadgets[GDX_DriveType9], PrefsWnd, NULL, GTCY_Active, prefs->DriveType[1], TAG_DONE);
128 	GT_SetGadgetAttrs(PrefsGadgets[GDX_DriveType10], PrefsWnd, NULL, GTCY_Active, prefs->DriveType[2], TAG_DONE);
129 	GT_SetGadgetAttrs(PrefsGadgets[GDX_DriveType11], PrefsWnd, NULL, GTCY_Active, prefs->DriveType[3], TAG_DONE);
130 
131 	GT_SetGadgetAttrs(PrefsGadgets[GDX_MapSlash], PrefsWnd, NULL, GTCB_Checked, prefs->MapSlash, TAG_DONE);
132 	GT_SetGadgetAttrs(PrefsGadgets[GDX_Emul1541Proc], PrefsWnd, NULL, GTCB_Checked, prefs->Emul1541Proc, TAG_DONE);
133 
134 	ghost_gadgets();
135 }
136 
137 
138 /*
139  *  Get the values of the gadgets
140  */
141 
get_values(void)142 static void get_values(void)
143 {
144 	prefs->NormalCycles = GetNumber(PrefsGadgets[GDX_NormalCycles]);
145 	prefs->BadLineCycles = GetNumber(PrefsGadgets[GDX_BadLineCycles]);
146 	prefs->CIACycles = GetNumber(PrefsGadgets[GDX_CIACycles]);
147 	prefs->FloppyCycles = GetNumber(PrefsGadgets[GDX_FloppyCycles]);
148 	prefs->SkipFrames = GetNumber(PrefsGadgets[GDX_SkipFrames]);
149 
150 	strcpy(prefs->DrivePath[0], GetString(PrefsGadgets[GDX_DrivePath8]));
151 	strcpy(prefs->DrivePath[1], GetString(PrefsGadgets[GDX_DrivePath9]));
152 	strcpy(prefs->DrivePath[2], GetString(PrefsGadgets[GDX_DrivePath10]));
153 	strcpy(prefs->DrivePath[3], GetString(PrefsGadgets[GDX_DrivePath11]));
154 
155 	prefs->Check();
156 }
157 
158 
159 /*
160  *  Enable/disable certain gadgets
161  */
162 
ghost_gadgets(void)163 static void ghost_gadgets(void)
164 {
165 	GT_SetGadgetAttrs(PrefsGadgets[GDX_NormalCycles], PrefsWnd, NULL, GA_Disabled, IsFrodoSC, TAG_DONE);
166 	GT_SetGadgetAttrs(PrefsGadgets[GDX_BadLineCycles], PrefsWnd, NULL, GA_Disabled, IsFrodoSC, TAG_DONE);
167 	GT_SetGadgetAttrs(PrefsGadgets[GDX_CIACycles], PrefsWnd, NULL, GA_Disabled, IsFrodoSC, TAG_DONE);
168 	GT_SetGadgetAttrs(PrefsGadgets[GDX_FloppyCycles], PrefsWnd, NULL, GA_Disabled, IsFrodoSC, TAG_DONE);
169 	GT_SetGadgetAttrs(PrefsGadgets[GDX_CIAIRQHack], PrefsWnd, NULL, GA_Disabled, IsFrodoSC, TAG_DONE);
170 }
171 
172 
173 /*
174  *  Handle gadgets
175  */
176 
SpritesOnClicked(void)177 int SpritesOnClicked(void)
178 {
179 	prefs->SpritesOn = !prefs->SpritesOn;
180 }
181 
SpriteCollisionsClicked(void)182 int SpriteCollisionsClicked(void)
183 {
184 	prefs->SpriteCollisions = !prefs->SpriteCollisions;
185 }
186 
Joystick2OnClicked(void)187 int Joystick2OnClicked(void)
188 {
189 	prefs->Joystick2On = !prefs->Joystick2On;
190 }
191 
JoystickSwapClicked(void)192 int JoystickSwapClicked(void)
193 {
194 	prefs->JoystickSwap = !prefs->JoystickSwap;
195 }
196 
LimitSpeedClicked(void)197 int LimitSpeedClicked(void)
198 {
199 	prefs->LimitSpeed = !prefs->LimitSpeed;
200 }
201 
FastResetClicked(void)202 int FastResetClicked(void)
203 {
204 	prefs->FastReset = !prefs->FastReset;
205 }
206 
CIAIRQHackClicked(void)207 int CIAIRQHackClicked(void)
208 {
209 	prefs->CIAIRQHack = !prefs->CIAIRQHack;
210 }
211 
SIDFiltersClicked(void)212 int SIDFiltersClicked(void)
213 {
214 	prefs->SIDFilters = !prefs->SIDFilters;
215 }
216 
NormalCyclesClicked(void)217 int NormalCyclesClicked(void) {}
BadLineCyclesClicked(void)218 int BadLineCyclesClicked(void) {}
CIACyclesClicked(void)219 int CIACyclesClicked(void) {}
FloppyCyclesClicked(void)220 int FloppyCyclesClicked(void) {}
SkipFramesClicked(void)221 int SkipFramesClicked(void) {}
DrivePath8Clicked(void)222 int DrivePath8Clicked(void) {}
DrivePath9Clicked(void)223 int DrivePath9Clicked(void) {}
DrivePath10Clicked(void)224 int DrivePath10Clicked(void) {}
DrivePath11Clicked(void)225 int DrivePath11Clicked(void) {}
226 
SIDTypeClicked(void)227 int SIDTypeClicked(void)
228 {
229 	prefs->SIDType = PrefsMsg.Code;
230 }
231 
REUSizeClicked(void)232 int REUSizeClicked(void)
233 {
234 	prefs->REUSize = PrefsMsg.Code;
235 }
236 
DriveType8Clicked(void)237 int DriveType8Clicked(void)
238 {
239 	prefs->DriveType[0] = PrefsMsg.Code;
240 }
241 
DriveType9Clicked(void)242 int DriveType9Clicked(void)
243 {
244 	prefs->DriveType[1] = PrefsMsg.Code;
245 }
246 
DriveType10Clicked(void)247 int DriveType10Clicked(void)
248 {
249 	prefs->DriveType[2] = PrefsMsg.Code;
250 }
251 
DriveType11Clicked(void)252 int DriveType11Clicked(void)
253 {
254 	prefs->DriveType[3] = PrefsMsg.Code;
255 }
256 
get_drive(int i)257 void get_drive(int i)
258 {
259 	bool result = FALSE;
260 
261 	if (drive_req == NULL)
262 		return;
263 
264 	get_values();
265 
266 	if (prefs->DriveType[i] == DRVTYPE_DIR)
267 		result = AslRequestTags(drive_req,
268 			ASLFR_TitleText, (ULONG)"Frodo: Select directory",
269 			ASLFR_DrawersOnly, TRUE,
270 			ASLFR_DoPatterns, FALSE,
271 			ASLFR_InitialPattern, (ULONG)"#?",
272 			ASLFR_InitialDrawer, (ULONG)prefs->DrivePath[i],
273 			ASLFR_InitialFile, (ULONG)"",
274 			TAG_DONE);
275 	else {
276 
277 		// Separate path and file
278 		char dir[256], file[256];
279 		strncpy(dir, prefs->DrivePath[i], 255);
280 		char *s = FilePart(dir);
281 		strncpy(file, s, 255);
282 		*s = 0;
283 
284 		if (prefs->DriveType[i] == DRVTYPE_D64)
285 			result = AslRequestTags(drive_req,
286 				ASLFR_TitleText, (ULONG)"Frodo: Select disk image file",
287 				ASLFR_DrawersOnly, FALSE,
288 				ASLFR_DoPatterns, TRUE,
289 				ASLFR_InitialPattern, (ULONG)"#?.(d64|x64)",
290 				ASLFR_InitialDrawer, (ULONG)dir,
291 				ASLFR_InitialFile, (ULONG)file,
292 				TAG_DONE);
293 		else
294 			result = AslRequestTags(drive_req,
295 				ASLFR_TitleText, (ULONG)"Frodo: Select archive file",
296 				ASLFR_DrawersOnly, FALSE,
297 				ASLFR_DoPatterns, TRUE,
298 				ASLFR_InitialPattern, (ULONG)"#?.(t64|LNX)",
299 				ASLFR_InitialDrawer, (ULONG)dir,
300 				ASLFR_InitialFile, (ULONG)file,
301 				TAG_DONE);
302 	}
303 
304 	if (result) {
305 		strncpy(prefs->DrivePath[i], drive_req->fr_Drawer, 255);
306 		if (prefs->DriveType[i] != DRVTYPE_DIR)
307 			AddPart(prefs->DrivePath[i], drive_req->fr_File, 255);
308 		set_values();
309 	}
310 }
311 
GetDrive8Clicked(void)312 int GetDrive8Clicked(void)
313 {
314 	get_drive(0);
315 }
316 
GetDrive9Clicked(void)317 int GetDrive9Clicked(void)
318 {
319 	get_drive(1);
320 }
321 
GetDrive10Clicked(void)322 int GetDrive10Clicked(void)
323 {
324 	get_drive(2);
325 }
326 
GetDrive11Clicked(void)327 int GetDrive11Clicked(void)
328 {
329 	get_drive(3);
330 }
331 
MapSlashClicked(void)332 int MapSlashClicked(void)
333 {
334 	prefs->MapSlash = !prefs->MapSlash;
335 }
336 
Emul1541ProcClicked(void)337 int Emul1541ProcClicked(void)
338 {
339 	prefs->Emul1541Proc = !prefs->Emul1541Proc;
340 }
341 
OKClicked(void)342 int OKClicked(void)
343 {
344 	get_values();
345 	done = result = TRUE;
346 }
347 
CancelClicked(void)348 int CancelClicked(void)
349 {
350 	done = TRUE;
351 	result = FALSE;
352 }
353 
354 
355 /*
356  *  Handle menus
357  */
358 
PrefsOpen(void)359 int PrefsOpen(void)
360 {
361 	if (open_req != NULL && AslRequest(open_req, NULL)) {
362 		strncpy(path, open_req->fr_Drawer, 255);
363 		AddPart(path, open_req->fr_File, 255);
364 
365 		get_values();	// Useful if Load() is unsuccessful
366 		prefs->Load(path);
367 		set_values();
368 	}
369 }
370 
PrefsRevert(void)371 int PrefsRevert(void)
372 {
373 	get_values();	// Useful if Load() is unsuccessful
374 	prefs->Load(path);
375 	set_values();
376 }
377 
PrefsSaveAs(void)378 int PrefsSaveAs(void)
379 {
380 	if (save_req != NULL && AslRequest(save_req, NULL)) {
381 		strncpy(path, save_req->fr_Drawer, 255);
382 		AddPart(path, save_req->fr_File, 255);
383 
384 		get_values();
385 		prefs->Save(path);
386 	}
387 }
388 
PrefsSave(void)389 int PrefsSave(void)
390 {
391 	get_values();
392 	prefs->Save(path);
393 
394 }
395 
PrefsOK(void)396 int PrefsOK(void)
397 {
398 	return OKClicked();
399 }
400 
PrefsCancel(void)401 int PrefsCancel(void)
402 {
403 	return CancelClicked();
404 }
405 
406 
407 /*
408  *  Handle keys
409  */
410 
PrefsVanillaKey(void)411 int PrefsVanillaKey(void)
412 {
413 	switch (PrefsMsg.Code) {
414 		case 'o': case 'O':
415 			return OKClicked();
416 		case 'c': case 'C':
417 			return CancelClicked();
418 	}
419 }
420