ViewVC Help
View File | Revision Log | Show Annotations | Revision Graph | Root Listing
root/cebix/SheepShaver/src/MacOSX/PrefsEditor/PrefsEditor.mm
Revision: 1.6
Committed: 2009-08-01T15:31:54Z (14 years, 9 months ago) by asvitkine
Branch: MAIN
CVS Tags: HEAD
Changes since 1.5: +2 -0 lines
Log Message:
only if standalone

File Contents

# Content
1 /*
2 * PrefsEditor.m - Preferences editing in Cocoa on Mac OS X
3 *
4 * Copyright (C) 2006-2007 Alexei Svitkine
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19 */
20
21 #import "PrefsEditor.h"
22
23 #import "sysdeps.h"
24 #import "prefs.h"
25
26 const int CDROMRefNum = -62; // RefNum of driver
27
28 #ifdef STANDALONE_PREFS
29 void prefs_init()
30 {
31 }
32
33 void prefs_exit()
34 {
35 }
36 #endif
37
38 @implementation PrefsEditor
39
40 - (id) init
41 {
42 self = [super init];
43
44 #ifdef STANDALONE_PREFS
45 AddPrefsDefaults();
46 AddPlatformPrefsDefaults();
47
48 // Load preferences from settings file
49 LoadPrefs(NULL);
50 chdir([[[NSBundle mainBundle] bundlePath] UTF8String]);
51 chdir("..");
52 #endif
53
54 return self;
55 }
56
57 - (int)numberOfRowsInTableView:(NSTableView *)aTable
58 {
59 return [diskArray count];
60 }
61
62 - (id)tableView:(NSTableView *)aTable objectValueForTableColumn:(NSTableColumn *)aCol row:(int)aRow
63 {
64 return [diskArray objectAtIndex: aRow];
65 }
66
67 NSString *getStringFromPrefs(const char *key)
68 {
69 const char *value = PrefsFindString(key);
70 if (value == NULL)
71 return @"";
72 return [NSString stringWithCString: value];
73 }
74
75 - (void) awakeFromNib
76 {
77 diskArray = [[NSMutableArray alloc] init];
78
79 const char *dsk;
80 int index = 0;
81 while ((dsk = PrefsFindString("disk", index++)) != NULL)
82 [diskArray addObject: [NSString stringWithCString: dsk ]];
83
84 [disks setDataSource: self];
85 [disks reloadData];
86
87 int bootdriver = PrefsFindInt32("bootdriver"), active = 0;
88 switch (bootdriver) {
89 case 0: active = 0; break;
90 case CDROMRefNum: active = 1; break;
91 }
92 [bootFrom selectItemAtIndex: active ];
93
94 [romFile setStringValue: getStringFromPrefs("rom") ];
95 [unixRoot setStringValue: getStringFromPrefs("extfs") ];
96 [disableCdrom setIntValue: PrefsFindBool("nocdrom") ];
97 [ramSize setIntValue: PrefsFindInt32("ramsize") / (1024*1024) ];
98 [ramSizeStepper setIntValue: PrefsFindInt32("ramsize") / (1024*1024) ];
99
100 int display_type = 0;
101 int dis_width = 640;
102 int dis_height = 480;
103
104 const char *str = PrefsFindString("screen");
105 if (str != NULL) {
106 if (sscanf(str, "win/%d/%d", &dis_width, &dis_height) == 2)
107 display_type = 0;
108 else if (sscanf(str, "dga/%d/%d", &dis_width, &dis_height) == 2)
109 display_type = 1;
110 }
111
112 [videoType selectItemAtIndex: display_type ];
113 [width setIntValue: dis_width ];
114 [height setIntValue: dis_height ];
115
116 int frameskip = PrefsFindInt32("frameskip");
117 int item = -1;
118 switch (frameskip) {
119 case 12: item = 0; break;
120 case 8: item = 1; break;
121 case 6: item = 2; break;
122 case 4: item = 3; break;
123 case 2: item = 4; break;
124 case 1: item = 5; break;
125 case 0: item = 6; break;
126 }
127 if (item >= 0)
128 [refreshRate selectItemAtIndex: item ];
129
130 [qdAccel setIntValue: PrefsFindBool("gfxaccel") ];
131
132 [disableSound setIntValue: PrefsFindBool("nosound") ];
133 [outDevice setStringValue: getStringFromPrefs("dsp") ];
134 [mixDevice setStringValue: getStringFromPrefs("mixer") ];
135
136 [useRawKeyCodes setIntValue: PrefsFindBool("keycodes") ];
137 [rawKeyCodes setStringValue: getStringFromPrefs("keycodefile") ];
138 [rawKeyCodes setEnabled:[useRawKeyCodes intValue]];
139
140 int wheelmode = PrefsFindInt32("mousewheelmode"), wheel = 0;
141 switch (wheelmode) {
142 case 0: wheel = 0; break;
143 case 1: wheel = 1; break;
144 }
145 [mouseWheel selectItemAtIndex: wheel ];
146
147 [scrollLines setIntValue: PrefsFindInt32("mousewheellines") ];
148 [scrollLinesStepper setIntValue: PrefsFindInt32("mousewheellines") ];
149
150 [ignoreIllegalMemoryAccesses setIntValue: PrefsFindBool("ignoresegv") ];
151 [dontUseCPUWhenIdle setIntValue: PrefsFindBool("idlewait") ];
152 [enableJIT setIntValue: PrefsFindBool("jit") ];
153 [enable68kDREmulator setIntValue: PrefsFindBool("jit68k") ];
154
155 [modemPort setStringValue: getStringFromPrefs("seriala") ];
156 [printerPort setStringValue: getStringFromPrefs("serialb") ];
157 [ethernetInterface setStringValue: getStringFromPrefs("ether") ];
158 }
159
160 - (IBAction) addDisk:(id)sender
161 {
162 NSOpenPanel *open = [NSOpenPanel openPanel];
163 [open setCanChooseDirectories:NO];
164 [open setAllowsMultipleSelection:NO];
165 [open beginSheetForDirectory: @""
166 file: @"Unknown"
167 modalForWindow: window
168 modalDelegate: self
169 didEndSelector: @selector(_addDiskEnd: returnCode: contextInfo:)
170 contextInfo: nil];
171 }
172
173 - (void) _addDiskEnd: (NSOpenPanel *) open returnCode: (int) theReturnCode contextInfo: (void *) theContextInfo
174 {
175 if (theReturnCode == NSOKButton) {
176 char cwd[1024], filename[1024];
177 int cwdlen;
178 strlcpy(filename, [[open filename] UTF8String], sizeof(filename));
179 getcwd(cwd, sizeof(cwd));
180 cwdlen = strlen(cwd);
181 if (!strncmp(cwd, filename, cwdlen)) {
182 if (cwdlen >= 0 && cwd[cwdlen-1] != '/')
183 cwdlen++;
184 [diskArray addObject: [NSString stringWithCString: filename + cwdlen ]];
185 } else {
186 [diskArray addObject: [open filename]];
187 }
188 [disks reloadData];
189 }
190 [(NSData *)theContextInfo release];
191 }
192
193 - (IBAction) removeDisk:(id)sender
194 {
195 int selectedRow = [disks selectedRow];
196 if (selectedRow >= 0) {
197 [diskArray removeObjectAtIndex: selectedRow];
198 [disks reloadData];
199 }
200 }
201
202 - (IBAction) createDisk:(id)sender
203 {
204 NSSavePanel *save = [NSSavePanel savePanel];
205 [save setAccessoryView: diskSaveSize];
206 [save beginSheetForDirectory: @""
207 file: @"New.dsk"
208 modalForWindow: window
209 modalDelegate: self
210 didEndSelector: @selector(_createDiskEnd: returnCode: contextInfo:)
211 contextInfo: nil];
212 }
213
214 - (void) _createDiskEnd: (NSSavePanel *) save returnCode: (int) theReturnCode contextInfo: (void *) theContextInfo
215 {
216 if (theReturnCode == NSOKButton) {
217 int size = [diskSaveSizeField intValue];
218 if (size >= 0 && size <= 10000) {
219 char cmd[1024];
220 snprintf(cmd, sizeof(cmd), "dd if=/dev/zero \"of=%s\" bs=1024k count=%d", [[save filename] UTF8String], [diskSaveSizeField intValue]);
221 int ret = system(cmd);
222 if (ret == 0) {
223 char cwd[1024], filename[1024];
224 int cwdlen;
225 strlcpy(filename, [[save filename] UTF8String], sizeof(filename));
226 getcwd(cwd, sizeof(cwd));
227 cwdlen = strlen(cwd);
228 if (!strncmp(cwd, filename, cwdlen)) {
229 if (cwdlen >= 0 && cwd[cwdlen-1] != '/')
230 cwdlen++;
231 [diskArray addObject: [NSString stringWithCString: filename + cwdlen ]];
232 } else {
233 [diskArray addObject: [save filename]];
234 }
235 [disks reloadData];
236 }
237 }
238 }
239 [(NSData *)theContextInfo release];
240 }
241
242 - (IBAction) useRawKeyCodesClicked:(id)sender
243 {
244 [rawKeyCodes setEnabled:[useRawKeyCodes intValue]];
245 }
246
247 - (IBAction) browseForROMFileClicked:(id)sender
248 {
249 NSOpenPanel *open = [NSOpenPanel openPanel];
250 NSString *dir = @"";
251 NSString *file = [romFile stringValue];
252 [open setCanChooseDirectories:NO];
253 [open setAllowsMultipleSelection:NO];
254 [open beginSheetForDirectory: dir
255 file: file
256 modalForWindow: window
257 modalDelegate: self
258 didEndSelector: @selector(_browseForROMFileEnd: returnCode: contextInfo:)
259 contextInfo: nil];
260 }
261
262 - (void) _browseForROMFileEnd: (NSOpenPanel *) open returnCode: (int) theReturnCode contextInfo: (void *) theContextInfo
263 {
264 if (theReturnCode == NSOKButton) {
265 char cwd[1024], filename[1024];
266 int cwdlen;
267 strlcpy(filename, [[open filename] UTF8String], sizeof(filename));
268 getcwd(cwd, sizeof(cwd));
269 cwdlen = strlen(cwd);
270 if (!strncmp(cwd, filename, cwdlen)) {
271 if (cwdlen >= 0 && cwd[cwdlen-1] != '/')
272 cwdlen++;
273 [romFile setStringValue: [NSString stringWithCString: filename + cwdlen ]];
274 } else {
275 [romFile setStringValue: [open filename]];
276 }
277 }
278 [(NSData *)theContextInfo release];
279 }
280
281 - (void) windowWillClose: (NSNotification *) aNotification;
282 {
283 while (PrefsFindString("disk"))
284 PrefsRemoveItem("disk");
285
286 for (int i = 0; i < [diskArray count]; i++) {
287 PrefsAddString("disk", [[diskArray objectAtIndex:i] UTF8String]);
288 }
289 PrefsReplaceInt32("bootdriver", ([bootFrom indexOfSelectedItem] == 1 ? CDROMRefNum : 0));
290 PrefsReplaceString("rom", [[romFile stringValue] UTF8String]);
291 PrefsReplaceString("extfs", [[unixRoot stringValue] UTF8String]);
292 PrefsReplaceBool("nocdrom", [disableCdrom intValue]);
293 PrefsReplaceInt32("ramsize", [ramSize intValue] << 20);
294
295 char pref[256];
296 snprintf(pref, sizeof(pref), "%s/%d/%d", [videoType indexOfSelectedItem] == 0 ? "win" : "dga", [width intValue], [height intValue]);
297 PrefsReplaceString("screen", pref);
298
299 int rate = 8;
300 switch ([refreshRate indexOfSelectedItem]) {
301 case 0: rate = 12; break;
302 case 1: rate = 8; break;
303 case 2: rate = 6; break;
304 case 3: rate = 4; break;
305 case 4: rate = 2; break;
306 case 5: rate = 1; break;
307 case 6: rate = 0; break;
308 }
309 PrefsReplaceInt32("frameskip", rate);
310 PrefsReplaceBool("gfxaccel", [qdAccel intValue]);
311
312 PrefsReplaceBool("nosound", [disableSound intValue]);
313 PrefsReplaceString("dsp", [[outDevice stringValue] UTF8String]);
314 PrefsReplaceString("mixer", [[mixDevice stringValue] UTF8String]);
315
316 PrefsReplaceBool("keycodes", [useRawKeyCodes intValue]);
317 PrefsReplaceString("keycodefile", [[rawKeyCodes stringValue] UTF8String]);
318
319 PrefsReplaceInt32("mousewheelmode", [mouseWheel indexOfSelectedItem]);
320 PrefsReplaceInt32("mousewheellines", [scrollLines intValue]);
321
322 PrefsReplaceBool("ignoresegv", [ignoreIllegalMemoryAccesses intValue]);
323 PrefsReplaceBool("idlewait", [dontUseCPUWhenIdle intValue]);
324 PrefsReplaceBool("jit", [enableJIT intValue]);
325 PrefsReplaceBool("jit68k", [enable68kDREmulator intValue]);
326
327 PrefsReplaceString("seriala", [[modemPort stringValue] UTF8String]);
328 PrefsReplaceString("serialb", [[printerPort stringValue] UTF8String]);
329 PrefsReplaceString("ether", [[ethernetInterface stringValue] UTF8String]);
330
331 SavePrefs();
332
333 #ifdef STANDALONE_PREFS
334 PrefsExit();
335 exit(0);
336 #else
337 [NSApp stopModal];
338 #endif
339 }
340
341 - (void) dealloc
342 {
343 [super dealloc];
344 }
345
346 @end
347