From 2a2ec1b45f5e4db99bc235874a9bb34db83ba7bb Mon Sep 17 00:00:00 2001 From: Li Linfeng Date: Sun, 8 Sep 2019 15:51:50 +0800 Subject: [PATCH] support change config file, resource file path --- macosx/Celestia.entitlements | 2 + macosx/CelestiaAppCore.h | 2 +- macosx/CelestiaAppCore.mm | 58 +-------- macosx/CelestiaController.h | 4 + macosx/CelestiaController.m | 145 ++++++++++++---------- macosx/ConfigSelectionWindow.xib | 102 +++++++++++++++ macosx/ConfigSelectionWindowController.h | 22 ++++ macosx/ConfigSelectionWindowController.m | 49 ++++++++ macosx/ScriptsController.h | 2 +- macosx/ScriptsController.mm | 24 ++-- macosx/celestia.xcodeproj/project.pbxproj | 10 ++ 11 files changed, 282 insertions(+), 138 deletions(-) create mode 100644 macosx/ConfigSelectionWindow.xib create mode 100644 macosx/ConfigSelectionWindowController.h create mode 100644 macosx/ConfigSelectionWindowController.m diff --git a/macosx/Celestia.entitlements b/macosx/Celestia.entitlements index 18aff0ce4..8e8079cdd 100644 --- a/macosx/Celestia.entitlements +++ b/macosx/Celestia.entitlements @@ -6,5 +6,7 @@ com.apple.security.files.user-selected.read-only + com.apple.security.files.bookmarks.app-scope + diff --git a/macosx/CelestiaAppCore.h b/macosx/CelestiaAppCore.h index 942c0b518..b9d7890f3 100644 --- a/macosx/CelestiaAppCore.h +++ b/macosx/CelestiaAppCore.h @@ -27,7 +27,7 @@ class CelestiaCore; -(int)toCelestiaModifiers:(unsigned int)modifiers buttons:(unsigned int)buttons; -(void)archive; +(CelestiaAppCore *)sharedAppCore; --(BOOL)initSimulation; +-(BOOL)initSimulationWithConfigPath:(NSString *)configPath extraPath:(NSString *)extraPath; -(BOOL)initRenderer; -(void)start:(NSDate *)date; -(void)charEntered:(char)c withModifiers:(int)modifiers; diff --git a/macosx/CelestiaAppCore.mm b/macosx/CelestiaAppCore.mm index 1df6388e2..7126fbbc0 100644 --- a/macosx/CelestiaAppCore.mm +++ b/macosx/CelestiaAppCore.mm @@ -339,70 +339,22 @@ CelestiaCore *appCore; [super dealloc]; } --(BOOL)initSimulation +-(BOOL)initSimulationWithConfigPath:(NSString *)configPath extraPath:(NSString *)extraPath { BOOL result = NO; appCore = new CelestiaCore(); - NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults]; - NSString *confFileSetting; - std::string confFile; - NSArray *existingResourceDirsSetting; - NSArray *extrasDirsSetting; + std::string confFile = [configPath UTF8String]; std::vector extrasDirs; - NSString *extrasDir = nil; MacOSXSplashProgressNotifier progressNotifier; - if ((confFileSetting = [prefs stringForKey:@"conf"])) + if (extraPath) { - confFile = [confFileSetting stdString]; - } - - if ((existingResourceDirsSetting = [prefs stringArrayForKey:@"existingResourceDirs"])) - { - NSFileManager *fm = [NSFileManager defaultManager]; - BOOL isFolder = NO; - NSEnumerator *resouceDirEnum = [existingResourceDirsSetting objectEnumerator]; - NSString *resourceDir = nil; - NSString *existingConfFile = nil; - while ((resourceDir = [resouceDirEnum nextObject])) - { - existingConfFile = [resourceDir stringByAppendingPathComponent:@"celestia.cfg"]; - CelestiaConfig *config = ReadCelestiaConfig([existingConfFile stdString], NULL); - if (config) - { - for (vector::const_iterator iter = config->extrasDirs.begin(); - iter != config->extrasDirs.end(); iter++) - { - if (*iter != "") - { - extrasDir = [NSString stringWithStdString: (*iter)]; - if (([fm fileExistsAtPath: extrasDir = [extrasDir stringByStandardizingPath] isDirectory: &isFolder] && isFolder) || - [fm fileExistsAtPath: extrasDir = [resourceDir stringByAppendingPathComponent:extrasDir] isDirectory: &isFolder] && isFolder) - { - extrasDirs.push_back([extrasDir stdString]); - } - } - } - delete config; - } - else - { - if ([fm fileExistsAtPath: extrasDir = [resourceDir stringByAppendingPathComponent: @"extras"] isDirectory: &isFolder] && isFolder) - extrasDirs.push_back([extrasDir stdString]); - } - - } - } - if ((extrasDirsSetting = [prefs stringArrayForKey:@"extrasDirs"])) - { - NSEnumerator *iter = [extrasDirsSetting objectEnumerator]; - while ((extrasDir = [iter nextObject])) - extrasDirs.push_back([extrasDir stdString]); + extrasDirs.push_back([extraPath UTF8String]); } appCore->setAlerter(new MacOSXAlerter()); appCore->setCursorHandler(new MacOSXCursorHandler()); - result = appCore->initSimulation(!confFile.empty() ? &confFile : nil, + result = appCore->initSimulation(&confFile, &extrasDirs, &progressNotifier); if (result) diff --git a/macosx/CelestiaController.h b/macosx/CelestiaController.h index d0416a6cb..305f4d568 100644 --- a/macosx/CelestiaController.h +++ b/macosx/CelestiaController.h @@ -19,6 +19,7 @@ @class SplashWindowController; @class EclipseFinderController; @class ScriptsController; +@class ConfigSelectionWindowController; @interface CelestiaController : NSWindowController { @@ -28,6 +29,7 @@ BOOL ready; BOOL isDirty; BOOL isFullScreen; + BOOL needsRelaunch; IBOutlet SplashWindowController *splashWindowController; IBOutlet NSTextView *glInfo; IBOutlet NSPanel *glInfoPanel; @@ -39,6 +41,7 @@ BrowserWindowController *browserWindowController; EclipseFinderController *eclipseFinderController; NSWindowController *helpWindowController; + ConfigSelectionWindowController *configSelectionWindowController; NSTimer* timer; NSConditionLock* startupCondition; @@ -47,6 +50,7 @@ NSString *pendingScript; NSString *pendingUrl; } +-(void)setNeedsRelaunch:(BOOL)needsRelaunch; -(BOOL)applicationShouldTerminate:(id)sender; -(BOOL)windowShouldClose:(id)sender; -(IBAction)back:(id)sender; diff --git a/macosx/CelestiaController.m b/macosx/CelestiaController.m index baf51e06b..66706b730 100644 --- a/macosx/CelestiaController.m +++ b/macosx/CelestiaController.m @@ -18,12 +18,16 @@ #import #import #import "CGLInfo.h" +#import "ConfigSelectionWindowController.h" #include - @implementation CelestiaController +static NSURL *configFilePath = nil; +static NSURL *dataDirPath = nil; +static NSURL *extraDataDirPath = nil; + static CelestiaController* firstInstance; +(CelestiaController*) shared @@ -44,6 +48,30 @@ NSString* fatalErrorMessage; } if (firstInstance == nil ) firstInstance = self; + + // read config file/data dir from saved + NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults]; + NSData *configFileData = [prefs objectForKey:configFilePathPrefKey]; + NSData *dataDirData = [prefs objectForKey:configFilePathPrefKey]; + + if (configFileData != nil && dataDirData != nil) { + // read saved sandbox bookmark + NSError *error = nil; + configFilePath = [NSURL URLByResolvingBookmarkData:configFileData options:NSURLBookmarkResolutionWithSecurityScope relativeToURL:nil bookmarkDataIsStale:nil error:&error]; + dataDirPath = [NSURL URLByResolvingBookmarkData:dataDirData options:NSURLBookmarkResolutionWithSecurityScope relativeToURL:nil bookmarkDataIsStale:nil error:&error]; + } + + if (configFilePath == nil || dataDirPath == nil) + { + // use the default location + configFilePath = [[[NSBundle mainBundle] URLForResource:[NSString stringWithFormat:@"%@/celestia.cfg", CELESTIA_RESOURCES_FOLDER] withExtension:nil] retain]; + dataDirPath = [[[NSBundle mainBundle] URLForResource:[NSString stringWithFormat:@"%@", CELESTIA_RESOURCES_FOLDER] withExtension:nil] retain]; + } + + // add the edit configuration menu item + NSMenu *appMenu = [[[[NSApp mainMenu] itemArray] objectAtIndex:0] submenu]; + [appMenu insertItem:[[NSMenuItem alloc] initWithTitle:NSLocalizedString(@"Change Configuration File", "") action:@selector(changeConfigFileLocation) keyEquivalent:@""] atIndex:[[appMenu itemArray] count] - 1]; + int cpuCount = 0; size_t cpuCountSize = sizeof cpuCount; if (0 == sysctlbyname("hw.ncpu", &cpuCount, &cpuCountSize, NULL, 0)) @@ -53,12 +81,13 @@ NSString* fatalErrorMessage; ready = NO; isDirty = YES; isFullScreen = NO; + needsRelaunch = NO; appCore = nil; fatalErrorMessage = nil; lastScript = nil; [self setupResourceDirectory]; - [scriptsController buildScriptMenu]; + [scriptsController buildScriptMenuWithScriptDir:extraDataDirPath.path]; // hide main window until ready [[glView window] setAlphaValue: 0.0f]; // not [[glView window] orderOut: nil]; @@ -94,72 +123,48 @@ NSString* fatalErrorMessage; } } +- (void)setNeedsRelaunch:(BOOL)newValue { + needsRelaunch = newValue; +} + +- (void)changeConfigFileLocation { + if (configSelectionWindowController == nil) { + configSelectionWindowController = [[ConfigSelectionWindowController alloc] initWithWindowNibName:@"ConfigSelectionWindow"]; + configSelectionWindowController->dataDirPath = [dataDirPath retain]; + configSelectionWindowController->configFilePath = [configFilePath retain]; + } + [configSelectionWindowController showWindow:self]; +} - (void) setupResourceDirectory { - NSBundle* mainBundle = [NSBundle mainBundle]; // Change directory to resource dir so Celestia can find cfg files and textures - NSFileManager *fileManager = [NSFileManager defaultManager]; - NSString* path; - NSMutableArray *resourceDirs = [NSMutableArray array]; - BOOL isFolder = NO; + NSFileManager *fileManager = [NSFileManager defaultManager]; + [fileManager changeCurrentDirectoryPath:[dataDirPath path]]; - if ( [ fileManager fileExistsAtPath: path = [[ mainBundle resourcePath ] stringByAppendingPathComponent: CELESTIA_RESOURCES_FOLDER ] isDirectory: &isFolder ] && isFolder ) - { - [resourceDirs addObject: path]; - } - if ( [ fileManager fileExistsAtPath: path = [[[ mainBundle bundlePath ] stringByDeletingLastPathComponent] stringByAppendingPathComponent: CELESTIA_RESOURCES_FOLDER ] isDirectory: &isFolder ] && isFolder ) - { - [resourceDirs addObject: path]; - } - FSRef folder; - CFURLRef url; - static short domains[] = { kUserDomain, kLocalDomain, kNetworkDomain }; - unsigned i; - path = nil; + // extra/script resources are located in application support folder, not sandboxed + NSString *supportPath = [NSSearchPathForDirectoriesInDomains(NSApplicationSupportDirectory, NSUserDomainMask, YES) firstObject]; + NSString *extraDataDir = [supportPath stringByAppendingPathComponent:CELESTIA_RESOURCES_FOLDER]; + NSString *extraDir = [extraDataDir stringByAppendingPathComponent:@"extras"]; + NSString *scriptDir = [extraDataDir stringByAppendingPathComponent:CEL_SCRIPTS_FOLDER]; + BOOL isDirectory; + BOOL exists = [fileManager fileExistsAtPath:extraDataDir isDirectory:&isDirectory]; - for (i = 0; i < (sizeof domains / sizeof(short)); ++i) + if (exists && !isDirectory) // should be a directory but not + return; + + if (!exists) { - if (FSFindFolder(domains[i], kApplicationSupportFolderType, FALSE, &folder) == noErr) + // create directory and subdirectories + if ([fileManager createDirectoryAtPath:extraDataDir withIntermediateDirectories:YES attributes:nil error:nil]) { - url = CFURLCreateFromFSRef(nil, &folder); - path = [(NSURL *)url path]; - CFRelease(url); - - if (path) - { - if (![fileManager fileExistsAtPath: path = [path stringByAppendingPathComponent: CELESTIA_RESOURCES_FOLDER]] && - kUserDomain==domains[i]) - { - if ([fileManager createDirectoryAtPath:path attributes:nil]) - { - [fileManager createDirectoryAtPath:[path stringByAppendingPathComponent:@"extras"] attributes:nil]; - [fileManager createDirectoryAtPath:[path stringByAppendingPathComponent:CEL_SCRIPTS_FOLDER] attributes:nil]; - } - } - if ([fileManager fileExistsAtPath:path isDirectory:&isFolder] && isFolder) - { - [resourceDirs addObject: path]; - } - } - - path = nil; + [fileManager createDirectoryAtPath:extraDir withIntermediateDirectories:YES attributes:nil error:nil]; + [fileManager createDirectoryAtPath:scriptDir withIntermediateDirectories:YES attributes:nil error:nil]; } } - if ([resourceDirs count] > 0) - { - [fileManager changeCurrentDirectoryPath: [resourceDirs objectAtIndex: 0]]; - [resourceDirs removeObjectAtIndex: 0]; - if ([resourceDirs count] > 0) { - NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults]; - [prefs registerDefaults:[NSDictionary dictionaryWithObject:[NSArray arrayWithObject:[resourceDirs objectAtIndex:0]] forKey:@"existingResourceDirs"]]; - } - } - else - { - [self fatalError: NSLocalizedString(@"It appears that the \"CelestiaResources\" directory has not been properly installed in the correct location as indicated in the installation instructions. \n\nPlease correct this and try again.",@"")]; - [self fatalError: nil]; + if ([fileManager fileExistsAtPath:extraDataDir isDirectory:&isDirectory] && isDirectory) { + extraDataDirPath = [NSURL fileURLWithPath:extraDataDir]; } } @@ -171,7 +176,7 @@ NSString* fatalErrorMessage; #ifdef DEBUG NSDate *t = [NSDate date]; #endif - if (![appCore initSimulation]) + if (![appCore initSimulationWithConfigPath:configFilePath.path extraPath:extraDataDirPath.path]) { [startupCondition lock]; [startupCondition unlockWithCondition: 99]; @@ -464,14 +469,17 @@ NSString* fatalErrorMessage; -(BOOL)applicationShouldTerminate:(id)sender { - if ( NSRunAlertPanel(NSLocalizedString(@"Quit Celestia?",@""), - NSLocalizedString(@"Are you sure you want to quit Celestia?",@""), - NSLocalizedString(@"Quit",@""), - NSLocalizedString(@"Cancel",@""), - nil) != NSAlertDefaultReturn ) - { - return NO; - } + if (needsRelaunch) + return YES; + + if ( NSRunAlertPanel(NSLocalizedString(@"Quit Celestia?",@""), + NSLocalizedString(@"Are you sure you want to quit Celestia?",@""), + NSLocalizedString(@"Quit",@""), + NSLocalizedString(@"Cancel",@""), + nil) != NSAlertDefaultReturn ) + { + return NO; + } if (timer != nil) { [timer invalidate]; @@ -495,6 +503,11 @@ NSString* fatalErrorMessage; [appCore release]; appCore = nil; } + + if (needsRelaunch) + { + [[NSWorkspace sharedWorkspace] launchAppWithBundleIdentifier:[[NSBundle mainBundle] bundleIdentifier] options:NSWorkspaceLaunchAsync additionalEventParamDescriptor:nil launchIdentifier:nil]; + } } diff --git a/macosx/ConfigSelectionWindow.xib b/macosx/ConfigSelectionWindow.xib new file mode 100644 index 000000000..ff80f29a0 --- /dev/null +++ b/macosx/ConfigSelectionWindow.xib @@ -0,0 +1,102 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + cfg + + + + + + + + + + + + + + + + + + + + + + + + + + + + + public.folder + + + + + + + + + + + diff --git a/macosx/ConfigSelectionWindowController.h b/macosx/ConfigSelectionWindowController.h new file mode 100644 index 000000000..ecb4b19d6 --- /dev/null +++ b/macosx/ConfigSelectionWindowController.h @@ -0,0 +1,22 @@ +// +// ConfigSelectionWindowController.h +// Celestia +// +// Created by 李林峰 on 2019/9/8. +// + +#import + +extern NSString *const configFilePathPrefKey; +extern NSString *const dataDirPathPrefKey; + +@interface ConfigSelectionWindowController : NSWindowController { +@public + NSURL *configFilePath; + NSURL *dataDirPath; +@private + IBOutlet NSPathControl *configFilePathControl; + IBOutlet NSPathControl *dataDirPathControl; +} + +@end diff --git a/macosx/ConfigSelectionWindowController.m b/macosx/ConfigSelectionWindowController.m new file mode 100644 index 000000000..0105aec25 --- /dev/null +++ b/macosx/ConfigSelectionWindowController.m @@ -0,0 +1,49 @@ +// +// ConfigSelectionWindowController.m +// Celestia +// +// Created by 李林峰 on 2019/9/8. +// + +#import "ConfigSelectionWindowController.h" +#import "CelestiaController.h" + +NSString *const configFilePathPrefKey = @"configFilePath"; +NSString *const dataDirPathPrefKey = @"dataDirPath"; + +@implementation ConfigSelectionWindowController + +- (void)awakeFromNib { + [super awakeFromNib]; + + [configFilePathControl setURL:configFilePath]; + [dataDirPathControl setURL:dataDirPath]; +} + +- (void)dealloc { + [configFilePath release]; + [dataDirPath release]; + [super dealloc]; +} + +- (IBAction)confirmSelection:(id)sender { + // save the selection, since we are running in a sandboxed environment, save bookmark + NSError *error = nil; + NSData *configFilePathData = [[configFilePathControl URL] bookmarkDataWithOptions:NSURLBookmarkCreationSecurityScopeAllowOnlyReadAccess includingResourceValuesForKeys:nil relativeToURL:nil error:&error]; + NSData *dataDirPathData = [[dataDirPathControl URL] bookmarkDataWithOptions:NSURLBookmarkCreationSecurityScopeAllowOnlyReadAccess includingResourceValuesForKeys:nil relativeToURL:nil error:&error]; + if (error != nil) { + // failed + [[NSAlert alertWithError:error] runModal]; + return; + } + + NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults]; + + [prefs setValue:configFilePathData forKey:configFilePathPrefKey]; + [prefs setValue:dataDirPathData forKey:dataDirPathPrefKey]; + [prefs synchronize]; + [[CelestiaController shared] setNeedsRelaunch:YES]; + [NSApp terminate:nil]; +} + +@end diff --git a/macosx/ScriptsController.h b/macosx/ScriptsController.h index 7a7b71135..630693285 100644 --- a/macosx/ScriptsController.h +++ b/macosx/ScriptsController.h @@ -14,5 +14,5 @@ { IBOutlet NSMenu *scriptMenu; } -- (void)buildScriptMenu; +- (void)buildScriptMenuWithScriptDir:(NSString *)scriptDir; @end diff --git a/macosx/ScriptsController.mm b/macosx/ScriptsController.mm index 270f24b4f..7829fbb0c 100644 --- a/macosx/ScriptsController.mm +++ b/macosx/ScriptsController.mm @@ -82,39 +82,29 @@ return [itemDict count] > 0 ? itemDict : nil; } -- (void)buildScriptMenu +- (void)buildScriptMenuWithScriptDir:(NSString *)scriptDir { NSDictionary *itemDict = nil; - NSArray *existingResourceDirsSetting = nil; - NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults]; BOOL addSeparator = NO; int count = [scriptMenu numberOfItems]; while (count-- > 0) [scriptMenu removeItemAtIndex: 0]; - if (itemDict = [ScriptsController scriptsForFolderRoot: @""]) + if ((itemDict = [ScriptsController scriptsForFolderRoot:@""]) != nil) { [self addItems:itemDict toMenu:scriptMenu]; addSeparator = YES; } - if ((existingResourceDirsSetting = [prefs stringArrayForKey:@"existingResourceDirs"])) + if ((itemDict = [ScriptsController scriptsForFolderRoot:scriptDir]) != nil) { - NSEnumerator *iter = [existingResourceDirsSetting objectEnumerator]; - NSString *dir = nil; - while ((dir = [iter nextObject])) + if (addSeparator) { - if (itemDict = [ScriptsController scriptsForFolderRoot: dir]) - { - if (addSeparator) - { - [scriptMenu addItem: [NSMenuItem separatorItem]]; - addSeparator = NO; - } - [self addItems:[NSDictionary dictionaryWithObject:itemDict forKey:[dir stringByAbbreviatingWithTildeInPath]] toMenu:scriptMenu]; - } + [scriptMenu addItem: [NSMenuItem separatorItem]]; + addSeparator = NO; } + [self addItems:[NSDictionary dictionaryWithObject:itemDict forKey:[scriptDir stringByAbbreviatingWithTildeInPath]] toMenu:scriptMenu]; } } diff --git a/macosx/celestia.xcodeproj/project.pbxproj b/macosx/celestia.xcodeproj/project.pbxproj index d91d60deb..61b416925 100644 --- a/macosx/celestia.xcodeproj/project.pbxproj +++ b/macosx/celestia.xcodeproj/project.pbxproj @@ -45,6 +45,8 @@ 88654A260DB29585007C8027 /* celx_rotation.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 88654A130DB29585007C8027 /* celx_rotation.cpp */; }; 88654A280DB29585007C8027 /* celx_vector.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 88654A150DB29585007C8027 /* celx_vector.cpp */; }; 9708E6A92312A8BB0015C9F4 /* libjpeg.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 9708E6A72312A8B00015C9F4 /* libjpeg.a */; }; + 978EBA922324D0740025C9D5 /* ConfigSelectionWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = 978EBA912324D0740025C9D5 /* ConfigSelectionWindow.xib */; }; + 9798FB522324D2BE007F92B8 /* ConfigSelectionWindowController.m in Sources */ = {isa = PBXBuildFile; fileRef = 9798FB502324D2BE007F92B8 /* ConfigSelectionWindowController.m */; }; 97E4018123101501002013C7 /* cspice.a in Frameworks */ = {isa = PBXBuildFile; fileRef = CE4EEA6D0F50144A003341A2 /* cspice.a */; }; 97E4018323101501002013C7 /* libpng.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 97E4018223101501002013C7 /* libpng.a */; }; 97E401852310150F002013C7 /* libz.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 97E401842310150F002013C7 /* libz.tbd */; }; @@ -536,6 +538,9 @@ 9708E6A22312A8310015C9F4 /* jconfig.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = jconfig.h; path = include/jconfig.h; sourceTree = ""; }; 9708E6A72312A8B00015C9F4 /* libjpeg.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libjpeg.a; path = lib/libjpeg.a; sourceTree = ""; }; 9726813A231D0D930014C8D7 /* Celestia.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = Celestia.entitlements; sourceTree = ""; }; + 978EBA912324D0740025C9D5 /* ConfigSelectionWindow.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = ConfigSelectionWindow.xib; sourceTree = ""; }; + 9798FB4F2324D2BE007F92B8 /* ConfigSelectionWindowController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ConfigSelectionWindowController.h; sourceTree = ""; }; + 9798FB502324D2BE007F92B8 /* ConfigSelectionWindowController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ConfigSelectionWindowController.m; sourceTree = ""; }; 97E4018223101501002013C7 /* libpng.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libpng.a; path = lib/libpng.a; sourceTree = ""; }; 97E401842310150F002013C7 /* libz.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libz.tbd; path = usr/lib/libz.tbd; sourceTree = SDKROOT; }; 97E40188231015AD002013C7 /* liblua5.1.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = liblua5.1.a; path = lib/liblua5.1.a; sourceTree = ""; }; @@ -1089,6 +1094,7 @@ E5E365AB095C11B500B14224 /* SplashScreen.m */, E5D956DF096651DF00CB02B2 /* SplashWindowController.m */, E5E2BDD50C24F7E6000D6E83 /* TextWindowController.m */, + 9798FB502324D2BE007F92B8 /* ConfigSelectionWindowController.m */, F5040B0E02A484DA014901DC /* CelestiaController.h */, F5231C7202C2997601000006 /* CelestiaFavorites.h */, F5274ED202AE88260100020A /* CelestiaOpenGLView.h */, @@ -1106,6 +1112,7 @@ E5E365AA095C11B500B14224 /* SplashScreen.h */, E5D956DE096651DF00CB02B2 /* SplashWindowController.h */, E5E2BDD40C24F7E6000D6E83 /* TextWindowController.h */, + 9798FB4F2324D2BE007F92B8 /* ConfigSelectionWindowController.h */, F578B79D02B3E2AD0100020A /* Cocoa Extensions */, F55A246702B2D4FF0100020A /* Wrappers */, E5CC203109AA832000CFFF2C /* POConverter */, @@ -1191,6 +1198,7 @@ E50CCA530C065F0100E9C76A /* EclipseFinder.nib */, E5D7660E0982B1860099DBBD /* HelpWindow.nib */, E5E2BDD00C24F7B6000D6E83 /* TextWindow.nib */, + 978EBA912324D0740025C9D5 /* ConfigSelectionWindow.xib */, 089C165CFE840E0CC02AAC07 /* InfoPlist.strings */, E5CC204509AA843300CFFF2C /* Localizable.strings */, ); @@ -1920,6 +1928,7 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( + 978EBA922324D0740025C9D5 /* ConfigSelectionWindow.xib in Resources */, E56430BB07769C9000E2C4A3 /* MainMenu.nib in Resources */, E56430BC07769C9000E2C4A3 /* InfoPlist.strings in Resources */, E5B615070777307F001BB2BF /* celestia.icns in Resources */, @@ -2131,6 +2140,7 @@ E532F4F50933331800D7D5B3 /* dsooctree.cpp in Sources */, E532F4F80933331800D7D5B3 /* staroctree.cpp in Sources */, E5E365AD095C11B500B14224 /* SplashScreen.m in Sources */, + 9798FB522324D2BE007F92B8 /* ConfigSelectionWindowController.m in Sources */, E5D956E00966520700CB02B2 /* SplashWindowController.m in Sources */, E56B96570AAB22AA0097DDFE /* renderglsl.cpp in Sources */, E56457520AF8FD6A00F2D9FA /* samporient.cpp in Sources */,