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 */,