diff --git a/SheepShaver/src/MacOSX/PrefsEditor/English.lproj/InfoPlist.strings b/SheepShaver/src/MacOSX/PrefsEditor/English.lproj/InfoPlist.strings
new file mode 100644
index 00000000..4e36ad6e
Binary files /dev/null and b/SheepShaver/src/MacOSX/PrefsEditor/English.lproj/InfoPlist.strings differ
diff --git a/SheepShaver/src/MacOSX/PrefsEditor/English.lproj/MainMenu.nib/classes.nib b/SheepShaver/src/MacOSX/PrefsEditor/English.lproj/MainMenu.nib/classes.nib
new file mode 100644
index 00000000..ddaaa18e
--- /dev/null
+++ b/SheepShaver/src/MacOSX/PrefsEditor/English.lproj/MainMenu.nib/classes.nib
@@ -0,0 +1,50 @@
+{
+ IBClasses = (
+ {CLASS = FirstResponder; LANGUAGE = ObjC; SUPERCLASS = NSObject; },
+ {
+ ACTIONS = {
+ addDisk = id;
+ browseForROMFileClicked = id;
+ createDisk = id;
+ removeDisk = id;
+ useRawKeyCodesClicked = id;
+ };
+ CLASS = PrefsEditor;
+ LANGUAGE = ObjC;
+ OUTLETS = {
+ bootFrom = NSComboBox;
+ disableCdrom = NSButton;
+ disableSound = NSButton;
+ diskSaveSize = NSView;
+ diskSaveSizeField = NSTextField;
+ disks = NSTableView;
+ dontUseCPUWhenIdle = NSButton;
+ enable68kDREmulator = NSButton;
+ enableJIT = NSButton;
+ ethernetInterface = NSTextField;
+ height = NSComboBox;
+ ignoreIllegalMemoryAccesses = NSButton;
+ mixDevice = NSTextField;
+ modemPort = NSTextField;
+ mouseWheel = NSPopUpButton;
+ outDevice = NSTextField;
+ printerPort = NSTextField;
+ qdAccel = NSButton;
+ ramSize = NSTextField;
+ ramSizeStepper = NSStepper;
+ rawKeyCodes = NSTextField;
+ refreshRate = NSPopUpButton;
+ romFile = NSTextField;
+ scrollLines = NSTextField;
+ scrollLinesStepper = NSStepper;
+ unixRoot = NSTextField;
+ useRawKeyCodes = NSButton;
+ videoType = NSPopUpButton;
+ width = NSComboBox;
+ window = NSWindow;
+ };
+ SUPERCLASS = NSObject;
+ }
+ );
+ IBVersion = 1;
+}
\ No newline at end of file
diff --git a/SheepShaver/src/MacOSX/PrefsEditor/English.lproj/MainMenu.nib/info.nib b/SheepShaver/src/MacOSX/PrefsEditor/English.lproj/MainMenu.nib/info.nib
new file mode 100644
index 00000000..5f738e61
--- /dev/null
+++ b/SheepShaver/src/MacOSX/PrefsEditor/English.lproj/MainMenu.nib/info.nib
@@ -0,0 +1,23 @@
+
+
+
+
+ IBDocumentLocation
+ 135 142 356 240 0 0 1680 1028
+ IBEditorPositions
+
+ 29
+ 132 352 305 44 0 0 1680 1028
+ 342
+ 715 652 249 104 0 0 1680 1028
+
+ IBFramework Version
+ 446.1
+ IBOpenObjects
+
+ 29
+
+ IBSystem Version
+ 8L2127
+
+
diff --git a/SheepShaver/src/MacOSX/PrefsEditor/English.lproj/MainMenu.nib/keyedobjects.nib b/SheepShaver/src/MacOSX/PrefsEditor/English.lproj/MainMenu.nib/keyedobjects.nib
new file mode 100644
index 00000000..1c5d63e2
Binary files /dev/null and b/SheepShaver/src/MacOSX/PrefsEditor/English.lproj/MainMenu.nib/keyedobjects.nib differ
diff --git a/SheepShaver/src/MacOSX/PrefsEditor/Info.plist b/SheepShaver/src/MacOSX/PrefsEditor/Info.plist
new file mode 100644
index 00000000..68215486
--- /dev/null
+++ b/SheepShaver/src/MacOSX/PrefsEditor/Info.plist
@@ -0,0 +1,28 @@
+
+
+
+
+ CFBundleDevelopmentRegion
+ English
+ CFBundleExecutable
+ ${EXECUTABLE_NAME}
+ CFBundleIconFile
+
+ CFBundleIdentifier
+ net.sourceforge.SheepShaverPrefs
+ CFBundleInfoDictionaryVersion
+ 6.0
+ CFBundleName
+ ${PRODUCT_NAME}
+ CFBundlePackageType
+ APPL
+ CFBundleSignature
+ ????
+ CFBundleVersion
+ 1.0.1
+ NSMainNibFile
+ MainMenu
+ NSPrincipalClass
+ NSApplication
+
+
diff --git a/SheepShaver/src/MacOSX/PrefsEditor/PrefsEditor.h b/SheepShaver/src/MacOSX/PrefsEditor/PrefsEditor.h
new file mode 100644
index 00000000..a69834bd
--- /dev/null
+++ b/SheepShaver/src/MacOSX/PrefsEditor/PrefsEditor.h
@@ -0,0 +1,70 @@
+/*
+ * PrefsEditor.h - Preferences editing in Cocoa on Mac OS X
+ *
+ * Copyright (C) 2006-2007 Alexei Svitkine
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+#import
+
+@interface PrefsEditor : NSObject
+{
+ IBOutlet NSWindow *window;
+ IBOutlet NSView *diskSaveSize;
+ IBOutlet NSTextField *diskSaveSizeField;
+ NSMutableArray *diskArray;
+
+ // Setup
+ IBOutlet NSTableView *disks;
+ IBOutlet NSComboBox *bootFrom;
+ IBOutlet NSButton *disableCdrom;
+ IBOutlet NSTextField *ramSize;
+ IBOutlet NSStepper *ramSizeStepper;
+ IBOutlet NSTextField *romFile;
+ IBOutlet NSTextField *unixRoot;
+ // Audio/Video
+ IBOutlet NSPopUpButton *videoType;
+ IBOutlet NSPopUpButton *refreshRate;
+ IBOutlet NSComboBox *width;
+ IBOutlet NSComboBox *height;
+ IBOutlet NSButton *qdAccel;
+ IBOutlet NSButton *disableSound;
+ IBOutlet NSTextField *outDevice;
+ IBOutlet NSTextField *mixDevice;
+ // Keyboard/Mouse
+ IBOutlet NSButton *useRawKeyCodes;
+ IBOutlet NSTextField *rawKeyCodes;
+ IBOutlet NSPopUpButton *mouseWheel;
+ IBOutlet NSTextField *scrollLines;
+ IBOutlet NSStepper *scrollLinesStepper;
+ // CPU/Misc
+ IBOutlet NSButton *ignoreIllegalMemoryAccesses;
+ IBOutlet NSButton *dontUseCPUWhenIdle;
+ IBOutlet NSButton *enableJIT;
+ IBOutlet NSButton *enable68kDREmulator;
+ IBOutlet NSTextField *modemPort;
+ IBOutlet NSTextField *printerPort;
+ IBOutlet NSTextField *ethernetInterface;
+}
+- (id) init;
+- (IBAction) addDisk:(id)sender;
+- (IBAction) removeDisk:(id)sender;
+- (IBAction) createDisk:(id)sender;
+- (IBAction) useRawKeyCodesClicked:(id)sender;
+- (IBAction) browseForROMFileClicked:(id)sender;
+- (void) windowWillClose: (NSNotification *) aNotification;
+- (void) dealloc;
+@end
diff --git a/SheepShaver/src/MacOSX/PrefsEditor/PrefsEditor.m b/SheepShaver/src/MacOSX/PrefsEditor/PrefsEditor.m
new file mode 100644
index 00000000..8359b622
--- /dev/null
+++ b/SheepShaver/src/MacOSX/PrefsEditor/PrefsEditor.m
@@ -0,0 +1,329 @@
+/*
+ * PrefsEditor.m - Preferences editing in Cocoa on Mac OS X
+ *
+ * Copyright (C) 2006-2007 Alexei Svitkine
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+#import "PrefsEditor.h"
+
+#import "sysdeps.h"
+#import "prefs.h"
+
+const int CDROMRefNum = -62; // RefNum of driver
+
+@implementation PrefsEditor
+
+- (id) init
+{
+ self = [super init];
+
+ AddPrefsDefaults();
+ AddPlatformPrefsDefaults();
+
+ // Load preferences from settings file
+ LoadPrefs();
+ chdir([[[NSBundle mainBundle] bundlePath] cString]);
+ chdir("..");
+
+ return self;
+}
+
+- (int)numberOfRowsInTableView:(NSTableView *)aTable
+{
+ return [diskArray count];
+}
+
+- (id)tableView:(NSTableView *)aTable objectValueForTableColumn:(NSTableColumn *)aCol row:(int)aRow
+{
+ return [diskArray objectAtIndex: aRow];
+}
+
+NSString *getStringFromPrefs(const char *key)
+{
+ const char *value = PrefsFindString(key);
+ if (value == NULL)
+ return @"";
+ return [NSString stringWithCString: value];
+}
+
+- (void) awakeFromNib
+{
+ diskArray = [[NSMutableArray alloc] init];
+
+ const char *dsk;
+ int index = 0;
+ while ((dsk = PrefsFindString("disk", index++)) != NULL)
+ [diskArray addObject: [NSString stringWithCString: dsk ]];
+
+ [disks setDataSource: self];
+ [disks reloadData];
+
+ int bootdriver = PrefsFindInt32("bootdriver"), active = 0;
+ switch (bootdriver) {
+ case 0: active = 0; break;
+ case CDROMRefNum: active = 1; break;
+ }
+ [bootFrom selectItemAtIndex: active ];
+
+ [romFile setStringValue: getStringFromPrefs("rom") ];
+ [unixRoot setStringValue: getStringFromPrefs("extfs") ];
+ [disableCdrom setIntValue: PrefsFindBool("nocdrom") ];
+ [ramSize setIntValue: PrefsFindInt32("ramsize") / (1024*1024) ];
+ [ramSizeStepper setIntValue: PrefsFindInt32("ramsize") / (1024*1024) ];
+
+ int display_type = 0;
+ int dis_width = 640;
+ int dis_height = 480;
+
+ const char *str = PrefsFindString("screen");
+ if (str != NULL) {
+ if (sscanf(str, "win/%d/%d", &dis_width, &dis_height) == 2)
+ display_type = 0;
+ else if (sscanf(str, "dga/%d/%d", &dis_width, &dis_height) == 2)
+ display_type = 1;
+ }
+
+ [videoType selectItemAtIndex: display_type ];
+ [width setIntValue: dis_width ];
+ [height setIntValue: dis_height ];
+
+ int frameskip = PrefsFindInt32("frameskip");
+ int item = -1;
+ switch (frameskip) {
+ case 12: item = 0; break;
+ case 8: item = 1; break;
+ case 6: item = 2; break;
+ case 4: item = 3; break;
+ case 2: item = 4; break;
+ case 1: item = 5; break;
+ case 0: item = 5; break;
+ }
+ if (item >= 0)
+ [refreshRate selectItemAtIndex: item ];
+
+ [qdAccel setIntValue: PrefsFindBool("gfxaccel") ];
+
+ [disableSound setIntValue: PrefsFindBool("nosound") ];
+ [outDevice setStringValue: getStringFromPrefs("dsp") ];
+ [mixDevice setStringValue: getStringFromPrefs("mixer") ];
+
+ [useRawKeyCodes setIntValue: PrefsFindBool("keycodes") ];
+ [rawKeyCodes setStringValue: getStringFromPrefs("keycodefile") ];
+ [rawKeyCodes setEnabled:[useRawKeyCodes intValue]];
+
+ int wheelmode = PrefsFindInt32("mousewheelmode"), wheel = 0;
+ switch (wheelmode) {
+ case 0: wheel = 0; break;
+ case 1: wheel = 1; break;
+ }
+ [mouseWheel selectItemAtIndex: wheel ];
+
+ [scrollLines setIntValue: PrefsFindInt32("mousewheellines") ];
+ [scrollLinesStepper setIntValue: PrefsFindInt32("mousewheellines") ];
+
+ [ignoreIllegalMemoryAccesses setIntValue: PrefsFindBool("ignoresegv") ];
+ [dontUseCPUWhenIdle setIntValue: PrefsFindBool("idlewait") ];
+ [enableJIT setIntValue: PrefsFindBool("jit") ];
+ [enable68kDREmulator setIntValue: PrefsFindBool("jit68k") ];
+
+ [modemPort setStringValue: getStringFromPrefs("seriala") ];
+ [printerPort setStringValue: getStringFromPrefs("serialb") ];
+ [ethernetInterface setStringValue: getStringFromPrefs("ether") ];
+}
+
+- (IBAction) addDisk:(id)sender
+{
+ NSOpenPanel *open = [NSOpenPanel openPanel];
+ [open setCanChooseDirectories:NO];
+ [open setAllowsMultipleSelection:NO];
+ [open beginSheetForDirectory: @""
+ file: @"Unknown"
+ modalForWindow: window
+ modalDelegate: self
+ didEndSelector: @selector(_addDiskEnd: returnCode: contextInfo:)
+ contextInfo: nil];
+}
+
+- (void) _addDiskEnd: (NSOpenPanel *) open returnCode: (int) theReturnCode contextInfo: (void *) theContextInfo
+{
+ if (theReturnCode == NSOKButton) {
+ char cwd[1024], filename[1024];
+ int cwdlen;
+ strlcpy(filename, [[open filename] cString], sizeof(filename));
+ getcwd(cwd, sizeof(cwd));
+ cwdlen = strlen(cwd);
+ if (!strncmp(cwd, filename, cwdlen)) {
+ if (cwdlen >= 0 && cwd[cwdlen-1] != '/')
+ cwdlen++;
+ [diskArray addObject: [NSString stringWithCString: filename + cwdlen ]];
+ } else {
+ [diskArray addObject: [open filename]];
+ }
+ [disks reloadData];
+ }
+ [(NSData *)theContextInfo release];
+}
+
+- (IBAction) removeDisk:(id)sender
+{
+ int selectedRow = [disks selectedRow];
+ if (selectedRow >= 0) {
+ [diskArray removeObjectAtIndex: selectedRow];
+ [disks reloadData];
+ }
+}
+
+- (IBAction) createDisk:(id)sender
+{
+ NSSavePanel *save = [NSSavePanel savePanel];
+ [save setAccessoryView: diskSaveSize];
+ [save beginSheetForDirectory: @""
+ file: @"New.dsk"
+ modalForWindow: window
+ modalDelegate: self
+ didEndSelector: @selector(_createDiskEnd: returnCode: contextInfo:)
+ contextInfo: nil];
+}
+
+- (void) _createDiskEnd: (NSSavePanel *) save returnCode: (int) theReturnCode contextInfo: (void *) theContextInfo
+{
+ if (theReturnCode == NSOKButton) {
+ int size = [diskSaveSizeField intValue];
+ if (size >= 0 && size <= 10000) {
+ char cmd[1024];
+ snprintf(cmd, sizeof(cmd), "dd if=/dev/zero \"of=%s\" bs=1024k count=%d", [[save filename] cString], [diskSaveSizeField intValue]);
+ int ret = system(cmd);
+ if (ret == 0) {
+ char cwd[1024], filename[1024];
+ int cwdlen;
+ strlcpy(filename, [[save filename] cString], sizeof(filename));
+ getcwd(cwd, sizeof(cwd));
+ cwdlen = strlen(cwd);
+ if (!strncmp(cwd, filename, cwdlen)) {
+ if (cwdlen >= 0 && cwd[cwdlen-1] != '/')
+ cwdlen++;
+ [diskArray addObject: [NSString stringWithCString: filename + cwdlen ]];
+ } else {
+ [diskArray addObject: [save filename]];
+ }
+ [disks reloadData];
+ }
+ }
+ }
+ [(NSData *)theContextInfo release];
+}
+
+- (IBAction) useRawKeyCodesClicked:(id)sender
+{
+ [rawKeyCodes setEnabled:[useRawKeyCodes intValue]];
+}
+
+- (IBAction) browseForROMFileClicked:(id)sender
+{
+ NSOpenPanel *open = [NSOpenPanel openPanel];
+ NSString *dir = @"";
+ NSString *file = [romFile stringValue];
+ [open setCanChooseDirectories:NO];
+ [open setAllowsMultipleSelection:NO];
+ [open beginSheetForDirectory: dir
+ file: file
+ modalForWindow: window
+ modalDelegate: self
+ didEndSelector: @selector(_browseForROMFileEnd: returnCode: contextInfo:)
+ contextInfo: nil];
+}
+
+- (void) _browseForROMFileEnd: (NSOpenPanel *) open returnCode: (int) theReturnCode contextInfo: (void *) theContextInfo
+{
+ if (theReturnCode == NSOKButton) {
+ char cwd[1024], filename[1024];
+ int cwdlen;
+ strlcpy(filename, [[open filename] cString], sizeof(filename));
+ getcwd(cwd, sizeof(cwd));
+ cwdlen = strlen(cwd);
+ if (!strncmp(cwd, filename, cwdlen)) {
+ if (cwdlen >= 0 && cwd[cwdlen-1] != '/')
+ cwdlen++;
+ [romFile setStringValue: [NSString stringWithCString: filename + cwdlen ]];
+ } else {
+ [romFile setStringValue: [open filename]];
+ }
+ }
+ [(NSData *)theContextInfo release];
+}
+
+- (void) windowWillClose: (NSNotification *) aNotification;
+{
+ while (PrefsFindString("disk"))
+ PrefsRemoveItem("disk");
+
+ for (int i = 0; i < [diskArray count]; i++) {
+ PrefsAddString("disk", [[diskArray objectAtIndex:i] cString]);
+ }
+ PrefsReplaceInt32("bootdriver", ([bootFrom indexOfSelectedItem] == 1 ? CDROMRefNum : 0));
+ PrefsReplaceString("rom", [[romFile stringValue] cString]);
+ PrefsReplaceString("extfs", [[unixRoot stringValue] cString]);
+ PrefsReplaceBool("nocdrom", [disableCdrom intValue]);
+ PrefsReplaceInt32("ramsize", [ramSize intValue] << 20);
+
+ char pref[256];
+ snprintf(pref, sizeof(pref), "%s/%d/%d", [videoType indexOfSelectedItem] == 0 ? "win" : "dga", [width intValue], [height intValue]);
+ PrefsReplaceString("screen", pref);
+
+ int rate = 8;
+ switch ([refreshRate indexOfSelectedItem]) {
+ case 0: rate = 12; break;
+ case 1: rate = 8; break;
+ case 2: rate = 6; break;
+ case 3: rate = 4; break;
+ case 4: rate = 2; break;
+ case 5: rate = 1; break;
+ }
+ PrefsReplaceInt32("frameskip", rate);
+ PrefsReplaceBool("gfxaccel", [qdAccel intValue]);
+
+ PrefsReplaceBool("nosound", [disableSound intValue]);
+ PrefsReplaceString("dsp", [[outDevice stringValue] cString]);
+ PrefsReplaceString("mixer", [[mixDevice stringValue] cString]);
+
+ PrefsReplaceBool("keycodes", [useRawKeyCodes intValue]);
+ PrefsReplaceString("keycodefile", [[rawKeyCodes stringValue] cString]);
+
+ PrefsReplaceInt32("mousewheelmode", [mouseWheel indexOfSelectedItem]);
+ PrefsReplaceInt32("mousewheellines", [scrollLines intValue]);
+
+ PrefsReplaceBool("ignoresegv", [ignoreIllegalMemoryAccesses intValue]);
+ PrefsReplaceBool("idlewait", [dontUseCPUWhenIdle intValue]);
+ PrefsReplaceBool("jit", [enableJIT intValue]);
+ PrefsReplaceBool("jit68k", [enable68kDREmulator intValue]);
+
+ PrefsReplaceString("seriala", [[modemPort stringValue] cString]);
+ PrefsReplaceString("serialb", [[printerPort stringValue] cString]);
+ PrefsReplaceString("ether", [[ethernetInterface stringValue] cString]);
+
+ SavePrefs();
+ PrefsExit();
+ exit(0);
+}
+
+- (void) dealloc
+{
+ [super dealloc];
+}
+
+@end
+
diff --git a/SheepShaver/src/MacOSX/PrefsEditor/SheepShaverPrefs.xcodeproj/project.pbxproj b/SheepShaver/src/MacOSX/PrefsEditor/SheepShaverPrefs.xcodeproj/project.pbxproj
new file mode 100644
index 00000000..752fd414
--- /dev/null
+++ b/SheepShaver/src/MacOSX/PrefsEditor/SheepShaverPrefs.xcodeproj/project.pbxproj
@@ -0,0 +1,303 @@
+// !$*UTF8*$!
+{
+ archiveVersion = 1;
+ classes = {
+ };
+ objectVersion = 42;
+ objects = {
+
+/* Begin PBXBuildFile section */
+ 084186B10B3A0515004B1F63 /* PrefsEditor.m in Sources */ = {isa = PBXBuildFile; fileRef = 084186B00B3A0515004B1F63 /* PrefsEditor.m */; };
+ 08DC90BD0B67074C00799A45 /* prefs_items.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 08DC90BC0B67074C00799A45 /* prefs_items.cpp */; };
+ 08DC90BF0B67075D00799A45 /* prefs_unix.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 08DC90BE0B67075D00799A45 /* prefs_unix.cpp */; };
+ 08DC90C10B67077300799A45 /* prefs.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 08DC90C00B67077300799A45 /* prefs.cpp */; };
+ 8D11072A0486CEB800E47090 /* MainMenu.nib in Resources */ = {isa = PBXBuildFile; fileRef = 29B97318FDCFA39411CA2CEA /* MainMenu.nib */; };
+ 8D11072B0486CEB800E47090 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 089C165CFE840E0CC02AAC07 /* InfoPlist.strings */; };
+ 8D11072D0486CEB800E47090 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 29B97316FDCFA39411CA2CEA /* main.m */; settings = {ATTRIBUTES = (); }; };
+ 8D11072F0486CEB800E47090 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+/* End PBXBuildFile section */
+
+/* Begin PBXFileReference section */
+ 084186AF0B3A0515004B1F63 /* PrefsEditor.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = PrefsEditor.h; sourceTree = ""; };
+ 084186B00B3A0515004B1F63 /* PrefsEditor.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; path = PrefsEditor.m; sourceTree = ""; };
+ 089C165DFE840E0CC02AAC07 /* English */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = English; path = English.lproj/InfoPlist.strings; sourceTree = ""; };
+ 08DC90BC0B67074C00799A45 /* prefs_items.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = prefs_items.cpp; path = ../../prefs_items.cpp; sourceTree = SOURCE_ROOT; };
+ 08DC90BE0B67075D00799A45 /* prefs_unix.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = prefs_unix.cpp; path = ../../Unix/prefs_unix.cpp; sourceTree = SOURCE_ROOT; };
+ 08DC90C00B67077300799A45 /* prefs.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = prefs.cpp; path = ../../prefs.cpp; sourceTree = SOURCE_ROOT; };
+ 08DC90C20B67078300799A45 /* prefs.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = prefs.h; path = ../../include/prefs.h; sourceTree = SOURCE_ROOT; };
+ 08DC90C40B67079800799A45 /* sys.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = sys.h; path = ../../include/sys.h; sourceTree = SOURCE_ROOT; };
+ 08DC90C50B6707AC00799A45 /* user_strings_unix.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = user_strings_unix.h; path = ../../Unix/user_strings_unix.h; sourceTree = SOURCE_ROOT; };
+ 08DC90C60B6707B400799A45 /* config.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = config.h; path = ../../Unix/config.h; sourceTree = SOURCE_ROOT; };
+ 08DC90C70B6707BE00799A45 /* sysdeps.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = sysdeps.h; path = ../../Unix/sysdeps.h; sourceTree = SOURCE_ROOT; };
+ 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = /System/Library/Frameworks/Cocoa.framework; sourceTree = ""; };
+ 13E42FB307B3F0F600E4EEF1 /* CoreData.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreData.framework; path = /System/Library/Frameworks/CoreData.framework; sourceTree = ""; };
+ 29B97316FDCFA39411CA2CEA /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; };
+ 29B97319FDCFA39411CA2CEA /* English */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = English; path = English.lproj/MainMenu.nib; sourceTree = ""; };
+ 29B97324FDCFA39411CA2CEA /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = /System/Library/Frameworks/AppKit.framework; sourceTree = ""; };
+ 29B97325FDCFA39411CA2CEA /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = /System/Library/Frameworks/Foundation.framework; sourceTree = ""; };
+ 32CA4F630368D1EE00C91783 /* SheepShaverPrefs_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SheepShaverPrefs_Prefix.pch; sourceTree = ""; };
+ 8D1107310486CEB800E47090 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist; path = Info.plist; sourceTree = ""; };
+ 8D1107320486CEB800E47090 /* SheepShaverPrefs.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = SheepShaverPrefs.app; sourceTree = BUILT_PRODUCTS_DIR; };
+/* End PBXFileReference section */
+
+/* Begin PBXFrameworksBuildPhase section */
+ 8D11072E0486CEB800E47090 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 8D11072F0486CEB800E47090 /* Cocoa.framework in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXFrameworksBuildPhase section */
+
+/* Begin PBXGroup section */
+ 080E96DDFE201D6D7F000001 /* Classes */ = {
+ isa = PBXGroup;
+ children = (
+ );
+ name = Classes;
+ sourceTree = "";
+ };
+ 1058C7A0FEA54F0111CA2CBB /* Linked Frameworks */ = {
+ isa = PBXGroup;
+ children = (
+ 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */,
+ );
+ name = "Linked Frameworks";
+ sourceTree = "";
+ };
+ 1058C7A2FEA54F0111CA2CBB /* Other Frameworks */ = {
+ isa = PBXGroup;
+ children = (
+ 29B97324FDCFA39411CA2CEA /* AppKit.framework */,
+ 13E42FB307B3F0F600E4EEF1 /* CoreData.framework */,
+ 29B97325FDCFA39411CA2CEA /* Foundation.framework */,
+ );
+ name = "Other Frameworks";
+ sourceTree = "";
+ };
+ 19C28FACFE9D520D11CA2CBB /* Products */ = {
+ isa = PBXGroup;
+ children = (
+ 8D1107320486CEB800E47090 /* SheepShaverPrefs.app */,
+ );
+ name = Products;
+ sourceTree = "";
+ };
+ 29B97314FDCFA39411CA2CEA /* SheepShaverPrefs */ = {
+ isa = PBXGroup;
+ children = (
+ 08DC90C20B67078300799A45 /* prefs.h */,
+ 08DC90C40B67079800799A45 /* sys.h */,
+ 08DC90C50B6707AC00799A45 /* user_strings_unix.h */,
+ 08DC90C60B6707B400799A45 /* config.h */,
+ 08DC90C70B6707BE00799A45 /* sysdeps.h */,
+ 08DC90BC0B67074C00799A45 /* prefs_items.cpp */,
+ 08DC90BE0B67075D00799A45 /* prefs_unix.cpp */,
+ 08DC90C00B67077300799A45 /* prefs.cpp */,
+ 080E96DDFE201D6D7F000001 /* Classes */,
+ 29B97315FDCFA39411CA2CEA /* Other Sources */,
+ 29B97317FDCFA39411CA2CEA /* Resources */,
+ 29B97323FDCFA39411CA2CEA /* Frameworks */,
+ 19C28FACFE9D520D11CA2CBB /* Products */,
+ 084186AF0B3A0515004B1F63 /* PrefsEditor.h */,
+ 084186B00B3A0515004B1F63 /* PrefsEditor.m */,
+ );
+ name = SheepShaverPrefs;
+ sourceTree = "";
+ };
+ 29B97315FDCFA39411CA2CEA /* Other Sources */ = {
+ isa = PBXGroup;
+ children = (
+ 32CA4F630368D1EE00C91783 /* SheepShaverPrefs_Prefix.pch */,
+ 29B97316FDCFA39411CA2CEA /* main.m */,
+ );
+ name = "Other Sources";
+ sourceTree = "";
+ };
+ 29B97317FDCFA39411CA2CEA /* Resources */ = {
+ isa = PBXGroup;
+ children = (
+ 8D1107310486CEB800E47090 /* Info.plist */,
+ 089C165CFE840E0CC02AAC07 /* InfoPlist.strings */,
+ 29B97318FDCFA39411CA2CEA /* MainMenu.nib */,
+ );
+ name = Resources;
+ sourceTree = "";
+ };
+ 29B97323FDCFA39411CA2CEA /* Frameworks */ = {
+ isa = PBXGroup;
+ children = (
+ 1058C7A0FEA54F0111CA2CBB /* Linked Frameworks */,
+ 1058C7A2FEA54F0111CA2CBB /* Other Frameworks */,
+ );
+ name = Frameworks;
+ sourceTree = "";
+ };
+/* End PBXGroup section */
+
+/* Begin PBXNativeTarget section */
+ 8D1107260486CEB800E47090 /* SheepShaverPrefs */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = C01FCF4A08A954540054247B /* Build configuration list for PBXNativeTarget "SheepShaverPrefs" */;
+ buildPhases = (
+ 8D1107290486CEB800E47090 /* Resources */,
+ 8D11072C0486CEB800E47090 /* Sources */,
+ 8D11072E0486CEB800E47090 /* Frameworks */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ );
+ name = SheepShaverPrefs;
+ productInstallPath = "$(HOME)/Applications";
+ productName = SheepShaverPrefs;
+ productReference = 8D1107320486CEB800E47090 /* SheepShaverPrefs.app */;
+ productType = "com.apple.product-type.application";
+ };
+/* End PBXNativeTarget section */
+
+/* Begin PBXProject section */
+ 29B97313FDCFA39411CA2CEA /* Project object */ = {
+ isa = PBXProject;
+ buildConfigurationList = C01FCF4E08A954540054247B /* Build configuration list for PBXProject "SheepShaverPrefs" */;
+ hasScannedForEncodings = 1;
+ mainGroup = 29B97314FDCFA39411CA2CEA /* SheepShaverPrefs */;
+ projectDirPath = "";
+ targets = (
+ 8D1107260486CEB800E47090 /* SheepShaverPrefs */,
+ );
+ };
+/* End PBXProject section */
+
+/* Begin PBXResourcesBuildPhase section */
+ 8D1107290486CEB800E47090 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 8D11072A0486CEB800E47090 /* MainMenu.nib in Resources */,
+ 8D11072B0486CEB800E47090 /* InfoPlist.strings in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXResourcesBuildPhase section */
+
+/* Begin PBXSourcesBuildPhase section */
+ 8D11072C0486CEB800E47090 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 8D11072D0486CEB800E47090 /* main.m in Sources */,
+ 084186B10B3A0515004B1F63 /* PrefsEditor.m in Sources */,
+ 08DC90BD0B67074C00799A45 /* prefs_items.cpp in Sources */,
+ 08DC90BF0B67075D00799A45 /* prefs_unix.cpp in Sources */,
+ 08DC90C10B67077300799A45 /* prefs.cpp in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXSourcesBuildPhase section */
+
+/* Begin PBXVariantGroup section */
+ 089C165CFE840E0CC02AAC07 /* InfoPlist.strings */ = {
+ isa = PBXVariantGroup;
+ children = (
+ 089C165DFE840E0CC02AAC07 /* English */,
+ );
+ name = InfoPlist.strings;
+ sourceTree = "";
+ };
+ 29B97318FDCFA39411CA2CEA /* MainMenu.nib */ = {
+ isa = PBXVariantGroup;
+ children = (
+ 29B97319FDCFA39411CA2CEA /* English */,
+ );
+ name = MainMenu.nib;
+ sourceTree = "";
+ };
+/* End PBXVariantGroup section */
+
+/* Begin XCBuildConfiguration section */
+ C01FCF4B08A954540054247B /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ COPY_PHASE_STRIP = NO;
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_ENABLE_FIX_AND_CONTINUE = YES;
+ GCC_INPUT_FILETYPE = sourcecode.cpp.objcpp;
+ GCC_MODEL_TUNING = G5;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ GCC_PREPROCESSOR_DEFINITIONS = PREFS_EDITOR;
+ INFOPLIST_FILE = Info.plist;
+ INSTALL_PATH = "$(HOME)/Applications";
+ OTHER_CFLAGS = "$(inherited)";
+ PRODUCT_NAME = SheepShaverPrefs;
+ WRAPPER_EXTENSION = app;
+ ZERO_LINK = YES;
+ };
+ name = Debug;
+ };
+ C01FCF4C08A954540054247B /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ARCHS = (
+ ppc,
+ i386,
+ );
+ GCC_GENERATE_DEBUGGING_SYMBOLS = NO;
+ GCC_INPUT_FILETYPE = sourcecode.cpp.objcpp;
+ GCC_MODEL_TUNING = G5;
+ GCC_PREPROCESSOR_DEFINITIONS = PREFS_EDITOR;
+ INFOPLIST_FILE = Info.plist;
+ INSTALL_PATH = "$(HOME)/Applications";
+ OTHER_CFLAGS = "$(inherited)";
+ PRODUCT_NAME = SheepShaverPrefs;
+ WRAPPER_EXTENSION = app;
+ };
+ name = Release;
+ };
+ C01FCF4F08A954540054247B /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_WARN_ABOUT_RETURN_TYPE = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ PREBINDING = NO;
+ SDKROOT = /Developer/SDKs/MacOSX10.4u.sdk;
+ };
+ name = Debug;
+ };
+ C01FCF5008A954540054247B /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_WARN_ABOUT_RETURN_TYPE = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ PREBINDING = NO;
+ SDKROOT = /Developer/SDKs/MacOSX10.4u.sdk;
+ };
+ name = Release;
+ };
+/* End XCBuildConfiguration section */
+
+/* Begin XCConfigurationList section */
+ C01FCF4A08A954540054247B /* Build configuration list for PBXNativeTarget "SheepShaverPrefs" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ C01FCF4B08A954540054247B /* Debug */,
+ C01FCF4C08A954540054247B /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ C01FCF4E08A954540054247B /* Build configuration list for PBXProject "SheepShaverPrefs" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ C01FCF4F08A954540054247B /* Debug */,
+ C01FCF5008A954540054247B /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+/* End XCConfigurationList section */
+ };
+ rootObject = 29B97313FDCFA39411CA2CEA /* Project object */;
+}
diff --git a/SheepShaver/src/MacOSX/PrefsEditor/main.m b/SheepShaver/src/MacOSX/PrefsEditor/main.m
new file mode 100644
index 00000000..07ccbdbe
--- /dev/null
+++ b/SheepShaver/src/MacOSX/PrefsEditor/main.m
@@ -0,0 +1,26 @@
+/*
+ * main.m - Preferences editing in Cocoa on Mac OS X
+ *
+ * Copyright (C) 2006-2007 Alexei Svitkine
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+#import
+
+int main(int argc, char *argv[])
+{
+ return NSApplicationMain(argc, (const char **) argv);
+}