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