|
|
1.1 root 1: /*
2: Hatari - PrefsController.m
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: Preferences window controller implementation file
8:
9: Feb-Mar 2006, Sébastien Molines - Created
10: Jan 2006, Sébastien Molines - Updated for recent emulator updates
11: */
12:
13: // TODO: Set the default paths to MacOS-friendly values
14: // TODO: Move hardcoded string to localizable resources (e.g. string "Reset the emulator?")
15:
16:
17: #import "PrefsController.h"
18: #import "Shared.h"
19:
20: #include "main.h"
21: #include "configuration.h"
22: #include "change.h"
23: #include "dialog.h"
24: #include "file.h"
25: #include "screen.h"
26: #include "sdlgui.h"
27:
28: // Macros to transfer data between Cocoa controls and Hatari data structures
29: #define EXPORT_TEXTFIELD(nstextfield, target) GuiOsx_ExportPathString([nstextfield stringValue], target, sizeof((target)))
30: #define EXPORT_NTEXTFIELD(nstextfield, target) target = [nstextfield intValue]
31: #define EXPORT_SWITCH(nsbutton, target) target = ([(nsbutton) state] == NSOnState)
32: #define EXPORT_RADIO(nsmatrix, target) target = [[(nsmatrix) selectedCell] tag]
33: #define EXPORT_DROPDOWN(nspopupbutton, target) target = [[(nspopupbutton) selectedItem] tag]
34: #define EXPORT_SLIDER(nsslider, target) target = [(nsslider) intValue]
35:
36: #define IMPORT_TEXTFIELD(nstextfield, source) [(nstextfield) setStringValue:[[NSString stringWithCString:(source) encoding:NSASCIIStringEncoding] stringByAbbreviatingWithTildeInPath]]
37: #define IMPORT_NTEXTFIELD(nstextfield, source) [(nstextfield) setIntValue:(source)]
38: #define IMPORT_SWITCH(nsbutton, source) [(nsbutton) setState:((source))? NSOnState : NSOffState]
39: #define IMPORT_RADIO(nsmatrix, source) [(nsmatrix) selectCellWithTag:(source)]
40: #define IMPORT_DROPDOWN(nspopupbutton, source) [(nspopupbutton) selectItemAtIndex:[(nspopupbutton) indexOfItemWithTag:(source)]]
41: #define IMPORT_SLIDER(nsslider,source) [(nsslider) setIntValue:source]
42:
43:
44: // Back up of the current configuration parameters
45: CNF_PARAMS CurrentParams;
46:
47:
48: // Keys to be listed in the Joysticks dropdowns
49: SDLKey Preferences_KeysForJoysticks[] =
50: {
51: SDLK_BACKSPACE,
52: SDLK_TAB,
53: SDLK_CLEAR,
54: SDLK_RETURN,
55: SDLK_PAUSE,
56: SDLK_ESCAPE,
57: SDLK_SPACE,
58: SDLK_EXCLAIM,
59: SDLK_QUOTEDBL,
60: SDLK_HASH,
61: SDLK_DOLLAR,
62: SDLK_AMPERSAND,
63: SDLK_QUOTE,
64: SDLK_LEFTPAREN,
65: SDLK_RIGHTPAREN,
66: SDLK_ASTERISK,
67: SDLK_PLUS,
68: SDLK_COMMA,
69: SDLK_MINUS,
70: SDLK_PERIOD,
71: SDLK_SLASH,
72: SDLK_0,
73: SDLK_1,
74: SDLK_2,
75: SDLK_3,
76: SDLK_4,
77: SDLK_5,
78: SDLK_6,
79: SDLK_7,
80: SDLK_8,
81: SDLK_9,
82: SDLK_COLON,
83: SDLK_SEMICOLON,
84: SDLK_LESS,
85: SDLK_EQUALS,
86: SDLK_GREATER,
87: SDLK_QUESTION,
88: SDLK_AT,
89: SDLK_LEFTBRACKET,
90: SDLK_BACKSLASH,
91: SDLK_RIGHTBRACKET,
92: SDLK_CARET,
93: SDLK_UNDERSCORE,
94: SDLK_BACKQUOTE,
95: SDLK_a,
96: SDLK_b,
97: SDLK_c,
98: SDLK_d,
99: SDLK_e,
100: SDLK_f,
101: SDLK_g,
102: SDLK_h,
103: SDLK_i,
104: SDLK_j,
105: SDLK_k,
106: SDLK_l,
107: SDLK_m,
108: SDLK_n,
109: SDLK_o,
110: SDLK_p,
111: SDLK_q,
112: SDLK_r,
113: SDLK_s,
114: SDLK_t,
115: SDLK_u,
116: SDLK_v,
117: SDLK_w,
118: SDLK_x,
119: SDLK_y,
120: SDLK_z,
121: SDLK_DELETE,
122: SDLK_KP0,
123: SDLK_KP1,
124: SDLK_KP2,
125: SDLK_KP3,
126: SDLK_KP4,
127: SDLK_KP5,
128: SDLK_KP6,
129: SDLK_KP7,
130: SDLK_KP8,
131: SDLK_KP9,
132: SDLK_KP_PERIOD,
133: SDLK_KP_DIVIDE,
134: SDLK_KP_MULTIPLY,
135: SDLK_KP_MINUS,
136: SDLK_KP_PLUS,
137: SDLK_KP_ENTER,
138: SDLK_KP_EQUALS,
139: SDLK_UP,
140: SDLK_DOWN,
141: SDLK_RIGHT,
142: SDLK_LEFT,
143: SDLK_INSERT,
144: SDLK_HOME,
145: SDLK_END,
146: SDLK_PAGEUP,
147: SDLK_PAGEDOWN,
148: SDLK_F1,
149: SDLK_F2,
150: SDLK_F3,
151: SDLK_F4,
152: SDLK_F5,
153: SDLK_F6,
154: SDLK_F7,
155: SDLK_F8,
156: SDLK_F9,
157: SDLK_F10,
158: SDLK_F11,
159: SDLK_F12,
160: SDLK_F13,
161: SDLK_F14,
162: SDLK_F15,
163: SDLK_NUMLOCK,
164: SDLK_CAPSLOCK,
165: SDLK_SCROLLOCK,
166: SDLK_RSHIFT,
167: SDLK_LSHIFT,
168: SDLK_RCTRL,
169: SDLK_LCTRL,
170: SDLK_RALT,
171: SDLK_LALT,
172: SDLK_RMETA,
173: SDLK_LMETA,
174: SDLK_LSUPER,
175: SDLK_RSUPER,
176: SDLK_MODE,
177: SDLK_COMPOSE,
178: SDLK_HELP,
179: SDLK_PRINT,
180: SDLK_SYSREQ,
181: SDLK_BREAK,
182: SDLK_MENU,
183: SDLK_POWER,
184: SDLK_EURO,
185: SDLK_UNDO
186: };
187:
188: size_t Preferences_cKeysForJoysticks = sizeof(Preferences_KeysForJoysticks) / sizeof(Preferences_KeysForJoysticks[0]);
189:
190: #define DLGSOUND_11KHZ 0
191: #define DLGSOUND_12KHZ 1
192: #define DLGSOUND_16KHZ 2
193: #define DLGSOUND_22KHZ 3
194: #define DLGSOUND_25KHZ 4
195: #define DLGSOUND_32KHZ 5
196: #define DLGSOUND_44KHZ 6
197: #define DLGSOUND_48KHZ 7
198: #define DLGSOUND_50KHZ 8
199:
200: static const int nSoundFreqs[] =
201: {
202: 11025,
203: 12517,
204: 16000,
205: 22050,
206: 25033,
207: 32000,
208: 44100,
209: 48000,
210: 50066
211: };
212:
213: @implementation PrefsController
214:
215:
216: /*-----------------------------------------------------------------------*/
217: /*
218: Helper method for Choose buttons
219: Returns: TRUE is the user selected a path, FALSE if he/she aborted
220: */
221: - (BOOL)choosePathForControl:(NSTextField*)textField chooseDirectories:(bool)chooseDirectories defaultInitialDir:(NSString*)defaultInitialDir
222: {
223: // Create and configure an OpenPanel
224: NSOpenPanel *openPanel = [NSOpenPanel openPanel];
225: [openPanel setCanChooseDirectories: chooseDirectories];
226: [openPanel setCanChooseFiles: !chooseDirectories];
227:
228: NSString *directoryToOpen;
229: NSString *fileToPreselect;
230: NSString *oldPath = [textField stringValue];
231: if ((oldPath != nil) && ([oldPath length] > 0))
232: {
233: // There is existing path: we will open its directory with its file pre-selected.
234: directoryToOpen = [oldPath stringByDeletingLastPathComponent];
235: fileToPreselect = [oldPath lastPathComponent];
236: }
237: else
238: {
239: // Currently no path: we will open the user's directory with no file selected.
240: directoryToOpen = [defaultInitialDir stringByExpandingTildeInPath];
241: fileToPreselect = nil;
242: }
243:
244: // Run the OpenPanel, then check if the user clicked OK and selected at least one file
245: if ( (NSOKButton == [openPanel runModalForDirectory:directoryToOpen file:fileToPreselect types:nil] )
246: && ([[openPanel filenames] count] > 0) )
247: {
248: // Get the path to the selected file
249: NSString *path = [[openPanel filenames] objectAtIndex:0];
250:
251: // Set the control to it (abbreviated if possible)
252: [textField setStringValue:[path stringByAbbreviatingWithTildeInPath]];
253:
254: // Signal completion
255: return true;
256: }
257:
258: // Signal that the selection was aborted
259: return FALSE;
260: }
261:
262:
263: /*-----------------------------------------------------------------------*/
264: /*
265: Helper method to insert a floppy image
266: TODO: Add code to restrict to known file types
267: */
268: - (void)insertFloppyImageIntoDrive:(int)drive forTextField:(NSTextField*)floppyTextField
269: {
270: if ([self choosePathForControl:floppyTextField chooseDirectories:FALSE defaultInitialDir:[defaultImagesLocation stringValue]])
271: {
272: // Get the full path to the selected file
273: NSString *path = [[floppyTextField stringValue] stringByExpandingTildeInPath];
274:
275: // Make a non-const C string out of it
276: const char* constSzPath = [path cStringUsingEncoding:NSASCIIStringEncoding];
277: size_t cbPath = strlen(constSzPath) + 1;
278: char szPath[cbPath];
279: strncpy(szPath, constSzPath, cbPath);
280:
281: // Insert the floppy image at this path
282: // Floppy_SetDiskFileName(drive, szPath, NULL);
283: }
284: }
285:
286:
287: /*-----------------------------------------------------------------------*/
288: /*
289: Methods for all the "Choose" buttons
290: */
291: - (IBAction)chooseCartridgeImage:(id)sender;
292: {
293: [self choosePathForControl: cartridgeImage chooseDirectories:FALSE defaultInitialDir:@"~"];
294: }
295:
296: - (IBAction)chooseDefaultImagesLocation:(id)sender
297: {
298: [self choosePathForControl: defaultImagesLocation chooseDirectories:TRUE defaultInitialDir:@"~"];
299: }
300:
301: - (IBAction)chooseFloppyImageA:(id)sender
302: {
303: [self insertFloppyImageIntoDrive:0 forTextField: floppyImageA];
304: }
305:
306: - (IBAction)chooseFloppyImageB:(id)sender
307: {
308: [self insertFloppyImageIntoDrive:1 forTextField: floppyImageB];
309: }
310:
311: - (IBAction)chooseGemdosImage:(id)sender
312: {
313: [self choosePathForControl: gemdosImage chooseDirectories:TRUE defaultInitialDir:@"~"];
314: }
315:
316: - (IBAction)chooseHdImage:(id)sender
317: {
318: [self choosePathForControl: hdImage chooseDirectories:FALSE defaultInitialDir:@"~"];
319: }
320:
321: - (IBAction)chooseIdeMasterHdImage:(id)sender
322: {
323: [self choosePathForControl: ideMasterHdImage chooseDirectories:FALSE defaultInitialDir:@"~"];
324: }
325:
326: - (IBAction)chooseIdeSlaveHdImage:(id)sender
327: {
328: [self choosePathForControl: ideSlaveHdImage chooseDirectories:FALSE defaultInitialDir:@"~"];
329: }
330:
331: - (IBAction)chooseKeyboardMappingFile:(id)sender
332: {
333: [self choosePathForControl: keyboardMappingFile chooseDirectories:FALSE defaultInitialDir:@"~"];
334: }
335:
336: - (IBAction)chooseMidiOutputFile:(id)sender
337: {
338: [self choosePathForControl: writeMidiToFile chooseDirectories:FALSE defaultInitialDir:@"~"];
339: }
340:
341: - (IBAction)choosePrintToFile:(id)sender
342: {
343: [self choosePathForControl: printToFile chooseDirectories:FALSE defaultInitialDir:@"~"];
344: }
345:
346: - (IBAction)chooseRS232InputFile:(id)sender
347: {
348: [self choosePathForControl: readRS232FromFile chooseDirectories:FALSE defaultInitialDir:@"~"];
349: }
350:
351: - (IBAction)chooseRS232OutputFile:(id)sender
352: {
353: [self choosePathForControl: writeRS232ToFile chooseDirectories:FALSE defaultInitialDir:@"~"];
354: }
355:
356: - (IBAction)chooseTosImage:(id)sender;
357: {
358: [self choosePathForControl: tosImage chooseDirectories:FALSE defaultInitialDir:@"~"];
359: }
360:
361:
362: /*-----------------------------------------------------------------------*/
363: /*
364: Methods for the "Eject" buttons
365: */
366: - (IBAction)ejectFloppyA:(id)sender
367: {
368: // Floppy_SetDiskFileNameNone(0);
369:
370: // Refresh the control
371: [floppyImageA setStringValue:@""];
372: }
373:
374: - (IBAction)ejectFloppyB:(id)sender
375: {
376: // Floppy_SetDiskFileNameNone(1);
377:
378: // Refresh the control
379: [floppyImageB setStringValue:@""];
380: }
381:
382: - (IBAction)ejectGemdosImage:(id)sender
383: {
384: // Clear the control. Later. saveAllControls will set the ConfigureParams accordingly to signal this is ejected
385: [gemdosImage setStringValue:@""];
386: }
387:
388: - (IBAction)ejectHdImage:(id)sender
389: {
390: // Clear the control. Later. saveAllControls will set the ConfigureParams accordingly to signal this is ejected
391: [hdImage setStringValue:@""];
392: }
393:
394: - (IBAction)ejectIdeMasterHdImage:(id)sender
395: {
396: // Clear the control. Later. saveAllControls will set the ConfigureParams accordingly to signal this is ejected
397: [ideMasterHdImage setStringValue:@""];
398: }
399:
400: - (IBAction)ejectIdeSlaveHdImage:(id)sender
401: {
402: // Clear the control. Later. saveAllControls will set the ConfigureParams accordingly to signal this is ejected
403: [ideSlaveHdImage setStringValue:@""];
404: }
405:
406: /*-----------------------------------------------------------------------*/
407: /**
408: * Methods for the "Load Config" button
409: */
410:
411: - (IBAction)loadConfigFrom:(id)sender
412: {
413: NSString *ConfigFile = [NSString stringWithCString:(sConfigFileName) encoding:NSASCIIStringEncoding];
414: NSOpenPanel *openPanel = [ NSOpenPanel openPanel ];
415:
416: if ( [ openPanel runModalForDirectory:nil file:ConfigFile types:nil ] )
417: {
418: ConfigFile = [ [ openPanel filenames ] objectAtIndex:0 ];
419: }
420: else
421: {
422: ConfigFile = nil;
423: }
424:
425: if (ConfigFile != nil)
426: {
427: // Make a non-const C string out of it
428: const char* constSzPath = [ConfigFile cStringUsingEncoding:NSASCIIStringEncoding];
429: size_t cbPath = strlen(constSzPath) + 1;
430: char szPath[cbPath];
431: strncpy(szPath, constSzPath, cbPath);
432:
433: // Load the config into ConfigureParams
434: Configuration_Load(szPath);
435: strcpy(sConfigFileName,szPath);
436: // Refresh all the controls to match ConfigureParams
437: [self setAllControls];
438: }
439: }
440:
441: /**
442: * Methods for the "Load Config" button
443: */
444: - (IBAction)saveConfigAs:(id)sender
445: {
446: char splitpath[FILENAME_MAX], splitname[FILENAME_MAX];
447:
448: // Update the ConfigureParams from the controls
449: [self saveAllControls];
450:
451: File_SplitPath(sConfigFileName, splitpath, splitname, NULL);
452:
453: NSSavePanel *savePanel = [ NSSavePanel savePanel ];
454:
455: NSString* defaultDir = [NSString stringWithCString:splitpath encoding:NSASCIIStringEncoding];
456: NSString *ConfigFile = [NSString stringWithCString:splitname encoding:NSASCIIStringEncoding];
457:
458: if ( ![ savePanel runModalForDirectory:defaultDir file:ConfigFile ] )
459: {
460: return;
461: }
462:
463: ConfigFile = [ savePanel filename ];
464:
465: if (ConfigFile != nil)
466: {
467: // Make a non-const C string out of it
468: const char* constSzPath = [ConfigFile cStringUsingEncoding:NSASCIIStringEncoding];
469: size_t cbPath = strlen(constSzPath) + 1;
470: char szPath[cbPath];
471: strncpy(szPath, constSzPath, cbPath);
472:
473: // Save the config from ConfigureParams
474: strcpy(sConfigFileName, szPath);
475: Configuration_Save();
476: }
477: }
478:
479:
480: /*-----------------------------------------------------------------------*/
481: /*
482: Commits and closes
483: */
484: - (IBAction)commitAndClose:(id)sender
485: {
486: BOOL applyChanges = true;
487:
488: // The user clicked OK
489: [self saveAllControls];
490:
491: // If a reset is required, ask the user first
492: if (Change_DoNeedReset(&CurrentParams, &ConfigureParams))
493: {
494: applyChanges = ( 0 == NSRunAlertPanel (
495: NSLocalizedStringFromTable(@"Reset the emulator",@"Localizable",@"comment"),
496: NSLocalizedStringFromTable(@"Must be reset",@"Localizable",@"comment"),
497: NSLocalizedStringFromTable(@"Don't reset",@"Localizable",@"comment"),
498: NSLocalizedStringFromTable(@"Reset",@"Localizable",@"comment"), nil) );
499: }
500:
501: // Commit the new configuration
502: if (applyChanges)
503: {
504: Change_CopyChangedParamsToConfiguration(&CurrentParams, &ConfigureParams, false);
505: }
506: else
507: {
508: ConfigureParams = CurrentParams;
509: }
510:
511: // Close the window
512: [window close];
513: }
514:
515: - (void)initKeysDropDown:(NSPopUpButton*)dropDown
516: {
517: [dropDown removeAllItems];
518: int i;
519: for (i = 0; i < Preferences_cKeysForJoysticks; i++)
520: {
521: SDLKey key = Preferences_KeysForJoysticks[i];
522: const char* szKeyName = SDL_GetKeyName(key);
523: [dropDown addItemWithTitle:[[NSString stringWithCString:szKeyName encoding:NSASCIIStringEncoding] capitalizedString]];
524: [[dropDown lastItem] setTag:key];
525: }
526: }
527:
528:
529: /*-----------------------------------------------------------------------*/
530: /*
531: Displays the Preferences dialog
532: */
533: - (IBAction)loadPrefs:(id)sender
534: {
535: if (!bInitialized)
536: {
537: // Note: These inits cannot be done in awakeFromNib as by this time SDL is not yet initialized.
538:
539: // Fill the keyboard dropdowns
540: [self initKeysDropDown:joystickUp];
541: [self initKeysDropDown:joystickRight];
542: [self initKeysDropDown:joystickDown];
543: [self initKeysDropDown:joystickLeft];
544: [self initKeysDropDown:joystickFire];
545:
546: // Get and store the number of real joysticks
547: cRealJoysticks = SDL_NumJoysticks();
548:
549: // Fill the real joysticks dropdown, if any are available
550: if (cRealJoysticks > 0)
551: {
552: [realJoystick removeAllItems];
553: int i;
554: for (i = 0; i < cRealJoysticks; i++)
555: {
556: const char* szJoystickName = SDL_JoystickName(i);
557: [realJoystick addItemWithTitle:[[NSString stringWithCString:szJoystickName encoding:NSASCIIStringEncoding] capitalizedString]];
558: [[realJoystick lastItem] setTag:i];
559: }
560: }
561: else // No real joysticks: Disable the controls
562: {
563: [[joystickMode cellWithTag:1] setEnabled:FALSE];
564: [realJoystick setEnabled:FALSE];
565: }
566:
567: bInitialized = true;
568: }
569:
570:
571: // Backup of configuration settings to CurrentParams (which we will only
572: // commit back to the configuration settings if choosing OK)
573: CurrentParams = ConfigureParams;
574:
575: [self setAllControls];
576:
577: // Display the window
578: [[ModalWrapper alloc] runModal:window];
579: }
580:
581:
582: /*-----------------------------------------------------------------------*/
583: /*
584: Updates the controls following a change in the joystick selection
585: */
586: - (IBAction)changeViewedJoystick:(id)sender
587: {
588: // Save the pre-joystick controls, as we are about to change them
589: [self saveJoystickControls];
590:
591: // Refresh the per-joystick controls
592: [self setJoystickControls];
593:
594: // Update the controls' enabled states
595: [self updateEnabledStates:self];
596: }
597:
598:
599: /*-----------------------------------------------------------------------*/
600: /*
601: Initializes all controls
602: */
603: - (void)setAllControls
604: {
605: // Import the floppy paths into their controls.
606: IMPORT_TEXTFIELD(floppyImageA, ConfigureParams.DiskImage.szDiskFileName[0]);
607: IMPORT_TEXTFIELD(floppyImageB, ConfigureParams.DiskImage.szDiskFileName[1]);
608:
609: // Import all the preferences into their controls
610: IMPORT_SWITCH(autoInsertB, ConfigureParams.DiskImage.bAutoInsertDiskB);
611: IMPORT_SWITCH(blitter, ConfigureParams.System.bBlitter);
612: IMPORT_SWITCH(bootFromHD, ConfigureParams.HardDisk.bBootFromHardDisk);
613: IMPORT_SWITCH(captureOnChange, ConfigureParams.Screen.bCaptureChange);
614: IMPORT_TEXTFIELD(cartridgeImage, ConfigureParams.Rom.szCartridgeImageFileName);
615: IMPORT_RADIO(colorDepth, ConfigureParams.Screen.nVdiColors);
616: IMPORT_SWITCH(compatibleCpu, ConfigureParams.System.bCompatibleCpu);
617: IMPORT_RADIO(cpuClock, ConfigureParams.System.nCpuFreq);
618: IMPORT_RADIO(cpuType, ConfigureParams.System.nCpuLevel);
619: IMPORT_TEXTFIELD(defaultImagesLocation, ConfigureParams.DiskImage.szDiskImageDirectory);
620: IMPORT_SWITCH(enableMidi, ConfigureParams.Midi.bEnableMidi);
621: IMPORT_SWITCH(enablePrinter, ConfigureParams.Printer.bEnablePrinting);
622: IMPORT_SWITCH(enableRS232, ConfigureParams.RS232.bEnableRS232);
623: IMPORT_SWITCH(enableSound, ConfigureParams.Sound.bEnableSound);
624: IMPORT_DROPDOWN(frameSkip, ConfigureParams.Screen.nFrameSkips);
625: IMPORT_RADIO(keyboardMapping, ConfigureParams.Keyboard.nKeymapType);
626: IMPORT_TEXTFIELD(keyboardMappingFile, ConfigureParams.Keyboard.szMappingFileName);
627: IMPORT_RADIO(machineType, ConfigureParams.System.nMachineType);
628: IMPORT_RADIO(monitor, ConfigureParams.Screen.nMonitorType);
629: IMPORT_SWITCH(patchTimerD, ConfigureParams.System.bPatchTimerD);
630: IMPORT_TEXTFIELD(printToFile, ConfigureParams.Printer.szPrintToFileName);
631: IMPORT_RADIO(ramSize, ConfigureParams.Memory.nMemorySize);
632: IMPORT_TEXTFIELD(readRS232FromFile, ConfigureParams.RS232.szInFileName);
633: IMPORT_SWITCH(realTime, ConfigureParams.System.bRealTimeClock);
634: IMPORT_SWITCH(slowFDC, ConfigureParams.DiskImage.bSlowFloppy);
635: IMPORT_TEXTFIELD(tosImage, ConfigureParams.Rom.szTosImageFileName);
636: IMPORT_SWITCH(useBorders, ConfigureParams.Screen.bAllowOverscan);
637: IMPORT_SWITCH(useVDIResolution, ConfigureParams.Screen.bUseExtVdiResolutions);
638: IMPORT_TEXTFIELD(writeMidiToFile, ConfigureParams.Midi.sMidiOutFileName);
639: IMPORT_RADIO(writeProtection, ConfigureParams.DiskImage.nWriteProtection);
640: IMPORT_TEXTFIELD(writeRS232ToFile, ConfigureParams.RS232.szOutFileName);
641: // IMPORT_SWITCH(zoomSTLowRes, ConfigureParams.Screen.bZoomLowRes);
642: IMPORT_SWITCH(showStatusBar, ConfigureParams.Screen.bShowStatusbar);
643: IMPORT_DROPDOWN(enableDSP,ConfigureParams.System.nDSPType);
644: IMPORT_TEXTFIELD(configFile, sConfigFileName);
645:
646: // 12/04/2010
647: IMPORT_SWITCH(falconTTRatio, ConfigureParams.Screen.bAspectCorrect);
648: IMPORT_SWITCH(fullScreen, ConfigureParams.Screen.bFullScreen);
649: IMPORT_SWITCH(ledDisks, ConfigureParams.Screen.bShowDriveLed);
650:
651: //deal with the Max Zoomed Stepper
652: IMPORT_NTEXTFIELD(maxZoomedWidth, ConfigureParams.Screen.nMaxWidth);
653: IMPORT_NTEXTFIELD(maxZoomedHeight, ConfigureParams.Screen.nMaxHeight);
654:
655: [widthStepper setIntValue:[maxZoomedWidth intValue]];
656: [heightStepper setIntValue:[maxZoomedHeight intValue]];
657:
658:
659:
660:
661: [(force8bpp) setState:((ConfigureParams.Screen.nForceBpp==8))? NSOnState : NSOffState];
662:
663:
664: int i;
665:
666: for (i = 0; i <= DLGSOUND_50KHZ-DLGSOUND_11KHZ; i++)
667: {
668: if (ConfigureParams.Sound.nPlaybackFreq > nSoundFreqs[i]-500
669: && ConfigureParams.Sound.nPlaybackFreq < nSoundFreqs[i]+500)
670: {
671: [playbackQuality selectCellWithTag:(i)];
672: break;
673: }
674: }
675:
676:
677: if (ConfigureParams.Screen.nVdiWidth >= 1024)
678: [resolution selectCellWithTag:(2)];
679: else if (ConfigureParams.Screen.nVdiWidth >= 768)
680: [resolution selectCellWithTag:(1)];
681: else
682: [resolution selectCellWithTag:(0)];
683:
684: // If the HD flag is set, load the HD path, otherwise make it blank
685: if (ConfigureParams.HardDisk.bUseHardDiskImage)
686: {
687: IMPORT_TEXTFIELD(hdImage, ConfigureParams.HardDisk.szHardDiskImage);
688: }
689: else
690: {
691: [hdImage setStringValue:@""];
692: }
693:
694: // If the IDE HD flag is set, load the IDE HD path, otherwise make it blank
695: //Master
696: if (ConfigureParams.HardDisk.bUseIdeMasterHardDiskImage)
697: {
698: IMPORT_TEXTFIELD(ideMasterHdImage, ConfigureParams.HardDisk.szIdeMasterHardDiskImage);
699: }
700: else
701: {
702: [ideMasterHdImage setStringValue:@""];
703: }
704: //Slave
705: if (ConfigureParams.HardDisk.bUseIdeSlaveHardDiskImage)
706: {
707: IMPORT_TEXTFIELD(ideSlaveHdImage, ConfigureParams.HardDisk.szIdeSlaveHardDiskImage);
708: }
709: else
710: {
711: [ideSlaveHdImage setStringValue:@""];
712: }
713:
714: // If the Gemdos flag is set, load the Gemdos path, otherwise make it blank
715: if (ConfigureParams.HardDisk.bUseHardDiskDirectories)
716: {
717: IMPORT_TEXTFIELD(gemdosImage, ConfigureParams.HardDisk.szHardDiskDirectories[0]);
718: }
719: else
720: {
721: [gemdosImage setStringValue:@""];
722: }
723:
724: // Set the per-joystick controls
725: [self setJoystickControls];
726:
727: // Update the controls' enabled states
728: [self updateEnabledStates:self];
729: }
730:
731:
732: /*-----------------------------------------------------------------------*/
733: /*
734: Updates the enabled states of controls who depend on other controls
735: */
736: - (IBAction)updateEnabledStates:(id)sender
737: {
738: // Joystick key controls are only enabled if "Use keyboard" is selected
739: int nJoystickMode;
740: EXPORT_RADIO(joystickMode, nJoystickMode);
741: BOOL bUsingKeyboard = (nJoystickMode == JOYSTICK_KEYBOARD);
742: [joystickUp setEnabled:bUsingKeyboard];
743: [joystickRight setEnabled:bUsingKeyboard];
744: [joystickDown setEnabled:bUsingKeyboard];
745: [joystickLeft setEnabled:bUsingKeyboard];
746: [joystickFire setEnabled:bUsingKeyboard];
747:
748: // Resolution and colour depth depend on Extended GEM VDI resolution
749: BOOL bUsingVDI;
750: EXPORT_SWITCH(useVDIResolution, bUsingVDI);
751: [resolution setEnabled:bUsingVDI];
752: [colorDepth setEnabled:bUsingVDI];
753:
754: // Playback quality depends on enable sound
755: BOOL bSoundEnabled;
756: EXPORT_SWITCH(enableSound, bSoundEnabled);
757: [playbackQuality setEnabled:bSoundEnabled];
758: }
759:
760:
761: /*-----------------------------------------------------------------------*/
762: /*
763: Updates the joystick controls to match the new joystick selection
764: */
765: - (void)setJoystickControls
766: {
767: // Get and persist the ID of the newly selected joystick
768: EXPORT_DROPDOWN(currentJoystick, nCurrentJoystick);
769:
770: // Data validation: If the JoyID is out of bounds, correct it and, if set to use real joystick, change to disabled
771: if ( (ConfigureParams.Joysticks.Joy[nCurrentJoystick].nJoyId < 0)
772: || (ConfigureParams.Joysticks.Joy[nCurrentJoystick].nJoyId >= cRealJoysticks) )
773: {
774: ConfigureParams.Joysticks.Joy[nCurrentJoystick].nJoyId = 0;
775: if (ConfigureParams.Joysticks.Joy[nCurrentJoystick].nJoystickMode == JOYSTICK_REALSTICK)
776: {
777: ConfigureParams.Joysticks.Joy[nCurrentJoystick].nJoystickMode = JOYSTICK_DISABLED;
778: }
779: }
780:
781: // Don't change the realJoystick dropdown if none is available (to keep "(None available)" selected)
782: if (cRealJoysticks > 0)
783: {
784: IMPORT_DROPDOWN(realJoystick, ConfigureParams.Joysticks.Joy[nCurrentJoystick].nJoyId);
785: }
786:
787: IMPORT_RADIO(joystickMode, ConfigureParams.Joysticks.Joy[nCurrentJoystick].nJoystickMode);
788: IMPORT_DROPDOWN(joystickUp, ConfigureParams.Joysticks.Joy[nCurrentJoystick].nKeyCodeUp);
789: IMPORT_DROPDOWN(joystickRight, ConfigureParams.Joysticks.Joy[nCurrentJoystick].nKeyCodeRight);
790: IMPORT_DROPDOWN(joystickDown, ConfigureParams.Joysticks.Joy[nCurrentJoystick].nKeyCodeDown);
791: IMPORT_DROPDOWN(joystickLeft, ConfigureParams.Joysticks.Joy[nCurrentJoystick].nKeyCodeLeft);
792: IMPORT_DROPDOWN(joystickFire, ConfigureParams.Joysticks.Joy[nCurrentJoystick].nKeyCodeFire);
793: IMPORT_SWITCH(enableAutoFire, ConfigureParams.Joysticks.Joy[nCurrentJoystick].bEnableAutoFire);
794: }
795:
796:
797: /*-----------------------------------------------------------------------*/
798: /*
799: Saves the setting for the joystick currently being viewed
800: */
801: - (void)saveJoystickControls
802: {
803: EXPORT_RADIO(joystickMode, ConfigureParams.Joysticks.Joy[nCurrentJoystick].nJoystickMode);
804: EXPORT_DROPDOWN(realJoystick, ConfigureParams.Joysticks.Joy[nCurrentJoystick].nJoyId);
805: EXPORT_DROPDOWN(joystickUp, ConfigureParams.Joysticks.Joy[nCurrentJoystick].nKeyCodeUp);
806: EXPORT_DROPDOWN(joystickRight, ConfigureParams.Joysticks.Joy[nCurrentJoystick].nKeyCodeRight);
807: EXPORT_DROPDOWN(joystickDown, ConfigureParams.Joysticks.Joy[nCurrentJoystick].nKeyCodeDown);
808: EXPORT_DROPDOWN(joystickLeft, ConfigureParams.Joysticks.Joy[nCurrentJoystick].nKeyCodeLeft);
809: EXPORT_DROPDOWN(joystickFire, ConfigureParams.Joysticks.Joy[nCurrentJoystick].nKeyCodeFire);
810: EXPORT_SWITCH(enableAutoFire, ConfigureParams.Joysticks.Joy[nCurrentJoystick].bEnableAutoFire);
811: }
812:
813:
814: /*-----------------------------------------------------------------------*/
815: /*
816: Saves the settings for all controls
817: */
818: - (void)saveAllControls
819: {
820: // Export the preference controls into their vars
821: EXPORT_SWITCH(autoInsertB, ConfigureParams.DiskImage.bAutoInsertDiskB);
822: EXPORT_SWITCH(blitter, ConfigureParams.System.bBlitter);
823: EXPORT_SWITCH(bootFromHD, ConfigureParams.HardDisk.bBootFromHardDisk);
824: EXPORT_SWITCH(captureOnChange, ConfigureParams.Screen.bCaptureChange);
825: EXPORT_TEXTFIELD(cartridgeImage, ConfigureParams.Rom.szCartridgeImageFileName);
826: EXPORT_RADIO(colorDepth, ConfigureParams.Screen.nVdiColors);
827: EXPORT_SWITCH(compatibleCpu, ConfigureParams.System.bCompatibleCpu);
828: EXPORT_RADIO(cpuClock, ConfigureParams.System.nCpuFreq);
829: EXPORT_RADIO(cpuType, ConfigureParams.System.nCpuLevel);
830: EXPORT_TEXTFIELD(defaultImagesLocation, ConfigureParams.DiskImage.szDiskImageDirectory);
831: EXPORT_SWITCH(enableMidi, ConfigureParams.Midi.bEnableMidi);
832: EXPORT_SWITCH(enablePrinter, ConfigureParams.Printer.bEnablePrinting);
833: EXPORT_SWITCH(enableRS232, ConfigureParams.RS232.bEnableRS232);
834: EXPORT_SWITCH(enableSound, ConfigureParams.Sound.bEnableSound);
835: EXPORT_DROPDOWN(frameSkip, ConfigureParams.Screen.nFrameSkips);
836: EXPORT_RADIO(keyboardMapping, ConfigureParams.Keyboard.nKeymapType);
837: EXPORT_TEXTFIELD(keyboardMappingFile, ConfigureParams.Keyboard.szMappingFileName);
838: EXPORT_RADIO(machineType, ConfigureParams.System.nMachineType);
839: EXPORT_RADIO(monitor, ConfigureParams.Screen.nMonitorType);
840: EXPORT_SWITCH(patchTimerD, ConfigureParams.System.bPatchTimerD);
841: EXPORT_TEXTFIELD(printToFile, ConfigureParams.Printer.szPrintToFileName);
842: EXPORT_RADIO(ramSize, ConfigureParams.Memory.nMemorySize);
843: EXPORT_TEXTFIELD(readRS232FromFile, ConfigureParams.RS232.szInFileName);
844: EXPORT_SWITCH(realTime, ConfigureParams.System.bRealTimeClock);
845: EXPORT_SWITCH(slowFDC, ConfigureParams.DiskImage.bSlowFloppy);
846: EXPORT_TEXTFIELD(tosImage, ConfigureParams.Rom.szTosImageFileName);
847: EXPORT_SWITCH(useBorders, ConfigureParams.Screen.bAllowOverscan);
848: EXPORT_SWITCH(useVDIResolution, ConfigureParams.Screen.bUseExtVdiResolutions);
849: EXPORT_TEXTFIELD(writeMidiToFile, ConfigureParams.Midi.sMidiOutFileName);
850: EXPORT_RADIO(writeProtection, ConfigureParams.DiskImage.nWriteProtection);
851: EXPORT_TEXTFIELD(writeRS232ToFile, ConfigureParams.RS232.szOutFileName);
852: // EXPORT_SWITCH(zoomSTLowRes, ConfigureParams.Screen.bZoomLowRes);
853: EXPORT_SWITCH(showStatusBar,ConfigureParams.Screen.bShowStatusbar);
854: EXPORT_DROPDOWN(enableDSP,ConfigureParams.System.nDSPType);
855:
856: EXPORT_SWITCH(falconTTRatio, ConfigureParams.Screen.bAspectCorrect);
857: EXPORT_SWITCH(fullScreen, ConfigureParams.Screen.bFullScreen);
858: IMPORT_SWITCH(ledDisks, ConfigureParams.Screen.bShowDriveLed);
859:
860: EXPORT_NTEXTFIELD(maxZoomedWidth, ConfigureParams.Screen.nMaxWidth);
861: EXPORT_NTEXTFIELD(maxZoomedHeight, ConfigureParams.Screen.nMaxHeight);
862:
863: ConfigureParams.Screen.nForceBpp = ([force8bpp state] == NSOnState) ? 8 : 0;
864:
865: ConfigureParams.Sound.nPlaybackFreq = nSoundFreqs[[[playbackQuality selectedCell] tag]];
866:
867: switch ([[resolution selectedCell] tag])
868: {
869: case 0:
870: ConfigureParams.Screen.nVdiWidth = 640;
871: ConfigureParams.Screen.nVdiHeight = 480;
872: break;
873: case 1:
874: ConfigureParams.Screen.nVdiWidth = 800;
875: ConfigureParams.Screen.nVdiHeight = 600;
876: break;
877: case 2:
878: ConfigureParams.Screen.nVdiWidth = 1024;
879: ConfigureParams.Screen.nVdiHeight = 768;
880: break;
881: }
882:
883: // Define the HD flag, and export the HD path if one is selected
884: if ([[hdImage stringValue] length] > 0)
885: {
886: EXPORT_TEXTFIELD(hdImage, ConfigureParams.HardDisk.szHardDiskImage);
887: ConfigureParams.HardDisk.bUseHardDiskImage = true;
888: }
889: else
890: {
891: ConfigureParams.HardDisk.bUseHardDiskImage = false;
892: }
893:
894: // Define the IDE HD flag, and export the IDE HD path if one is selected
895: if ([[ideMasterHdImage stringValue] length] > 0)
896: {
897: EXPORT_TEXTFIELD(ideMasterHdImage, ConfigureParams.HardDisk.szIdeMasterHardDiskImage);
898: ConfigureParams.HardDisk.bUseIdeMasterHardDiskImage = true;
899: }
900: else
901: {
902: ConfigureParams.HardDisk.bUseIdeMasterHardDiskImage = false;
903: }
904:
905: // IDE Slave
906: if ([[ideSlaveHdImage stringValue] length] > 0)
907: {
908: EXPORT_TEXTFIELD(ideSlaveHdImage, ConfigureParams.HardDisk.szIdeSlaveHardDiskImage);
909: ConfigureParams.HardDisk.bUseIdeSlaveHardDiskImage = true;
910: }
911: else
912: {
913: ConfigureParams.HardDisk.bUseIdeSlaveHardDiskImage = false;
914: }
915:
916: // Define the Gemdos flag, and export the Gemdos path if one is selected
917: if ([[gemdosImage stringValue] length] > 0)
918: {
919: EXPORT_TEXTFIELD(gemdosImage, ConfigureParams.HardDisk.szHardDiskDirectories[0]);
920: ConfigureParams.HardDisk.bUseHardDiskDirectories = true;
921: }
922: else
923: {
924: ConfigureParams.HardDisk.bUseHardDiskDirectories = false;
925: }
926:
927: // Save the per-joystick controls
928: [self saveJoystickControls];
929: }
930:
931: // Max Zoomed Adjust
932:
933: - (IBAction) setWidth:(id)sender;
934: {
935: NSLog(@"Change Max Zoom width: %ld", [sender intValue]);
936: [maxZoomedWidth setIntValue: [sender intValue]];
937: }
938:
939: - (IBAction) setHeight:(id)sender;
940: {
941: NSLog(@"Change Max Zoom height: %ld", [sender intValue]);
942: [maxZoomedHeight setIntValue: [sender intValue]];
943: }
944:
945:
946: @end
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.