--- hatari/src/gui-osx/PrefsController.m 2019/04/01 07:13:04 1.1 +++ hatari/src/gui-osx/PrefsController.m 2019/04/09 08:57:49 1.1.1.14 @@ -1,14 +1,19 @@ /* Hatari - PrefsController.m - This file is distributed under the GNU Public License, version 2 or at - your option any later version. Read the file gpl.txt for details. + This file is distributed under the GNU General Public License, version 2 + or at your option any later version. Read the file gpl.txt for details. Preferences window controller implementation file Feb-Mar 2006, Sébastien Molines - Created + Jan 2006, Sébastien Molines - Updated for recent emulator updates + 2013 : Miguel SARO, J. VERNET + 2016 : J. VERNET - Updated for 1.9.0 + 2017 : Miguel SARO resizable */ +// bOKDialog = Dialog_MainDlg(&bForceReset, &bLoadedSnapshot); // prise des préférences // TODO: Set the default paths to MacOS-friendly values // TODO: Move hardcoded string to localizable resources (e.g. string "Reset the emulator?") @@ -18,21 +23,41 @@ #include "main.h" #include "configuration.h" +#include "change.h" #include "dialog.h" #include "file.h" #include "floppy.h" #include "screen.h" #include "sdlgui.h" +#include "paths.h" +#include "keymap.h" +#include "joy.h" +#include "midi.h" // Macros to transfer data between Cocoa controls and Hatari data structures -#define EXPORT_TEXTFIELD(nstextfield, target) GuiOsx_ExportPathString([nstextfield stringValue], target, sizeof((target))) +// de l'affichage vers la structure (saveAllControls) + +#define EXPORT_TEXTFIELD(mutablStrng, target) [mutablStrng getCString:target maxLength:sizeof((target))-1 encoding:NSASCIIStringEncoding] +#define EXPORT_NTEXTFIELD(nstextfield, target) target = [nstextfield intValue] #define EXPORT_SWITCH(nsbutton, target) target = ([(nsbutton) state] == NSOnState) #define EXPORT_RADIO(nsmatrix, target) target = [[(nsmatrix) selectedCell] tag] #define EXPORT_DROPDOWN(nspopupbutton, target) target = [[(nspopupbutton) selectedItem] tag] -#define IMPORT_TEXTFIELD(nstextfield, source) [(nstextfield) setStringValue:[[NSString stringWithCString:(source)] stringByAbbreviatingWithTildeInPath]] +#define EXPORT_SLIDER(nsslider, target) target = [(nsslider) intValue] + +// la structure vers l'affichage (setAllControls) +#define IMPORT_TEXTFIELD(nstextfield, mutablStrng, source) [mutablStrng setString:[NSString stringWithCString:(source) encoding:NSASCIIStringEncoding]] ; [nstextfield setStringValue:[NSApp pathUser:mutablStrng]] +#define IMPORT_NTEXTFIELD(nstextfield, source) [(nstextfield) setIntValue:(source)] #define IMPORT_SWITCH(nsbutton, source) [(nsbutton) setState:((source))? NSOnState : NSOffState] #define IMPORT_RADIO(nsmatrix, source) [(nsmatrix) selectCellWithTag:(source)] #define IMPORT_DROPDOWN(nspopupbutton, source) [(nspopupbutton) selectItemAtIndex:[(nspopupbutton) indexOfItemWithTag:(source)]] +#define IMPORT_SLIDER(nsslider,source) [(nsslider) setIntValue:source] + +#define INITIAL_DIR(dossier) [dossier length] < 2 ? @"~" : dossier + +// Back up of the current configuration parameters + +CNF_PARAMS CurrentParams; + // Keys to be listed in the Joysticks dropdowns SDLKey Preferences_KeysForJoysticks[] = @@ -160,298 +185,436 @@ SDLKey Preferences_KeysForJoysticks[] = SDLK_LALT, SDLK_RMETA, SDLK_LMETA, +#if !WITH_SDL2 SDLK_LSUPER, SDLK_RSUPER, - SDLK_MODE, SDLK_COMPOSE, + SDLK_BREAK, + SDLK_EURO, +#endif + SDLK_MODE, SDLK_HELP, SDLK_PRINT, SDLK_SYSREQ, - SDLK_BREAK, SDLK_MENU, SDLK_POWER, - SDLK_EURO, SDLK_UNDO }; size_t Preferences_cKeysForJoysticks = sizeof(Preferences_KeysForJoysticks) / sizeof(Preferences_KeysForJoysticks[0]); +#define DLGSOUND_11KHZ 0 +#define DLGSOUND_12KHZ 1 +#define DLGSOUND_16KHZ 2 +#define DLGSOUND_22KHZ 3 +#define DLGSOUND_25KHZ 4 +#define DLGSOUND_32KHZ 5 +#define DLGSOUND_44KHZ 6 +#define DLGSOUND_48KHZ 7 +#define DLGSOUND_50KHZ 8 + +static const int nSoundFreqs[] = +{ + 11025, + 12517, + 16000, + 22050, + 25033, + 32000, + 44100, + 48000, + 50066 +}; + @implementation PrefsController +char szPath[FILENAME_MAX]; -/*-----------------------------------------------------------------------*/ -/* - Helper method for Choose buttons - Returns: TRUE is the user selected a path, FALSE if he/she aborted -*/ -- (BOOL)choosePathForControl:(NSTextField*)textField chooseDirectories:(bool)chooseDirectories defaultInitialDir:(NSString*)defaultInitialDir +// not used +- (IBAction)finished:(id)sender { - // Create and configure an OpenPanel - NSOpenPanel *openPanel = [NSOpenPanel openPanel]; - [openPanel setCanChooseDirectories: chooseDirectories]; - [openPanel setCanChooseFiles: !chooseDirectories]; - - NSString *directoryToOpen; - NSString *fileToPreselect; - NSString *oldPath = [textField stringValue]; - if ((oldPath != nil) && ([oldPath length] > 0)) - { - // There is existing path: we will open its directory with its file pre-selected. - directoryToOpen = [oldPath stringByDeletingLastPathComponent]; - fileToPreselect = [oldPath lastPathComponent]; - } - else - { - // Currently no path: we will open the user's directory with no file selected. - directoryToOpen = [defaultInitialDir stringByExpandingTildeInPath]; - fileToPreselect = nil; - } - - // Run the OpenPanel, then check if the user clicked OK and selected at least one file - if ( (NSOKButton == [openPanel runModalForDirectory:directoryToOpen file:fileToPreselect types:nil] ) - && ([[openPanel filenames] count] > 0) ) - { - // Get the path to the selected file - NSString *path = [[openPanel filenames] objectAtIndex:0]; - - // Set the control to it (abbreviated if possible) - [textField setStringValue:[path stringByAbbreviatingWithTildeInPath]]; - - // Signal completion - return TRUE; - } - - // Signal that the selection was aborted - return FALSE; + //Main_RequestQuit(0) ; } - /*-----------------------------------------------------------------------*/ -/* - Helper method to insert a floppy image - TODO: Add code to restrict to known file types -*/ -- (void)insertFloppyImageIntoDrive:(int)drive forTextField:(NSTextField*)floppyTextField +/* Helper method for Choose buttons */ +/* Returns: TRUE is the user selected a path, FALSE if he/she aborted */ +/*-----------------------------------------------------------------------*/ +- (BOOL)choosePathForControl:(NSTextField*)textField chooseDirectories:(BOOL)chooseDirectories defaultInitialDir:(NSString*)defaultInitialDir + mutString:(NSMutableString *)mutString what:(NSArray *)what { - if ([self choosePathForControl:floppyTextField chooseDirectories:FALSE defaultInitialDir:[defaultImagesLocation stringValue]]) + NSString *directoryToOpen ; + NSString *fileToPreselect ; + NSString *newPath ; + + if ((mutString != nil) && (mutString.length > 2)) + { directoryToOpen = mutString.stringByDeletingLastPathComponent ; // There is existing path: we use it. + fileToPreselect = mutString.lastPathComponent ; } + else + { directoryToOpen = defaultInitialDir.stringByExpandingTildeInPath ; // no path: use user's directory + fileToPreselect = nil; } ; + + newPath = [NSApp hopenfile:chooseDirectories defoDir:directoryToOpen + defoFile:fileToPreselect types:what]; + if (newPath.length != 0) // user canceled if empty { - // Get the full path to the selected file - NSString *path = [[floppyTextField stringValue] stringByExpandingTildeInPath]; - - // Make a non-const C string out of it - const char* constSzPath = [path cString]; - size_t cbPath = strlen(constSzPath) + 1; - char szPath[cbPath]; - strncpy(szPath, constSzPath, cbPath); + [mutString setString:[NSString stringWithString:newPath]] ; // save this path + [textField setStringValue:[NSApp pathUser:newPath]]; // show localized path + return YES; + } ; - // Insert the floppy image at this path - Floppy_InsertDiskIntoDrive(drive, szPath); - } + return NO; // Selection aborted } -/*-----------------------------------------------------------------------*/ -/* - Helper function to convert display bits to a display mode number -*/ -int DisplayModeFromFlags(BOOL zoomSTLowRes, BOOL force8bpp) +/*----------------------------------------------------------------------*/ +/* Helper method to insert a floppy image */ +/* TODO: Add code to restrict to known file types */ +/*----------------------------------------------------------------------*/ + +- (void)insertFloppyImageIntoDrive:(int)drive forTextField:(NSTextField*)floppyTextField + realPath:(NSMutableString *)realPath { - if (zoomSTLowRes) - { - return (force8bpp)? DISPLAYMODE_LOWCOL_HIGHRES : DISPLAYMODE_HICOL_HIGHRES; - } - else - { - return (force8bpp)? DISPLAYMODE_LOWCOL_LOWRES : DISPLAYMODE_HICOL_LOWRES; - } + if ([self choosePathForControl:floppyTextField chooseDirectories:NO + defaultInitialDir:imgeDir + mutString:realPath what:@[allF]]) + + Floppy_SetDiskFileName(drive, [realPath cStringUsingEncoding:NSASCIIStringEncoding], NULL); + // Insert the floppy image at this path ???? } -/*-----------------------------------------------------------------------*/ -/* - Helper function to convert a display mode number to display bits -*/ -void DisplayModeToFlags(int chosenDisplayMode, BOOL *pZoomSTLowRes, BOOL *pForce8bpp) +//----------------------------------------------------------------------------- +- (NSString *)initial:(NSString *)route { - *pZoomSTLowRes = ( (chosenDisplayMode == DISPLAYMODE_LOWCOL_HIGHRES) - ||(chosenDisplayMode == DISPLAYMODE_HICOL_HIGHRES) ); - - *pForce8bpp = ( (chosenDisplayMode == DISPLAYMODE_LOWCOL_LOWRES) - ||(chosenDisplayMode == DISPLAYMODE_LOWCOL_HIGHRES) ); -} +BOOL flag1, flag2; + if ((route==nil) || (route.length == 0)) return @"~" ; + flag1 = [[NSFileManager defaultManager] fileExistsAtPath:route isDirectory:&flag2] ; + if (flag1 && !flag2) + return route ; + return route.stringByDeletingLastPathComponent ; +} -/*-----------------------------------------------------------------------*/ -/* - Methods for all the "Choose" buttons -*/ +/*----------------------------------------------------------------------*/ +// Methods for all the "Choose" buttons +/*----------------------------------------------------------------------*/ - (IBAction)chooseCartridgeImage:(id)sender; { - [self choosePathForControl: cartridgeImage chooseDirectories:FALSE defaultInitialDir:@"~"]; + [self choosePathForControl: cartridgeImage chooseDirectories:NO defaultInitialDir:[self initial:cartridge] // cartridge + mutString:cartridge what:@[allC]]; } +/*----------------------------------------------------------------------*/ - (IBAction)chooseDefaultImagesLocation:(id)sender { - [self choosePathForControl: defaultImagesLocation chooseDirectories:TRUE defaultInitialDir:@"~"]; + [self choosePathForControl: defaultImagesLocation chooseDirectories:YES defaultInitialDir:[self initial:imgeDir] // images location + mutString:imgeDir what:nil]; } - +/*----------------------------------------------------------------------*/ - (IBAction)chooseFloppyImageA:(id)sender { - [self insertFloppyImageIntoDrive:0 forTextField: floppyImageA]; + [self insertFloppyImageIntoDrive:0 forTextField:floppyImageA realPath:floppyA]; // floppy A } - +/*----------------------------------------------------------------------*/ - (IBAction)chooseFloppyImageB:(id)sender { - [self insertFloppyImageIntoDrive:1 forTextField: floppyImageB]; + [self insertFloppyImageIntoDrive:1 forTextField:floppyImageB realPath:floppyB]; // floppy B } - -- (IBAction)chooseGemdosImage:(id)sender +/*----------------------------------------------------------------------*/ +- (IBAction)chooseGemdosImage:(id)sender // directory for Gemdos { - [self choosePathForControl: gemdosImage chooseDirectories:TRUE defaultInitialDir:@"~"]; + [self choosePathForControl: gemdosImage chooseDirectories:YES defaultInitialDir:INITIAL_DIR(gemdos) // gemdos + mutString:gemdos what:nil] ; + if (gemdos.length >2 ) [gemdosImage setStringValue:[NSApp pathUser:gemdos]] ; } - +/*----------------------------------------------------------------------*/ - (IBAction)chooseHdImage:(id)sender { - [self choosePathForControl: hdImage chooseDirectories:FALSE defaultInitialDir:@"~"]; + [self choosePathForControl: hdImage chooseDirectories:NO defaultInitialDir:[self initial:hrdDisk] // HD image ? + mutString:hrdDisk what:@[@"img",@"hdv"]] ; } - +/*----------------------------------------------------------------------*/ +- (IBAction)chooseIdeMasterHdImage:(id)sender +{ + [self choosePathForControl: ideMasterHdImage chooseDirectories:NO defaultInitialDir:[self initial:masterIDE] // IDE master + mutString:masterIDE what:@[@"hdv"]]; +} +/*----------------------------------------------------------------------*/ +- (IBAction)chooseIdeSlaveHdImage:(id)sender +{ + [self choosePathForControl: ideSlaveHdImage chooseDirectories:NO defaultInitialDir:[self initial:slaveIDE] // IDE slave + mutString:slaveIDE what:@[@"hdv"]]; +} +/*----------------------------------------------------------------------*/ - (IBAction)chooseKeyboardMappingFile:(id)sender { - [self choosePathForControl: keyboardMappingFile chooseDirectories:FALSE defaultInitialDir:@"~"]; + [self choosePathForControl: keyboardMappingFile chooseDirectories:NO defaultInitialDir:[self initial:keyboard] // keyboard mapping + mutString:keyboard what:@[@"txt",@"map"]]; } - +/*----------------------------------------------------------------------*/ - (IBAction)chooseMidiOutputFile:(id)sender { - [self choosePathForControl: writeMidiToFile chooseDirectories:FALSE defaultInitialDir:@"~"]; + [self choosePathForControl: writeMidiToFile chooseDirectories:NO defaultInitialDir:[self initial:midiOut] // midi output + mutString:midiOut what:@[@"mid"]]; } - +/*----------------------------------------------------------------------*/ - (IBAction)choosePrintToFile:(id)sender { - [self choosePathForControl: printToFile chooseDirectories:FALSE defaultInitialDir:@"~"]; + [self choosePathForControl: printToFile chooseDirectories:NO defaultInitialDir:[self initial:printit] // print to file + mutString:printit what:@[@"prn"]]; } - +/*----------------------------------------------------------------------*/ - (IBAction)chooseRS232InputFile:(id)sender { - [self choosePathForControl: readRS232FromFile chooseDirectories:FALSE defaultInitialDir:@"~"]; + [self choosePathForControl: readRS232FromFile chooseDirectories:NO defaultInitialDir:[self initial:rs232In] // RS232 input + mutString:rs232In what:nil]; } - +/*----------------------------------------------------------------------*/ - (IBAction)chooseRS232OutputFile:(id)sender { - [self choosePathForControl: writeRS232ToFile chooseDirectories:FALSE defaultInitialDir:@"~"]; + [self choosePathForControl: writeRS232ToFile chooseDirectories:NO defaultInitialDir:[self initial:rs232Out] // RS232 output + mutString:rs232Out what:nil]; } - +/*----------------------------------------------------------------------*/ - (IBAction)chooseTosImage:(id)sender; { - [self choosePathForControl: tosImage chooseDirectories:FALSE defaultInitialDir:@"~"]; + [self choosePathForControl: tosImage chooseDirectories:NO defaultInitialDir:[self initial:TOS] // TOS image + mutString:TOS what:@[allT]]; } -/*-----------------------------------------------------------------------*/ -/* - Methods for the "Eject" buttons -*/ +/*----------------------------------------------------------------------*/ +// Methods for the "Eject" buttons +/*----------------------------------------------------------------------*/ - (IBAction)ejectFloppyA:(id)sender { - Floppy_EjectDiskFromDrive(0, FALSE); + Floppy_SetDiskFileNameNone(0); - // Refresh the control - [floppyImageA setStringValue:@""]; + // Refresh control & mutablestring + floppyImageA.stringValue = @"" ; + floppyA.string = @"" ; } - +/*----------------------------------------------------------------------*/ - (IBAction)ejectFloppyB:(id)sender { - Floppy_EjectDiskFromDrive(1, FALSE); + Floppy_SetDiskFileNameNone(1); - // Refresh the control - [floppyImageB setStringValue:@""]; + // Refresh control & mutablestring + floppyImageB.stringValue = @"" ; + floppyB.string = @"" ; } - +/*----------------------------------------------------------------------*/ - (IBAction)ejectGemdosImage:(id)sender { - // Clear the control. Later. saveAllControls will set the DialogParams accordingly to signal this is ejected - [gemdosImage setStringValue:@""]; + // Clear the control. Later. saveAllControls will set the ConfigureParams accordingly + // to signal this is ejected + gemdosImage.stringValue = @"" ; + gemdos.string = @"" ; } - +/*----------------------------------------------------------------------*/ - (IBAction)ejectHdImage:(id)sender { - // Clear the control. Later. saveAllControls will set the DialogParams accordingly to signal this is ejected - [hdImage setStringValue:@""]; -} + // Clear the control. Later. saveAllControls will set the ConfigureParams accordingly + // to signal this is ejected + hdImage.stringValue = @"" ; + hrdDisk.string = @"" ; +} +/*----------------------------------------------------------------------*/ +- (IBAction)ejectIdeMasterHdImage:(id)sender +{ + // Clear the control. Later. saveAllControls will set the ConfigureParams accordingly + // to signal this is ejected + ideMasterHdImage.stringValue = @"" ; + masterIDE.string = @"" ; +} +/*----------------------------------------------------------------------*/ +- (IBAction)ejectIdeSlaveHdImage:(id)sender +{ + // Clear the control. Later. saveAllControls will set the ConfigureParams accordingly + // to signal this is ejected + ideSlaveHdImage.stringValue = @"" ; + slaveIDE.string = @"" ; +} + +/*----------------------------------------------------------------------*/ +/* Methods for the "Load Config" button */ +/*----------------------------------------------------------------------*/ + +- (IBAction)loadConfigFrom:(id)sender +{ + NSArray *lesURLs ; + NSString *ru ; + BOOL btOk ; + + ru = [NSString stringWithCString:(Paths_GetHatariHome()) encoding:NSASCIIStringEncoding] ; + opnPanel.allowedFileTypes = @[@"cfg"] ; + opnPanel.canChooseDirectories = NO ; + opnPanel.canChooseFiles = YES ; + opnPanel.accessoryView = partage ; + //10.5 ? + // if ([opnPanel respondsToSelector:@selector(setDirectoryURL:)]) + { opnPanel.directoryURL = [NSURL fileURLWithPath:ru isDirectory:YES] ; + opnPanel.nameFieldStringValue = @"hatari" ; + btOk = [opnPanel runModal] == NSModalResponseOK; // Ok ? + } + // 10.5 ? + // else + // btOk = [opnPanel runModalForDirectory:ru file:@"hatari"] == NSModalResponseOK; //NSOKButton ; + + if (!btOk) return ; // Cancel + + lesURLs = opnPanel.URLs ; + if ((lesURLs == nil) || (lesURLs.count == 0)) + return ; + + [configNm setString:[[lesURLs objectAtIndex:0] path]] ; + // Make a non-const C string out of it + [configNm getCString:sConfigFileName maxLength:FILENAME_MAX encoding:NSASCIIStringEncoding]; -/*-----------------------------------------------------------------------*/ -/* - Methods for the "Load Config" and "Save Config" buttons -*/ -- (IBAction)loadConfig:(id)sender -{ - // Load the config into DialogParams - Dialog_LoadParams(); - - // Refresh all the controls to match DialogParams + // Load the config into ConfigureParams + Configuration_Load(sConfigFileName); + + // Refresh all the controls to match ConfigureParams [self setAllControls]; } -- (IBAction)saveConfig:(id)sender -{ - // Update the DialogParams from the controls - [self saveAllControls]; - - // Save the DialogParams to the config file - Dialog_SaveParams(); +/*----------------------------------------------------------------------*/ +// Methods for the "Save Config" button (bottom preference window) +/*----------------------------------------------------------------------*/ +- (IBAction)saveConfigAs:(id)sender +{ + NSString *ru ; + BOOL btOk ; + + ru = [NSString stringWithCString:(Paths_GetHatariHome()) encoding:NSASCIIStringEncoding] ; + savPanel.allowedFileTypes = @[@"cfg"] ; + savPanel.accessoryView = hartage ; + //10.5 + // if ([savPanel respondsToSelector:@selector(setDirectoryURL:)]) + { savPanel.directoryURL = [NSURL fileURLWithPath:ru isDirectory:YES] ; // Since OS X 10.6 + savPanel.nameFieldStringValue = @"hatari" ; + btOk = [savPanel runModal] == NSModalResponseOK ; // Ok ? + } + //10.5 + // else + // btOk = [savPanel runModalForDirectory:ru file:@"hatari"] == NSModalResponseOK; //NSOKButton ; // avant 10.6 + + if (!btOk) + return ; // Cancel + + [configNm setString: savPanel.URL.path ]; + + // Make a non-const C string out of it + [configNm getCString:sConfigFileName maxLength:FILENAME_MAX encoding:NSASCIIStringEncoding]; + [self saveAllControls] ; // Save the config from ConfigureParams + Configuration_Save(); // [self configSave:configNm] ; +} +/*----------------------------------------------------------------------*/ +- (IBAction)aller:(id)sender +{ + NSString *defaultDirectory ; + + defaultDirectory = [NSString stringWithCString:(Paths_GetHatariHome()) encoding:NSASCIIStringEncoding] ; + // if ([opnPanel respondsToSelector:@selector(setDirectoryURL:)]) + opnPanel.directoryURL = [NSURL fileURLWithPath:defaultDirectory isDirectory:YES] ; + // else + // [opnPanel setDirectory:defaultDirectory] ; +} +/*----------------------------------------------------------------------*/ +- (IBAction)halle:(id)sender +{ + NSString *defaultDirectory ; + + defaultDirectory = [NSString stringWithCString:(Paths_GetHatariHome()) encoding:NSASCIIStringEncoding] ; + // if ([savPanel respondsToSelector:@selector(setDirectoryURL:)]) + savPanel.directoryURL = [NSURL fileURLWithPath:defaultDirectory isDirectory:YES] ; + // else + // [savPanel setDirectory:defaultDirectory] ; } -/*-----------------------------------------------------------------------*/ -/* - Commits and closes -*/ +/*----------------------------------------------------------------------*/ +//Commits and closes Ok button in preferences window +/*----------------------------------------------------------------------*/ - (IBAction)commitAndClose:(id)sender { - BOOL applyChanges = TRUE; // The user clicked OK [self saveAllControls]; - // If a reset is required, ask the user first - if (Dialog_DoNeedReset()) - { - applyChanges = ( 0 == NSRunAlertPanel (@"Reset the emulator?", - @"The emulator must be reset in order to apply your changes.\nAll current work will be lost.", - @"Don't reset", @"Reset", nil) ); - } - - // Commit the new configuration - if (applyChanges) - { - Dialog_CopyDialogParamsToConfiguration(FALSE); - } + [window close] ; + - // Close the window - [window close]; } +/*----------------------------------------------------------------------*/ +// Populate Joystick key dropdown - (void)initKeysDropDown:(NSPopUpButton*)dropDown { [dropDown removeAllItems]; - int i; + unsigned int i; for (i = 0; i < Preferences_cKeysForJoysticks; i++) { SDLKey key = Preferences_KeysForJoysticks[i]; const char* szKeyName = SDL_GetKeyName(key); - [dropDown addItemWithTitle:[[NSString stringWithCString:szKeyName] capitalizedString]]; - [[dropDown lastItem] setTag:key]; + [dropDown addItemWithTitle:[[NSString stringWithCString:szKeyName encoding:NSASCIIStringEncoding] capitalizedString]]; + dropDown.lastItem.tag = key ; } } -/*-----------------------------------------------------------------------*/ -/* - Displays the Preferences dialog -*/ +// ---------------------------------------------------------------------------- +// populate MIDI dropdowns +// +- (void)initMidiDropdowns +{ + [midiInPort removeAllItems]; + [midiOutPort removeAllItems]; + const char* szinPortName = "Off"; + [midiInPort addItemWithTitle:[NSString stringWithCString:szinPortName encoding:NSASCIIStringEncoding]]; + [midiOutPort addItemWithTitle:[NSString stringWithCString:szinPortName encoding:NSASCIIStringEncoding]]; + + int i = 0; + const char* portName; + while ((portName = Midi_Host_GetPortName(i++, true))) + [midiInPort addItemWithTitle:[NSString stringWithCString:portName encoding:NSASCIIStringEncoding]]; + i = 0; + while ((portName = Midi_Host_GetPortName(i++, false))) + [midiOutPort addItemWithTitle:[NSString stringWithCString:portName encoding:NSASCIIStringEncoding]]; +} + +// ---------------------------------------------------------------------------- +// ConfigureParams -> GUI controls +// +- (void)setMidiDropdowns +{ + [midiInPort selectItemWithTitle:[NSString stringWithCString:ConfigureParams.Midi.sMidiInPortName encoding:NSASCIIStringEncoding]]; + [midiOutPort selectItemWithTitle:[NSString stringWithCString:ConfigureParams.Midi.sMidiOutPortName encoding:NSASCIIStringEncoding]]; +} + +// ---------------------------------------------------------------------------- +// GUI controls -> ConfigureParams +// +- (void)saveMidiDropdowns +{ + strncpy(ConfigureParams.Midi.sMidiInPortName, [[midiInPort titleOfSelectedItem] UTF8String], FILENAME_MAX); + strncpy(ConfigureParams.Midi.sMidiOutPortName, [[midiOutPort titleOfSelectedItem] UTF8String], FILENAME_MAX); + ConfigureParams.Midi.sMidiInPortName[FILENAME_MAX-1] = 0; + ConfigureParams.Midi.sMidiOutPortName[FILENAME_MAX-1] = 0; +} + + +/*----------------------------------------------------------------------*/ +//Displays the Preferences dialog Ouverture de la fenêtre des préférences +/*----------------------------------------------------------------------*/ - (IBAction)loadPrefs:(id)sender { + //GuiOsx_Pause(true); + [configNm setString:[NSString stringWithCString:sConfigFileName encoding:NSASCIIStringEncoding]] ; + if (!bInitialized) { // Note: These inits cannot be done in awakeFromNib as by this time SDL is not yet initialized. @@ -473,35 +636,67 @@ void DisplayModeToFlags(int chosenDispla int i; for (i = 0; i < cRealJoysticks; i++) { - const char* szJoystickName = SDL_JoystickName(i); - [realJoystick addItemWithTitle:[[NSString stringWithCString:szJoystickName] capitalizedString]]; - [[realJoystick lastItem] setTag:i]; + const char* szJoystickName = Joy_GetName(i); + [realJoystick addItemWithTitle:[[NSString stringWithCString:szJoystickName encoding:NSASCIIStringEncoding] capitalizedString]]; + realJoystick.lastItem.tag = i ; } } else // No real joysticks: Disable the controls { - [[joystickMode cellWithTag:1] setEnabled:FALSE]; - [realJoystick setEnabled:FALSE]; + [joystickMode cellWithTag:1].enabled = FALSE ; + realJoystick.enabled = FALSE ; } - - bInitialized = TRUE; + + // Fill MIDI dropdowns + [self initMidiDropdowns]; + + bInitialized = true; } - // Copy configuration settings to DialogParams (which we will only commit back to the configuration settings if choosing OK) - DialogParams = ConfigureParams; + // Backup of configuration settings to CurrentParams (which we will only + // commit back to the configuration settings if choosing OK) + CurrentParams = ConfigureParams; + applyChanges=false; [self setAllControls]; // Display the window - [[ModalWrapper alloc] runModal:window]; -} + ModalWrapper *mw = [[ModalWrapper alloc] init]; + + [mw runModal:window]; + + [mw release]; // */ + + // solve bug screen-reset: close and kill preference windows before + // M. Saro, 2013 + //if(Ok button in preferences Windows) + //{ + // Check if change need reset + if (Change_DoNeedReset(&CurrentParams, &ConfigureParams)) + { + applyChanges = [NSApp myAlerte:NSAlertStyleInformational Txt:nil + firstB:localize(@"Don't reset") alternateB:localize(@"Reset") + otherB:nil informativeTxt:localize(@"Must be reset") ] == NSAlertSecondButtonReturn ; + if (applyChanges) + Change_CopyChangedParamsToConfiguration(&CurrentParams, &ConfigureParams, true) ; + else + ConfigureParams = CurrentParams; //Restore backup params + } + else + Change_CopyChangedParamsToConfiguration(&CurrentParams, &ConfigureParams, false); //Apply config without reset + //} + // else // not OK button + // { + // ConfigureParams = CurrentParams; //Restore backup params + // } + +} -/*-----------------------------------------------------------------------*/ -/* - Updates the controls following a change in the joystick selection -*/ +/*----------------------------------------------------------------------*/ +//Updates the controls following a change in the joystick selection +/*----------------------------------------------------------------------*/ - (IBAction)changeViewedJoystick:(id)sender { // Save the pre-joystick controls, as we are about to change them @@ -515,242 +710,524 @@ void DisplayModeToFlags(int chosenDispla } -/*-----------------------------------------------------------------------*/ -/* - Initializes all controls -*/ +/*----------------------------------------------------------------------*/ +//Initializes all controls, transfert des préférences dans la fenêtre +/*----------------------------------------------------------------------*/ - (void)setAllControls { - // Get the display mode flags - BOOL bZoomSTLowRes, bForce8bpp; - DisplayModeToFlags(DialogParams.Screen.ChosenDisplayMode, &bZoomSTLowRes, &bForce8bpp); // Import the floppy paths into their controls. - // Note: Floppy images are exposed in the prefs dialog, however they aren't stored with the prefs and won't need to be saved on exit. - IMPORT_TEXTFIELD(floppyImageA, EmulationDrives[0].szFileName); - IMPORT_TEXTFIELD(floppyImageB, EmulationDrives[1].szFileName); - + //Disk A + IMPORT_TEXTFIELD(floppyImageA, floppyA, ConfigureParams.DiskImage.szDiskFileName[0]); + IMPORT_SWITCH(enableDriveA, ConfigureParams.DiskImage.EnableDriveA); + if(ConfigureParams.DiskImage.DriveA_NumberOfHeads==1) + [driveA_NumberOfHeads setState:NSOffState]; + else + [driveA_NumberOfHeads setState:NSOnState]; + + //Disk B + IMPORT_TEXTFIELD(floppyImageB, floppyB, ConfigureParams.DiskImage.szDiskFileName[1]); // le B + IMPORT_SWITCH(enableDriveB,ConfigureParams.DiskImage.EnableDriveB); + if(ConfigureParams.DiskImage.DriveB_NumberOfHeads==1) + [driveB_NumberOfHeads setState:NSOffState]; + else + [driveB_NumberOfHeads setState:NSOnState]; + // Import all the preferences into their controls - IMPORT_SWITCH(autoInsertB, DialogParams.DiskImage.bAutoInsertDiskB); - IMPORT_SWITCH(blitter, DialogParams.System.bBlitter); - IMPORT_SWITCH(bootFromHD, DialogParams.HardDisk.bBootFromHardDisk); - IMPORT_SWITCH(captureOnChange, DialogParams.Screen.bCaptureChange); - IMPORT_TEXTFIELD(cartridgeImage, DialogParams.Rom.szCartridgeImageFileName); - IMPORT_RADIO(colorDepth, DialogParams.Screen.nVdiColors); - IMPORT_SWITCH(compatibleCpu, DialogParams.System.bCompatibleCpu); - IMPORT_RADIO(cpuClock, DialogParams.System.nCpuFreq); - IMPORT_RADIO(cpuType, DialogParams.System.nCpuLevel); - IMPORT_TEXTFIELD(defaultImagesLocation, DialogParams.DiskImage.szDiskImageDirectory); - IMPORT_SWITCH(enableMidi, DialogParams.Midi.bEnableMidi); - IMPORT_SWITCH(enablePrinter, DialogParams.Printer.bEnablePrinting); - IMPORT_SWITCH(enableRS232, DialogParams.RS232.bEnableRS232); - IMPORT_SWITCH(enableSound, DialogParams.Sound.bEnableSound); - IMPORT_SWITCH(force8bpp, bForce8bpp); - IMPORT_SWITCH(frameSkip, DialogParams.Screen.bFrameSkip); - IMPORT_SWITCH(interleaved, DialogParams.Screen.bInterleavedScreen); - IMPORT_RADIO(keyboardMapping, DialogParams.Keyboard.nKeymapType); - IMPORT_TEXTFIELD(keyboardMappingFile, DialogParams.Keyboard.szMappingFileName); - IMPORT_RADIO(machineType, DialogParams.System.nMachineType); - IMPORT_RADIO(monitor, DialogParams.Screen.bUseHighRes); - IMPORT_SWITCH(patchTimerD, DialogParams.System.bPatchTimerD); - IMPORT_RADIO(playbackQuality, DialogParams.Sound.nPlaybackQuality); - IMPORT_TEXTFIELD(printToFile, DialogParams.Printer.szPrintToFileName); - IMPORT_RADIO(ramSize, DialogParams.Memory.nMemorySize); - IMPORT_TEXTFIELD(readRS232FromFile, DialogParams.RS232.szInFileName); - IMPORT_SWITCH(realTime, DialogParams.System.bRealTimeClock); - IMPORT_RADIO(resolution, DialogParams.Screen.nVdiResolution); - IMPORT_SWITCH(slowFDC, DialogParams.System.bSlowFDC); - IMPORT_TEXTFIELD(tosImage, DialogParams.Rom.szTosImageFileName); - IMPORT_SWITCH(useBorders, DialogParams.Screen.bAllowOverscan); - IMPORT_SWITCH(useVDIResolution, DialogParams.Screen.bUseExtVdiResolutions); - IMPORT_TEXTFIELD(writeMidiToFile, DialogParams.Midi.szMidiOutFileName); - IMPORT_RADIO(writeProtection, DialogParams.DiskImage.nWriteProtection); - IMPORT_TEXTFIELD(writeRS232ToFile, DialogParams.RS232.szOutFileName); - IMPORT_SWITCH(zoomSTLowRes, bZoomSTLowRes); + IMPORT_TEXTFIELD(cartridgeImage, cartridge, ConfigureParams.Rom.szCartridgeImageFileName); + IMPORT_TEXTFIELD(defaultImagesLocation, imgeDir, ConfigureParams.DiskImage.szDiskImageDirectory); + IMPORT_TEXTFIELD(keyboardMappingFile, keyboard, ConfigureParams.Keyboard.szMappingFileName); + IMPORT_TEXTFIELD(printToFile, printit, ConfigureParams.Printer.szPrintToFileName); + IMPORT_TEXTFIELD(tosImage, TOS, ConfigureParams.Rom.szTosImageFileName); + IMPORT_TEXTFIELD(configFile, configNm, sConfigFileName); + IMPORT_TEXTFIELD(readRS232FromFile, rs232In, ConfigureParams.RS232.szInFileName); + IMPORT_TEXTFIELD(writeRS232ToFile, rs232Out, ConfigureParams.RS232.szOutFileName); + + IMPORT_SWITCH(autoInsertB, ConfigureParams.DiskImage.bAutoInsertDiskB); + IMPORT_SWITCH(blitter, ConfigureParams.System.bBlitter); + IMPORT_SWITCH(bootFromHD, ConfigureParams.HardDisk.bBootFromHardDisk); + //1.9.0 New Option + IMPORT_SWITCH(bFilenameConversion, ConfigureParams.HardDisk.bFilenameConversion); + if (ConfigureParams.HardDisk.nGemdosDrive == DRIVE_SKIP) + [nGemdosDrive setState:NSOnState]; + else + [nGemdosDrive setState:NSOffState]; + + IMPORT_SWITCH(nGemdosDrive, ConfigureParams.HardDisk.nGemdosDrive); + IMPORT_SWITCH(captureOnChange, ConfigureParams.Screen.bCrop); + IMPORT_RADIO(colorDepth, ConfigureParams.Screen.nVdiColors); + IMPORT_SWITCH(compatibleCpu, ConfigureParams.System.bCompatibleCpu); + IMPORT_RADIO(cpuClock, ConfigureParams.System.nCpuFreq); + IMPORT_RADIO(cpuType, ConfigureParams.System.nCpuLevel); + IMPORT_SWITCH(enableMidi, ConfigureParams.Midi.bEnableMidi); + IMPORT_SWITCH(enablePrinter, ConfigureParams.Printer.bEnablePrinting); + IMPORT_SWITCH(enableRS232, ConfigureParams.RS232.bEnableRS232); + IMPORT_SWITCH(enableSound, ConfigureParams.Sound.bEnableSound); + IMPORT_DROPDOWN(frameSkip, ConfigureParams.Screen.nFrameSkips); + IMPORT_RADIO(keyboardMapping, ConfigureParams.Keyboard.nKeymapType); + IMPORT_RADIO(machineType, ConfigureParams.System.nMachineType); + IMPORT_RADIO(monitor, ConfigureParams.Screen.nMonitorType); + IMPORT_SWITCH(patchTimerD, ConfigureParams.System.bPatchTimerD); + IMPORT_RADIO(ramSize, ConfigureParams.Memory.STRamSize_KB); // MS 12-2016 + IMPORT_SWITCH(fastFDC, ConfigureParams.DiskImage.FastFloppy); + IMPORT_SWITCH(useBorders, ConfigureParams.Screen.bAllowOverscan); + IMPORT_SWITCH(useVDIResolution, ConfigureParams.Screen.bUseExtVdiResolutions); + IMPORT_RADIO(floppyWriteProtection, ConfigureParams.DiskImage.nWriteProtection); + IMPORT_RADIO(HDWriteProtection, ConfigureParams.HardDisk.nWriteProtection); + // IMPORT_SWITCH(zoomSTLowRes, ConfigureParams.Screen.bZoomLowRes); + IMPORT_SWITCH(showStatusBar, ConfigureParams.Screen.bShowStatusbar); + IMPORT_DROPDOWN(enableDSP,ConfigureParams.System.nDSPType); + + // 12/04/2010 + IMPORT_SWITCH(falconTTRatio, ConfigureParams.Screen.bAspectCorrect); + IMPORT_SWITCH(fullScreen, ConfigureParams.Screen.bFullScreen); + IMPORT_SWITCH(ledDisks, ConfigureParams.Screen.bShowDriveLed); + IMPORT_SWITCH(keepDesktopResolution, ConfigureParams.Screen.bKeepResolution); + //v1.6.1 + IMPORT_SWITCH(FastBootPatch,ConfigureParams.System.bFastBoot); + IMPORT_RADIO(YMVoicesMixing,ConfigureParams.Sound.YmVolumeMixing); + + //1.9.0 SDL2 + IMPORT_SWITCH(SDL2UseLinearScaling, ConfigureParams.Screen.nRenderScaleQuality); + IMPORT_SWITCH(SDL2Resizable, ConfigureParams.Screen.bResizable) ; // MS 06-2017 + IMPORT_SWITCH(SDL2UseVSync, ConfigureParams.Screen.bUseVsync); + + //deal with the Max Zoomed Stepper + IMPORT_NTEXTFIELD(maxZoomedWidth, ConfigureParams.Screen.nMaxWidth); + IMPORT_NTEXTFIELD(maxZoomedHeight, ConfigureParams.Screen.nMaxHeight); + + [widthStepper setDoubleValue:[maxZoomedWidth intValue]]; + [heightStepper setDoubleValue:[maxZoomedHeight intValue]]; + + //1.9.1 Video Timing + switch(ConfigureParams.System.VideoTimingMode) + { + case VIDEO_TIMING_MODE_RANDOM:[videoTiming selectItemWithTag:0];break; + case VIDEO_TIMING_MODE_WS1:[videoTiming selectItemWithTag:1];break; + case VIDEO_TIMING_MODE_WS2:[videoTiming selectItemWithTag:2];break; + case VIDEO_TIMING_MODE_WS3:[videoTiming selectItemWithTag:3];break; + case VIDEO_TIMING_MODE_WS4:[videoTiming selectItemWithTag:4];break; + } + + //deal with TT RAM Size Stepper +#ifdef ENABLE_WINUAE_CPU + int ttramsize_MB=ConfigureParams.Memory.TTRamSize_KB/1024 ; //JV 12-2016 + + IMPORT_NTEXTFIELD(TTRAMSizeValue, ttramsize_MB); // MS 12-2016 + [TTRAMSizeStepper setDoubleValue:[TTRAMSizeValue intValue]]; + IMPORT_SWITCH(cycleExactCPU, ConfigureParams.System.bCycleExactCpu); + IMPORT_SWITCH(MMU_Emulation, ConfigureParams.System.bMMU); + IMPORT_SWITCH(adressSpace24, ConfigureParams.System.bAddressSpace24); + + if (ConfigureParams.System.n_FPUType == FPU_NONE) + [FPUType selectCellWithTag:0]; + else if (ConfigureParams.System.n_FPUType == FPU_68881) + [FPUType selectCellWithTag:1]; + else if (ConfigureParams.System.n_FPUType == FPU_68882) + [FPUType selectCellWithTag:2]; + else if (ConfigureParams.System.n_FPUType == FPU_CPU) + [FPUType selectCellWithTag:3]; + //not needed anymore + //IMPORT_SWITCH(CompatibleFPU, ConfigureParams.System.bCompatibleFPU); +#endif + + int i; + for (i = 0; i <= DLGSOUND_50KHZ-DLGSOUND_11KHZ; i++) + { + if (ConfigureParams.Sound.nPlaybackFreq > nSoundFreqs[i]-500 + && ConfigureParams.Sound.nPlaybackFreq < nSoundFreqs[i]+500) + { + [playbackQuality selectCellWithTag:(i)]; + break; + } + } + + if (ConfigureParams.Screen.nVdiWidth >= 1024) + [resolution selectCellWithTag:(2)]; + else if (ConfigureParams.Screen.nVdiWidth >= 768) + [resolution selectCellWithTag:(1)]; + else + [resolution selectCellWithTag:(0)]; + // If the HD flag is set, load the HD path, otherwise make it blank - if (DialogParams.HardDisk.bUseHardDiskImage) + if (ConfigureParams.Acsi[0].bUseDevice) { - IMPORT_TEXTFIELD(hdImage, DialogParams.HardDisk.szHardDiskImage); + IMPORT_TEXTFIELD(hdImage, hrdDisk, ConfigureParams.Acsi[0].sDeviceFile); } else { - [hdImage setStringValue:@""]; + hdImage.stringValue = @""; hrdDisk.string = @"" ; } - // If the Gemdos flag is set, load the Gemdos path, otherwise make it blank - if (DialogParams.HardDisk.bUseHardDiskDirectories) + // If the IDE HD flag is set, load the IDE HD path, otherwise make it blank + //Master + if (ConfigureParams.HardDisk.bUseIdeMasterHardDiskImage) + { + IMPORT_TEXTFIELD(ideMasterHdImage, masterIDE, ConfigureParams.HardDisk.szIdeMasterHardDiskImage); + } + else + { + ideMasterHdImage.stringValue = @"" ; [masterIDE setString:@""] ; + } + //Slave + if (ConfigureParams.HardDisk.bUseIdeSlaveHardDiskImage) { - IMPORT_TEXTFIELD(gemdosImage, DialogParams.HardDisk.szHardDiskDirectories[0]); + IMPORT_TEXTFIELD(ideSlaveHdImage, slaveIDE, ConfigureParams.HardDisk.szIdeSlaveHardDiskImage); } else { - [gemdosImage setStringValue:@""]; + ideSlaveHdImage.stringValue = @"" ; [slaveIDE setString:@""] ; } - // Set the per-joystick controls + // If the Gemdos flag is set, load the Gemdos path, otherwise make it blank + if (ConfigureParams.HardDisk.bUseHardDiskDirectories) + { + [gemdos setString:[NSString stringWithCString:(ConfigureParams.HardDisk.szHardDiskDirectories[0]) encoding:NSASCIIStringEncoding]] ; +// [gemdosImage setStringValue:[NSApp pathUser:[gemdos stringByDeletingLastPathComponent]]] ; + [gemdosImage setStringValue:[NSApp pathUser:gemdos]] ; + } + else + { + gemdosImage.stringValue = @"" ; [gemdos setString:@""]; + } + + // Set the per-joystick controls [self setJoystickControls]; - + + // -- MIDI + [self setMidiDropdowns]; + // Update the controls' enabled states - [self updateEnabledStates:self]; + [self updateEnabledStates:self]; } -/*-----------------------------------------------------------------------*/ -/* - Updates the enabled states of controls who depend on other controls -*/ +/*----------------------------------------------------------------------*/ +/* Updates the enabled states of controls who depend on other controls */ +/*----------------------------------------------------------------------*/ + - (IBAction)updateEnabledStates:(id)sender { // Joystick key controls are only enabled if "Use keyboard" is selected int nJoystickMode; EXPORT_RADIO(joystickMode, nJoystickMode); BOOL bUsingKeyboard = (nJoystickMode == JOYSTICK_KEYBOARD); - [joystickUp setEnabled:bUsingKeyboard]; - [joystickRight setEnabled:bUsingKeyboard]; - [joystickDown setEnabled:bUsingKeyboard]; - [joystickLeft setEnabled:bUsingKeyboard]; - [joystickFire setEnabled:bUsingKeyboard]; + joystickUp.enabled = bUsingKeyboard; + joystickRight.enabled = bUsingKeyboard; + joystickDown.enabled = bUsingKeyboard; + joystickLeft.enabled = bUsingKeyboard; + joystickFire.enabled = bUsingKeyboard; // Resolution and colour depth depend on Extended GEM VDI resolution BOOL bUsingVDI; EXPORT_SWITCH(useVDIResolution, bUsingVDI); - [resolution setEnabled:bUsingVDI]; - [colorDepth setEnabled:bUsingVDI]; + resolution.enabled = bUsingVDI; + colorDepth.enabled = bUsingVDI; // Playback quality depends on enable sound BOOL bSoundEnabled; - EXPORT_SWITCH(enableSound, bSoundEnabled); - [playbackQuality setEnabled:bSoundEnabled]; + EXPORT_SWITCH(enableSound, bSoundEnabled); + playbackQuality.enabled = bSoundEnabled ; } -/*-----------------------------------------------------------------------*/ -/* - Updates the joystick controls to match the new joystick selection -*/ +/*----------------------------------------------------------------------*/ +/* Updates the joystick controls to match the new joystick selection */ +/*----------------------------------------------------------------------*/ + - (void)setJoystickControls { // Get and persist the ID of the newly selected joystick EXPORT_DROPDOWN(currentJoystick, nCurrentJoystick); // Data validation: If the JoyID is out of bounds, correct it and, if set to use real joystick, change to disabled - if ( (DialogParams.Joysticks.Joy[nCurrentJoystick].nJoyId < 0) - || (DialogParams.Joysticks.Joy[nCurrentJoystick].nJoyId >= cRealJoysticks) ) + if ( (ConfigureParams.Joysticks.Joy[nCurrentJoystick].nJoyId < 0) + || (ConfigureParams.Joysticks.Joy[nCurrentJoystick].nJoyId >= cRealJoysticks) ) { - DialogParams.Joysticks.Joy[nCurrentJoystick].nJoyId = 0; - if (DialogParams.Joysticks.Joy[nCurrentJoystick].nJoystickMode == JOYSTICK_REALSTICK) + ConfigureParams.Joysticks.Joy[nCurrentJoystick].nJoyId = 0; + if (ConfigureParams.Joysticks.Joy[nCurrentJoystick].nJoystickMode == JOYSTICK_REALSTICK) { - DialogParams.Joysticks.Joy[nCurrentJoystick].nJoystickMode = JOYSTICK_DISABLED; - } + ConfigureParams.Joysticks.Joy[nCurrentJoystick].nJoystickMode = JOYSTICK_DISABLED; + } } // Don't change the realJoystick dropdown if none is available (to keep "(None available)" selected) if (cRealJoysticks > 0) { - IMPORT_DROPDOWN(realJoystick, DialogParams.Joysticks.Joy[nCurrentJoystick].nJoyId); + IMPORT_DROPDOWN(realJoystick, ConfigureParams.Joysticks.Joy[nCurrentJoystick].nJoyId); } - IMPORT_RADIO(joystickMode, DialogParams.Joysticks.Joy[nCurrentJoystick].nJoystickMode); - IMPORT_DROPDOWN(joystickUp, DialogParams.Joysticks.Joy[nCurrentJoystick].nKeyCodeUp); - IMPORT_DROPDOWN(joystickRight, DialogParams.Joysticks.Joy[nCurrentJoystick].nKeyCodeRight); - IMPORT_DROPDOWN(joystickDown, DialogParams.Joysticks.Joy[nCurrentJoystick].nKeyCodeDown); - IMPORT_DROPDOWN(joystickLeft, DialogParams.Joysticks.Joy[nCurrentJoystick].nKeyCodeLeft); - IMPORT_DROPDOWN(joystickFire, DialogParams.Joysticks.Joy[nCurrentJoystick].nKeyCodeFire); - IMPORT_SWITCH(enableAutoFire, DialogParams.Joysticks.Joy[nCurrentJoystick].bEnableAutoFire); + IMPORT_RADIO(joystickMode, ConfigureParams.Joysticks.Joy[nCurrentJoystick].nJoystickMode); + IMPORT_DROPDOWN(joystickUp, ConfigureParams.Joysticks.Joy[nCurrentJoystick].nKeyCodeUp); + IMPORT_DROPDOWN(joystickRight, ConfigureParams.Joysticks.Joy[nCurrentJoystick].nKeyCodeRight); + IMPORT_DROPDOWN(joystickDown, ConfigureParams.Joysticks.Joy[nCurrentJoystick].nKeyCodeDown); + IMPORT_DROPDOWN(joystickLeft, ConfigureParams.Joysticks.Joy[nCurrentJoystick].nKeyCodeLeft); + IMPORT_DROPDOWN(joystickFire, ConfigureParams.Joysticks.Joy[nCurrentJoystick].nKeyCodeFire); + IMPORT_SWITCH(enableAutoFire, ConfigureParams.Joysticks.Joy[nCurrentJoystick].bEnableAutoFire); } -/*-----------------------------------------------------------------------*/ -/* - Saves the setting for the joystick currently being viewed -*/ +/*----------------------------------------------------------------------*/ +// Saves the setting for the joystick currently being viewed +/*----------------------------------------------------------------------*/ - (void)saveJoystickControls { - EXPORT_RADIO(joystickMode, DialogParams.Joysticks.Joy[nCurrentJoystick].nJoystickMode); - EXPORT_DROPDOWN(realJoystick, DialogParams.Joysticks.Joy[nCurrentJoystick].nJoyId); - EXPORT_DROPDOWN(joystickUp, DialogParams.Joysticks.Joy[nCurrentJoystick].nKeyCodeUp); - EXPORT_DROPDOWN(joystickRight, DialogParams.Joysticks.Joy[nCurrentJoystick].nKeyCodeRight); - EXPORT_DROPDOWN(joystickDown, DialogParams.Joysticks.Joy[nCurrentJoystick].nKeyCodeDown); - EXPORT_DROPDOWN(joystickLeft, DialogParams.Joysticks.Joy[nCurrentJoystick].nKeyCodeLeft); - EXPORT_DROPDOWN(joystickFire, DialogParams.Joysticks.Joy[nCurrentJoystick].nKeyCodeFire); - EXPORT_SWITCH(enableAutoFire, DialogParams.Joysticks.Joy[nCurrentJoystick].bEnableAutoFire); + EXPORT_RADIO(joystickMode, ConfigureParams.Joysticks.Joy[nCurrentJoystick].nJoystickMode); + EXPORT_DROPDOWN(realJoystick, ConfigureParams.Joysticks.Joy[nCurrentJoystick].nJoyId); + EXPORT_DROPDOWN(joystickUp, ConfigureParams.Joysticks.Joy[nCurrentJoystick].nKeyCodeUp); + EXPORT_DROPDOWN(joystickRight, ConfigureParams.Joysticks.Joy[nCurrentJoystick].nKeyCodeRight); + EXPORT_DROPDOWN(joystickDown, ConfigureParams.Joysticks.Joy[nCurrentJoystick].nKeyCodeDown); + EXPORT_DROPDOWN(joystickLeft, ConfigureParams.Joysticks.Joy[nCurrentJoystick].nKeyCodeLeft); + EXPORT_DROPDOWN(joystickFire, ConfigureParams.Joysticks.Joy[nCurrentJoystick].nKeyCodeFire); + EXPORT_SWITCH(enableAutoFire, ConfigureParams.Joysticks.Joy[nCurrentJoystick].bEnableAutoFire); } -/*-----------------------------------------------------------------------*/ -/* - Saves the settings for all controls -*/ +/*----------------------------------------------------------------------*/ +// Saves the settings for all controls +/*----------------------------------------------------------------------*/ - (void)saveAllControls { - BOOL bZoomSTLowRes, bForce8bpp; - // Export the preference controls into their vars - EXPORT_SWITCH(autoInsertB, DialogParams.DiskImage.bAutoInsertDiskB); - EXPORT_SWITCH(blitter, DialogParams.System.bBlitter); - EXPORT_SWITCH(bootFromHD, DialogParams.HardDisk.bBootFromHardDisk); - EXPORT_SWITCH(captureOnChange, DialogParams.Screen.bCaptureChange); - EXPORT_TEXTFIELD(cartridgeImage, DialogParams.Rom.szCartridgeImageFileName); - EXPORT_RADIO(colorDepth, DialogParams.Screen.nVdiColors); - EXPORT_SWITCH(compatibleCpu, DialogParams.System.bCompatibleCpu); - EXPORT_RADIO(cpuClock, DialogParams.System.nCpuFreq); - EXPORT_RADIO(cpuType, DialogParams.System.nCpuLevel); - EXPORT_TEXTFIELD(defaultImagesLocation, DialogParams.DiskImage.szDiskImageDirectory); - EXPORT_SWITCH(enableMidi, DialogParams.Midi.bEnableMidi); - EXPORT_SWITCH(enablePrinter, DialogParams.Printer.bEnablePrinting); - EXPORT_SWITCH(enableRS232, DialogParams.RS232.bEnableRS232); - EXPORT_SWITCH(enableSound, DialogParams.Sound.bEnableSound); - EXPORT_SWITCH(force8bpp, bForce8bpp); - EXPORT_SWITCH(frameSkip, DialogParams.Screen.bFrameSkip); - EXPORT_SWITCH(interleaved, DialogParams.Screen.bInterleavedScreen); - EXPORT_RADIO(keyboardMapping, DialogParams.Keyboard.nKeymapType); - EXPORT_TEXTFIELD(keyboardMappingFile, DialogParams.Keyboard.szMappingFileName); - EXPORT_RADIO(machineType, DialogParams.System.nMachineType); - EXPORT_RADIO(monitor, DialogParams.Screen.bUseHighRes); - EXPORT_SWITCH(patchTimerD, DialogParams.System.bPatchTimerD); - EXPORT_RADIO(playbackQuality, DialogParams.Sound.nPlaybackQuality); - EXPORT_TEXTFIELD(printToFile, DialogParams.Printer.szPrintToFileName); - EXPORT_RADIO(ramSize, DialogParams.Memory.nMemorySize); - EXPORT_TEXTFIELD(readRS232FromFile, DialogParams.RS232.szInFileName); - EXPORT_SWITCH(realTime, DialogParams.System.bRealTimeClock); - EXPORT_RADIO(resolution, DialogParams.Screen.nVdiResolution); - EXPORT_SWITCH(slowFDC, DialogParams.System.bSlowFDC); - EXPORT_TEXTFIELD(tosImage, DialogParams.Rom.szTosImageFileName); - EXPORT_SWITCH(useBorders, DialogParams.Screen.bAllowOverscan); - EXPORT_SWITCH(useVDIResolution, DialogParams.Screen.bUseExtVdiResolutions); - EXPORT_TEXTFIELD(writeMidiToFile, DialogParams.Midi.szMidiOutFileName); - EXPORT_RADIO(writeProtection, DialogParams.DiskImage.nWriteProtection); - EXPORT_TEXTFIELD(writeRS232ToFile, DialogParams.RS232.szOutFileName); - EXPORT_SWITCH(zoomSTLowRes, bZoomSTLowRes); + + EXPORT_TEXTFIELD(cartridge, ConfigureParams.Rom.szCartridgeImageFileName); + EXPORT_TEXTFIELD(imgeDir, ConfigureParams.DiskImage.szDiskImageDirectory); + EXPORT_TEXTFIELD(keyboard, ConfigureParams.Keyboard.szMappingFileName); + EXPORT_TEXTFIELD(printit, ConfigureParams.Printer.szPrintToFileName); + EXPORT_TEXTFIELD(rs232In, ConfigureParams.RS232.szInFileName); + EXPORT_TEXTFIELD(TOS, ConfigureParams.Rom.szTosImageFileName); + EXPORT_TEXTFIELD(midiOut, ConfigureParams.Midi.sMidiOutFileName); + EXPORT_TEXTFIELD(rs232Out, ConfigureParams.RS232.szOutFileName); + + //Disk A + + EXPORT_SWITCH(enableDriveA, ConfigureParams.DiskImage.EnableDriveA); + if([driveA_NumberOfHeads state]==NSOnState) + ConfigureParams.DiskImage.DriveA_NumberOfHeads=2; + else + ConfigureParams.DiskImage.DriveA_NumberOfHeads=1; + + //Disk B + EXPORT_SWITCH(enableDriveB,ConfigureParams.DiskImage.EnableDriveB); + if([driveB_NumberOfHeads state]==NSOnState) + ConfigureParams.DiskImage.DriveB_NumberOfHeads=2; + else + ConfigureParams.DiskImage.DriveB_NumberOfHeads=1; + + EXPORT_SWITCH(autoInsertB, ConfigureParams.DiskImage.bAutoInsertDiskB); + EXPORT_SWITCH(blitter, ConfigureParams.System.bBlitter); + EXPORT_SWITCH(bootFromHD, ConfigureParams.HardDisk.bBootFromHardDisk); + // 1.9.0 new options in Disk + EXPORT_SWITCH(bFilenameConversion, ConfigureParams.HardDisk.bFilenameConversion); + + if ([nGemdosDrive state]==NSOnState) + ConfigureParams.HardDisk.nGemdosDrive = DRIVE_SKIP; + else + ConfigureParams.HardDisk.nGemdosDrive = DRIVE_C; + + EXPORT_SWITCH(captureOnChange, ConfigureParams.Screen.bCrop); + EXPORT_RADIO(colorDepth, ConfigureParams.Screen.nVdiColors); + EXPORT_SWITCH(compatibleCpu, ConfigureParams.System.bCompatibleCpu); + EXPORT_RADIO(cpuClock, ConfigureParams.System.nCpuFreq); + EXPORT_RADIO(cpuType, ConfigureParams.System.nCpuLevel); + EXPORT_SWITCH(enableMidi, ConfigureParams.Midi.bEnableMidi); + EXPORT_SWITCH(enablePrinter, ConfigureParams.Printer.bEnablePrinting); + EXPORT_SWITCH(enableRS232, ConfigureParams.RS232.bEnableRS232); + EXPORT_SWITCH(enableSound, ConfigureParams.Sound.bEnableSound); + EXPORT_DROPDOWN(frameSkip, ConfigureParams.Screen.nFrameSkips); + EXPORT_RADIO(keyboardMapping, ConfigureParams.Keyboard.nKeymapType); + EXPORT_RADIO(machineType, ConfigureParams.System.nMachineType); + EXPORT_RADIO(monitor, ConfigureParams.Screen.nMonitorType); + EXPORT_SWITCH(patchTimerD, ConfigureParams.System.bPatchTimerD); + EXPORT_RADIO(ramSize, ConfigureParams.Memory.STRamSize_KB); // MS 12-2016 + EXPORT_SWITCH(fastFDC, ConfigureParams.DiskImage.FastFloppy); + EXPORT_SWITCH(useBorders, ConfigureParams.Screen.bAllowOverscan); + EXPORT_SWITCH(useVDIResolution, ConfigureParams.Screen.bUseExtVdiResolutions); + EXPORT_RADIO(floppyWriteProtection, ConfigureParams.DiskImage.nWriteProtection); + EXPORT_RADIO(HDWriteProtection, ConfigureParams.HardDisk.nWriteProtection); + // EXPORT_SWITCH(zoomSTLowRes, ConfigureParams.Screen.bZoomLowRes); + EXPORT_SWITCH(showStatusBar,ConfigureParams.Screen.bShowStatusbar); + EXPORT_DROPDOWN(enableDSP,ConfigureParams.System.nDSPType); - // Set the display mode based on the display flags - DialogParams.Screen.ChosenDisplayMode = DisplayModeFromFlags(bZoomSTLowRes, bForce8bpp); + EXPORT_SWITCH(falconTTRatio, ConfigureParams.Screen.bAspectCorrect); + EXPORT_SWITCH(fullScreen, ConfigureParams.Screen.bFullScreen); + EXPORT_SWITCH(ledDisks, ConfigureParams.Screen.bShowDriveLed); + EXPORT_SWITCH(keepDesktopResolution, ConfigureParams.Screen.bKeepResolution); + + //v1.6.1 + EXPORT_SWITCH(FastBootPatch,ConfigureParams.System.bFastBoot); + EXPORT_RADIO(YMVoicesMixing,ConfigureParams.Sound.YmVolumeMixing); + //1.9.0 SDL2 + EXPORT_SWITCH(SDL2UseLinearScaling, ConfigureParams.Screen.nRenderScaleQuality); + EXPORT_SWITCH(SDL2Resizable, ConfigureParams.Screen.bResizable) ; // MS 06-2017 + EXPORT_SWITCH(SDL2UseVSync, ConfigureParams.Screen.bUseVsync); + + EXPORT_NTEXTFIELD(maxZoomedWidth, ConfigureParams.Screen.nMaxWidth); + EXPORT_NTEXTFIELD(maxZoomedHeight, ConfigureParams.Screen.nMaxHeight); + + // VIDEO TIMING + switch([videoTiming selectedTag]) + { + case 0: ConfigureParams.System.VideoTimingMode=VIDEO_TIMING_MODE_RANDOM; break; + case 1: ConfigureParams.System.VideoTimingMode=VIDEO_TIMING_MODE_WS1; break; + case 2: ConfigureParams.System.VideoTimingMode=VIDEO_TIMING_MODE_WS2; break; + case 3: ConfigureParams.System.VideoTimingMode=VIDEO_TIMING_MODE_WS3; break; + case 4: ConfigureParams.System.VideoTimingMode=VIDEO_TIMING_MODE_WS4; break; + } +#ifdef ENABLE_WINUAE_CPU + int ttramsizeMB=[TTRAMSizeValue intValue]*1024; //JV 12-2016 + ConfigureParams.Memory.TTRamSize_KB=ttramsizeMB; + + //EXPORT_NTEXTFIELD(TTRAMSizeValue, ConfigureParams.Memory.TTRamSize_KB); // MS 12-2016 + + EXPORT_SWITCH(cycleExactCPU, ConfigureParams.System.bCycleExactCpu); + EXPORT_SWITCH(MMU_Emulation, ConfigureParams.System.bMMU); + EXPORT_SWITCH(adressSpace24, ConfigureParams.System.bAddressSpace24); + if(FPUType.selectedCell.tag == 0 ) + ConfigureParams.System.n_FPUType = FPU_NONE; + else if(FPUType.selectedCell.tag == 1 ) + ConfigureParams.System.n_FPUType = FPU_68881; + else if(FPUType.selectedCell.tag == 2 ) + ConfigureParams.System.n_FPUType = FPU_68882; + else if(FPUType.selectedCell.tag == 3 ) + ConfigureParams.System.n_FPUType = FPU_CPU; + //not needed anymore + //EXPORT_SWITCH(CompatibleFPU, ConfigureParams.System.bCompatibleFPU); +#endif + + ConfigureParams.Sound.nPlaybackFreq = nSoundFreqs[[[playbackQuality selectedCell] tag]]; + + switch (resolution.selectedCell.tag ) + { + case 0: + ConfigureParams.Screen.nVdiWidth = 640; + ConfigureParams.Screen.nVdiHeight = 480; + break; + case 1: + ConfigureParams.Screen.nVdiWidth = 800; + ConfigureParams.Screen.nVdiHeight = 600; + break; + case 2: + ConfigureParams.Screen.nVdiWidth = 1024; + ConfigureParams.Screen.nVdiHeight = 768; + break; + } // Define the HD flag, and export the HD path if one is selected - if ([[hdImage stringValue] length] > 0) + if (hrdDisk.length > 0) + { + EXPORT_TEXTFIELD(hrdDisk, ConfigureParams.Acsi[0].sDeviceFile); + ConfigureParams.Acsi[0].bUseDevice = true; + } + else + { + ConfigureParams.Acsi[0].bUseDevice = false; + } + + // Define the IDE HD flag, and export the IDE HD path if one is selected + if (masterIDE.length > 0) { - EXPORT_TEXTFIELD(hdImage, DialogParams.HardDisk.szHardDiskImage); - DialogParams.HardDisk.bUseHardDiskImage = TRUE; + EXPORT_TEXTFIELD(masterIDE, ConfigureParams.HardDisk.szIdeMasterHardDiskImage); + ConfigureParams.HardDisk.bUseIdeMasterHardDiskImage = YES; } else { - DialogParams.HardDisk.bUseHardDiskImage = FALSE; + ConfigureParams.HardDisk.bUseIdeMasterHardDiskImage = NO; } - // Define the Gemdos flag, and export the Gemdos path if one is selected - if ([[gemdosImage stringValue] length] > 0) + // IDE Slave + if (slaveIDE.length > 0) { - EXPORT_TEXTFIELD(gemdosImage, DialogParams.HardDisk.szHardDiskDirectories[0]); - DialogParams.HardDisk.bUseHardDiskDirectories = TRUE; + EXPORT_TEXTFIELD(slaveIDE, ConfigureParams.HardDisk.szIdeSlaveHardDiskImage); + ConfigureParams.HardDisk.bUseIdeSlaveHardDiskImage = YES; } else { - DialogParams.HardDisk.bUseHardDiskDirectories = FALSE; + ConfigureParams.HardDisk.bUseIdeSlaveHardDiskImage = NO; } - // Save the per-joystick controls - [self saveJoystickControls]; + // Define the Gemdos flag, and export the Gemdos path if one is selected + if (gemdos.length > 0) + { + EXPORT_TEXTFIELD(gemdos, ConfigureParams.HardDisk.szHardDiskDirectories[0]); + ConfigureParams.HardDisk.bUseHardDiskDirectories = YES; + } + else + { + ConfigureParams.HardDisk.bUseHardDiskDirectories = NO; + } + + // Save the per-joystick controls + [self saveJoystickControls]; + + // -- MIDI + [self saveMidiDropdowns]; +} + +/*----------------------------------------------------------------------*/ +// Max Zoomed Adjust + +- (IBAction) setWidth:(id)sender; +{ + NSLog(@"Change Max Zoom width: %d", [sender intValue] ); + maxZoomedWidth.intValue = [sender intValue] ; +} + +/*----------------------------------------------------------------------*/ +- (IBAction) setHeight:(id)sender; +{ + NSLog(@"Change Max Zoom height: %d", [sender intValue]); + maxZoomedHeight.intValue = [sender intValue] ; +} + +/*----------------------------------------------------------------------*/ +- (IBAction)setTTRAMSize:(id)sender +{ + NSLog(@"Change TTRAMSize: %d", [sender intValue]); + TTRAMSizeValue.intValue = [sender intValue] ; + +} + ++(PrefsController *)prefs +{ + static PrefsController *prefs = nil; + if (!prefs) + prefs = [[PrefsController alloc] init]; + + return prefs; +} + +/*----------------------------------------------------------------------*/ +- (void)awakeFromNib +{ + cartridge = [NSMutableString stringWithCapacity:50] ; [cartridge setString:@""] ; [cartridge retain] ; + imgeDir = [NSMutableString stringWithCapacity:50] ; [imgeDir setString:@""] ; [imgeDir retain] ; + floppyA = [NSMutableString stringWithCapacity:50] ; [floppyA setString:@""] ; [floppyA retain] ; + floppyB = [NSMutableString stringWithCapacity:50] ; [floppyB setString:@""] ; [floppyB retain] ; + gemdos = [NSMutableString stringWithCapacity:50] ; [gemdos setString:@""] ; [gemdos retain] ; + hrdDisk = [NSMutableString stringWithCapacity:50] ; [hrdDisk setString:@""] ; [hrdDisk retain] ; + masterIDE = [NSMutableString stringWithCapacity:50] ; [masterIDE setString:@""] ; [masterIDE retain] ; + slaveIDE = [NSMutableString stringWithCapacity:50] ; [slaveIDE setString:@""] ; [slaveIDE retain] ; + keyboard = [NSMutableString stringWithCapacity:50] ; [keyboard setString:@""] ; [keyboard retain] ; + midiOut = [NSMutableString stringWithCapacity:50] ; [midiOut setString:@""] ; [midiOut retain] ; + printit = [NSMutableString stringWithCapacity:50] ; [printit setString:@""] ; [printit retain] ; + rs232In = [NSMutableString stringWithCapacity:50] ; [rs232In setString:@""] ; [rs232In retain] ; + rs232Out = [NSMutableString stringWithCapacity:50] ; [rs232Out setString:@""] ; [rs232Out retain] ; + TOS = [NSMutableString stringWithCapacity:50] ; [TOS setString:@""] ; [TOS retain] ; + configNm = [NSMutableString stringWithCapacity:50] ; [configNm setString:@""] ; [configNm retain] ; + opnPanel = [NSOpenPanel openPanel]; [opnPanel retain] ; + savPanel = [NSSavePanel savePanel]; [savPanel retain] ; +#ifdef ENABLE_WINUAE_CPU + cycleExactCPU.enabled = true; + MMU_Emulation.enabled = true; + adressSpace24.enabled = true; + TTRAMSizeValue.enabled = true; + //CompatibleFPU.enabled = true; + FPUType.enabled = true; + bCell68060.enabled = true; +#endif + } @end