ViewVC Help
View File | Revision Log | Show Annotations | Revision Graph | Root Listing
root/cebix/SheepShaver/src/MacOSX/Launcher/VMSettingsController.mm
Revision: 1.8
Committed: 2010-07-27T02:57:10Z (13 years, 11 months ago) by asvitkine
Branch: MAIN
Changes since 1.7: +5 -2 lines
Log Message:
Fix compile on Snow Leopard.

File Contents

# Content
1 /*
2 * VMSettingsController.mm - Preferences editing in Cocoa on Mac OS X
3 *
4 * Copyright (C) 2006-2009 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 "sysdeps.h"
22 #import "prefs.h"
23
24 // The _UINT64 define is needed to guard against a typedef mismatch with Snow Leopard headers.
25 #define _UINT64
26
27 #import "VMSettingsController.h"
28
29 const int CDROMRefNum = -62; // RefNum of driver
30
31 #ifdef STANDALONE_PREFS
32 void prefs_init()
33 {
34 }
35
36 void prefs_exit()
37 {
38 }
39 #endif
40
41 @implementation VMSettingsController
42
43 + (id) sharedInstance
44 {
45 static VMSettingsController *_sharedInstance = nil;
46 if (!_sharedInstance) {
47 _sharedInstance = [[VMSettingsController allocWithZone:[self zone]] init];
48 }
49 return _sharedInstance;
50 }
51
52 - (id) init
53 {
54 self = [super initWithWindowNibName:@"VMSettingsWindow"];
55
56 cancelWasClicked = NO;
57
58 return self;
59 }
60
61 - (int) numberOfRowsInTableView: (NSTableView *) table
62 {
63 return [diskArray count];
64 }
65
66 - (id) tableView: (NSTableView *) table objectValueForTableColumn: (NSTableColumn *) col row: (int) row
67 {
68 return [diskArray objectAtIndex: row];
69 }
70
71 static NSString *getStringFromPrefs(const char *key)
72 {
73 const char *value = PrefsFindString(key);
74 if (value == NULL)
75 return @"";
76 return [NSString stringWithCString: value];
77 }
78
79 - (void) setupGUI
80 {
81 diskArray = [[NSMutableArray alloc] init];
82
83 const char *dsk;
84 int index = 0;
85 while ((dsk = PrefsFindString("disk", index++)) != NULL)
86 [diskArray addObject: [NSString stringWithCString: dsk ]];
87
88 [disks setDataSource: self];
89 [disks reloadData];
90
91 int bootdriver = PrefsFindInt32("bootdriver"), active = 0;
92 switch (bootdriver) {
93 case 0: active = 0; break;
94 case CDROMRefNum: active = 1; break;
95 }
96 [bootFrom selectItemAtIndex: active ];
97
98 [romFile setStringValue: getStringFromPrefs("rom") ];
99 [unixRoot setStringValue: getStringFromPrefs("extfs") ];
100 [disableCdrom setIntValue: PrefsFindBool("nocdrom") ];
101 [ramSize setIntValue: PrefsFindInt32("ramsize") / (1024*1024) ];
102 [ramSizeStepper setIntValue: PrefsFindInt32("ramsize") / (1024*1024) ];
103
104 int display_type = 0;
105 int dis_width = 640;
106 int dis_height = 480;
107
108 const char *str = PrefsFindString("screen");
109 if (str != NULL) {
110 if (sscanf(str, "win/%d/%d", &dis_width, &dis_height) == 2)
111 display_type = 0;
112 else if (sscanf(str, "dga/%d/%d", &dis_width, &dis_height) == 2)
113 display_type = 1;
114 }
115
116 [videoType selectItemAtIndex: display_type ];
117 [width setIntValue: dis_width ];
118 [height setIntValue: dis_height ];
119
120 int frameskip = PrefsFindInt32("frameskip");
121 int item = -1;
122 switch (frameskip) {
123 case 12: item = 0; break;
124 case 8: item = 1; break;
125 case 6: item = 2; break;
126 case 4: item = 3; break;
127 case 2: item = 4; break;
128 case 1: item = 5; break;
129 case 0: item = 6; break;
130 }
131 if (item >= 0)
132 [refreshRate selectItemAtIndex: item ];
133
134 [qdAccel setIntValue: PrefsFindBool("gfxaccel") ];
135
136 [disableSound setIntValue: PrefsFindBool("nosound") ];
137 [outDevice setStringValue: getStringFromPrefs("dsp") ];
138 [mixDevice setStringValue: getStringFromPrefs("mixer") ];
139
140 [useRawKeyCodes setIntValue: PrefsFindBool("keycodes") ];
141 [rawKeyCodes setStringValue: getStringFromPrefs("keycodefile") ];
142 [rawKeyCodes setEnabled:[useRawKeyCodes intValue]];
143 [browseRawKeyCodesButton setEnabled:[useRawKeyCodes intValue]];
144
145 int wheelmode = PrefsFindInt32("mousewheelmode"), wheel = 0;
146 switch (wheelmode) {
147 case 0: wheel = 0; break;
148 case 1: wheel = 1; break;
149 }
150 [mouseWheel selectItemAtIndex: wheel ];
151
152 [scrollLines setIntValue: PrefsFindInt32("mousewheellines") ];
153 [scrollLinesStepper setIntValue: PrefsFindInt32("mousewheellines") ];
154
155 [ignoreIllegalMemoryAccesses setIntValue: PrefsFindBool("ignoresegv") ];
156 [ignoreIllegalInstructions setIntValue: PrefsFindBool("ignoreillegal") ];
157 [dontUseCPUWhenIdle setIntValue: PrefsFindBool("idlewait") ];
158 [enableJIT setIntValue: PrefsFindBool("jit") ];
159 [enable68kDREmulator setIntValue: PrefsFindBool("jit68k") ];
160
161 [modemPort setStringValue: getStringFromPrefs("seriala") ];
162 [printerPort setStringValue: getStringFromPrefs("serialb") ];
163 [ethernetInterface setStringValue: getStringFromPrefs("ether") ];
164 }
165
166 - (void) editSettingsFor: (NSString *) vmdir sender: (id) sender
167 {
168 chdir([vmdir fileSystemRepresentation]);
169 AddPrefsDefaults();
170 AddPlatformPrefsDefaults();
171 LoadPrefs([vmdir fileSystemRepresentation]);
172 NSWindow *window = [self window];
173 [self setupGUI];
174 [NSApp runModalForWindow:window];
175 }
176
177 - (void) editSettingsForNewVM: (NSString *) vmdir sender: (id) sender
178 {
179 chdir([vmdir fileSystemRepresentation]);
180 AddPrefsDefaults();
181 AddPlatformPrefsDefaults();
182 LoadPrefs([vmdir fileSystemRepresentation]);
183 PrefsReplaceString("screen", "win/800/600");
184 PrefsReplaceString("extfs", "");
185 PrefsReplaceString("ether", "slirp");
186 PrefsReplaceInt32("ramsize", 64 << 20);
187 PrefsReplaceInt32("frameskip", 2);
188 PrefsReplaceBool("jit", true);
189 NSWindow *window = [self window];
190 [self setupGUI];
191 [NSApp runModalForWindow:window];
192 }
193
194 static NSString *makeRelativeIfNecessary(NSString *path)
195 {
196 char cwd[1024], filename[1024];
197 int cwdlen;
198 strlcpy(filename, [path fileSystemRepresentation], sizeof(filename));
199 getcwd(cwd, sizeof(cwd));
200 cwdlen = strlen(cwd);
201 if (!strncmp(cwd, filename, cwdlen)) {
202 if (cwdlen >= 0 && cwd[cwdlen-1] != '/')
203 cwdlen++;
204 return [NSString stringWithCString: filename + cwdlen];
205 }
206 return path;
207 }
208
209 - (IBAction) addDisk: (id) sender
210 {
211 NSOpenPanel *open = [NSOpenPanel openPanel];
212 [open setCanChooseDirectories:NO];
213 [open setAllowsMultipleSelection:NO];
214 [open setTreatsFilePackagesAsDirectories:YES];
215 [open beginSheetForDirectory: [[NSFileManager defaultManager] currentDirectoryPath]
216 file: @"Unknown"
217 modalForWindow: [self window]
218 modalDelegate: self
219 didEndSelector: @selector(_addDiskEnd: returnCode: contextInfo:)
220 contextInfo: nil];
221 }
222
223 - (void) _addDiskEnd: (NSOpenPanel *) open returnCode: (int) theReturnCode contextInfo: (void *) theContextInfo
224 {
225 if (theReturnCode == NSOKButton) {
226 [diskArray addObject: makeRelativeIfNecessary([open filename])];
227 [disks reloadData];
228 }
229 }
230
231 - (IBAction) removeDisk: (id) sender
232 {
233 int selectedRow = [disks selectedRow];
234 if (selectedRow >= 0) {
235 [diskArray removeObjectAtIndex: selectedRow];
236 [disks reloadData];
237 }
238 }
239
240 - (IBAction) createDisk: (id) sender
241 {
242 NSSavePanel *save = [NSSavePanel savePanel];
243 [save setAccessoryView: diskSaveSize];
244 [save setTreatsFilePackagesAsDirectories:YES];
245 [save beginSheetForDirectory: [[NSFileManager defaultManager] currentDirectoryPath]
246 file: @"New.dsk"
247 modalForWindow: [self window]
248 modalDelegate: self
249 didEndSelector: @selector(_createDiskEnd: returnCode: contextInfo:)
250 contextInfo: nil];
251 }
252
253 - (void) _createDiskEnd: (NSSavePanel *) save returnCode: (int) theReturnCode contextInfo: (void *) theContextInfo
254 {
255 if (theReturnCode == NSOKButton) {
256 int size = [diskSaveSizeField intValue];
257 if (size >= 0 && size <= 10000) {
258 char cmd[1024];
259 snprintf(cmd, sizeof(cmd), "dd if=/dev/zero \"of=%s\" bs=1024k count=%d", [[save filename] UTF8String], [diskSaveSizeField intValue]);
260 int ret = system(cmd);
261 if (ret == 0) {
262 [diskArray addObject: makeRelativeIfNecessary([save filename])];
263 [disks reloadData];
264 }
265 }
266 }
267 [(NSData *)theContextInfo release];
268 }
269
270 - (IBAction) useRawKeyCodesClicked: (id) sender
271 {
272 [rawKeyCodes setEnabled:[useRawKeyCodes intValue]];
273 [browseRawKeyCodesButton setEnabled:[useRawKeyCodes intValue]];
274 }
275
276 - (IBAction) browseForROMFileClicked: (id) sender
277 {
278 NSOpenPanel *open = [NSOpenPanel openPanel];
279 [open setCanChooseDirectories:NO];
280 [open setAllowsMultipleSelection:NO];
281 [open setTreatsFilePackagesAsDirectories:YES];
282 [open beginSheetForDirectory: @""
283 file: [romFile stringValue]
284 modalForWindow: [self window]
285 modalDelegate: self
286 didEndSelector: @selector(_browseForROMFileEnd: returnCode: contextInfo:)
287 contextInfo: nil];
288 }
289
290 - (void) _browseForROMFileEnd: (NSOpenPanel *) open returnCode: (int) theReturnCode contextInfo: (void *) theContextInfo
291 {
292 if (theReturnCode == NSOKButton) {
293 [romFile setStringValue: makeRelativeIfNecessary([open filename])];
294 }
295 }
296
297 - (IBAction) browseForUnixRootClicked: (id) sender
298 {
299 NSOpenPanel *open = [NSOpenPanel openPanel];
300 [open setCanChooseDirectories:YES];
301 [open setCanChooseFiles:NO];
302 [open setAllowsMultipleSelection:NO];
303 [open beginSheetForDirectory: @""
304 file: [unixRoot stringValue]
305 modalForWindow: [self window]
306 modalDelegate: self
307 didEndSelector: @selector(_browseForUnixRootEnd: returnCode: contextInfo:)
308 contextInfo: nil];
309 }
310
311 - (void) _browseForUnixRootEnd: (NSOpenPanel *) open returnCode: (int) theReturnCode contextInfo: (void *) theContextInfo
312 {
313 if (theReturnCode == NSOKButton) {
314 [unixRoot setStringValue: makeRelativeIfNecessary([open filename])];
315 }
316 }
317
318 - (IBAction) browseForKeyCodesFileClicked: (id) sender
319 {
320 NSOpenPanel *open = [NSOpenPanel openPanel];
321 [open setCanChooseDirectories:NO];
322 [open setAllowsMultipleSelection:NO];
323 [open setTreatsFilePackagesAsDirectories:YES];
324 [open beginSheetForDirectory: @""
325 file: [unixRoot stringValue]
326 modalForWindow: [self window]
327 modalDelegate: self
328 didEndSelector: @selector(_browseForKeyCodesFileEnd: returnCode: contextInfo:)
329 contextInfo: nil];
330 }
331
332 - (void) _browseForKeyCodesFileEnd: (NSOpenPanel *) open returnCode: (int) theReturnCode contextInfo: (void *) theContextInfo
333 {
334 if (theReturnCode == NSOKButton) {
335 [rawKeyCodes setStringValue: makeRelativeIfNecessary([open filename])];
336 }
337 }
338
339 - (void) cancelEdit: (id) sender
340 {
341 #ifdef STANDALONE_PREFS
342 PrefsExit();
343 #endif
344 [[self window] close];
345 [NSApp stopModal];
346 cancelWasClicked = YES;
347 }
348
349 - (void) saveChanges: (id) sender
350 {
351 while (PrefsFindString("disk"))
352 PrefsRemoveItem("disk");
353
354 for (int i = 0; i < [diskArray count]; i++) {
355 PrefsAddString("disk", [[diskArray objectAtIndex:i] UTF8String]);
356 }
357 PrefsReplaceInt32("bootdriver", ([bootFrom indexOfSelectedItem] == 1 ? CDROMRefNum : 0));
358 PrefsReplaceString("rom", [[romFile stringValue] UTF8String]);
359 PrefsReplaceString("extfs", [[unixRoot stringValue] UTF8String]);
360 PrefsReplaceBool("nocdrom", [disableCdrom intValue]);
361 PrefsReplaceInt32("ramsize", [ramSize intValue] << 20);
362
363 char pref[256];
364 snprintf(pref, sizeof(pref), "%s/%d/%d", [videoType indexOfSelectedItem] == 0 ? "win" : "dga", [width intValue], [height intValue]);
365 PrefsReplaceString("screen", pref);
366
367 int rate = 8;
368 switch ([refreshRate indexOfSelectedItem]) {
369 case 0: rate = 12; break;
370 case 1: rate = 8; break;
371 case 2: rate = 6; break;
372 case 3: rate = 4; break;
373 case 4: rate = 2; break;
374 case 5: rate = 1; break;
375 case 6: rate = 0; break;
376 }
377 PrefsReplaceInt32("frameskip", rate);
378 PrefsReplaceBool("gfxaccel", [qdAccel intValue]);
379
380 PrefsReplaceBool("nosound", [disableSound intValue]);
381 PrefsReplaceString("dsp", [[outDevice stringValue] UTF8String]);
382 PrefsReplaceString("mixer", [[mixDevice stringValue] UTF8String]);
383
384 PrefsReplaceBool("keycodes", [useRawKeyCodes intValue]);
385 PrefsReplaceString("keycodefile", [[rawKeyCodes stringValue] UTF8String]);
386
387 PrefsReplaceInt32("mousewheelmode", [mouseWheel indexOfSelectedItem]);
388 PrefsReplaceInt32("mousewheellines", [scrollLines intValue]);
389
390 PrefsReplaceBool("ignoresegv", [ignoreIllegalMemoryAccesses intValue]);
391 PrefsReplaceBool("ignoreillegal", [ignoreIllegalInstructions intValue]);
392 PrefsReplaceBool("idlewait", [dontUseCPUWhenIdle intValue]);
393 PrefsReplaceBool("jit", [enableJIT intValue]);
394 PrefsReplaceBool("jit68k", [enable68kDREmulator intValue]);
395
396 PrefsReplaceString("seriala", [[modemPort stringValue] UTF8String]);
397 PrefsReplaceString("serialb", [[printerPort stringValue] UTF8String]);
398 PrefsReplaceString("ether", [[ethernetInterface stringValue] UTF8String]);
399 SavePrefs();
400 #ifdef STANDALONE_PREFS
401 PrefsExit();
402 #endif
403
404 [[self window] close];
405 [NSApp stopModal];
406 cancelWasClicked = NO;
407 }
408
409 - (BOOL) cancelWasClicked
410 {
411 return cancelWasClicked;
412 }
413
414 - (void) dealloc
415 {
416 [super dealloc];
417 }
418
419 @end
420