mirror of https://github.com/stella-emu/stella.git
Don't try to detect launch from finder.
This commit is contained in:
parent
89709b925e
commit
712cfbaeb1
|
@ -11,12 +11,12 @@ extern int stellaMain(int argc, char* argv[]);
|
||||||
|
|
||||||
static int gArgc;
|
static int gArgc;
|
||||||
static char** gArgv;
|
static char** gArgv;
|
||||||
static BOOL gFinderLaunch;
|
|
||||||
static BOOL gCalledAppMainline = FALSE;
|
|
||||||
|
|
||||||
|
|
||||||
// The main class of the application, the application's delegate
|
// The main class of the application, the application's delegate
|
||||||
@implementation SDLMain
|
@implementation SDLMain {
|
||||||
|
BOOL calledMainline;
|
||||||
|
NSString* openFilename;
|
||||||
|
}
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
static SDLMain* sharedInstance = nil;
|
static SDLMain* sharedInstance = nil;
|
||||||
|
@ -28,20 +28,18 @@ static SDLMain* sharedInstance = nil;
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
// Set the working directory to the .app's parent directory
|
// Set the working directory to the .app's parent directory
|
||||||
- (void) setupWorkingDirectory:(BOOL)shouldChdir
|
- (void) setupWorkingDirectory
|
||||||
{
|
{
|
||||||
if (shouldChdir)
|
char parentdir[MAXPATHLEN];
|
||||||
|
|
||||||
|
CFURLRef url = CFBundleCopyBundleURL(CFBundleGetMainBundle());
|
||||||
|
CFURLRef url2 = CFURLCreateCopyDeletingLastPathComponent(0, url);
|
||||||
|
if (CFURLGetFileSystemRepresentation(url2, 1, (UInt8*)parentdir, MAXPATHLEN))
|
||||||
{
|
{
|
||||||
char parentdir[MAXPATHLEN];
|
chdir(parentdir); /* chdir to the binary app's parent */
|
||||||
CFURLRef url = CFBundleCopyBundleURL(CFBundleGetMainBundle());
|
|
||||||
CFURLRef url2 = CFURLCreateCopyDeletingLastPathComponent(0, url);
|
|
||||||
if (CFURLGetFileSystemRepresentation(url2, 1, (UInt8*)parentdir, MAXPATHLEN))
|
|
||||||
{
|
|
||||||
chdir(parentdir); /* chdir to the binary app's parent */
|
|
||||||
}
|
|
||||||
CFRelease(url);
|
|
||||||
CFRelease(url2);
|
|
||||||
}
|
}
|
||||||
|
CFRelease(url);
|
||||||
|
CFRelease(url2);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -63,33 +61,10 @@ static SDLMain* sharedInstance = nil;
|
||||||
*/
|
*/
|
||||||
- (BOOL)application:(NSApplication*)theApplication openFile:(NSString*)filename
|
- (BOOL)application:(NSApplication*)theApplication openFile:(NSString*)filename
|
||||||
{
|
{
|
||||||
const char* temparg;
|
if (calledMainline) return FALSE;
|
||||||
size_t arglen;
|
|
||||||
char* arg;
|
|
||||||
char** newargv;
|
|
||||||
|
|
||||||
if (!gFinderLaunch) // MacOS is passing command line args.
|
openFilename = filename;
|
||||||
return FALSE;
|
|
||||||
if (gCalledAppMainline) // app has started, ignore this document.
|
|
||||||
return FALSE;
|
|
||||||
|
|
||||||
temparg = [filename UTF8String];
|
|
||||||
arglen = SDL_strlen(temparg) + 1;
|
|
||||||
arg = (char*) SDL_malloc(arglen);
|
|
||||||
if (arg == NULL)
|
|
||||||
return FALSE;
|
|
||||||
|
|
||||||
newargv = (char **) realloc(gArgv, sizeof (char*) * (gArgc + 2));
|
|
||||||
if (newargv == NULL)
|
|
||||||
{
|
|
||||||
SDL_free(arg);
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
gArgv = newargv;
|
|
||||||
|
|
||||||
SDL_strlcpy(arg, temparg, arglen);
|
|
||||||
gArgv[gArgc++] = arg;
|
|
||||||
gArgv[gArgc] = NULL;
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -101,11 +76,26 @@ static SDLMain* sharedInstance = nil;
|
||||||
int status;
|
int status;
|
||||||
|
|
||||||
// Set the working directory to the .app's parent directory
|
// Set the working directory to the .app's parent directory
|
||||||
[self setupWorkingDirectory:gFinderLaunch];
|
[self setupWorkingDirectory];
|
||||||
|
|
||||||
// Hand off to main application code
|
calledMainline = TRUE;
|
||||||
gCalledAppMainline = TRUE;
|
|
||||||
status = SDL_main (gArgc, gArgv);
|
if (openFilename) {
|
||||||
|
int _argc = 2;
|
||||||
|
char** _argv = SDL_malloc(sizeof(char*) * 2);
|
||||||
|
|
||||||
|
_argv[0] = gArgv[0];
|
||||||
|
|
||||||
|
char* filename = SDL_malloc(strlen([openFilename UTF8String]) + 1);
|
||||||
|
strcpy(filename, [openFilename UTF8String]);
|
||||||
|
_argv[1] = filename;
|
||||||
|
|
||||||
|
status = SDL_main(_argc, _argv);
|
||||||
|
|
||||||
|
SDL_free(filename);
|
||||||
|
SDL_free(_argv);
|
||||||
|
} else
|
||||||
|
status = SDL_main(gArgc, gArgv);
|
||||||
|
|
||||||
// We're done, thank you for playing
|
// We're done, thank you for playing
|
||||||
exit(status);
|
exit(status);
|
||||||
|
@ -113,43 +103,6 @@ static SDLMain* sharedInstance = nil;
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|
||||||
static int IsRootCwd()
|
|
||||||
{
|
|
||||||
char buf[MAXPATHLEN];
|
|
||||||
char *cwd = getcwd(buf, sizeof (buf));
|
|
||||||
return (cwd && (strcmp(cwd, "/") == 0));
|
|
||||||
}
|
|
||||||
|
|
||||||
static int IsTenPointNineOrLater()
|
|
||||||
{
|
|
||||||
/* -instancesRespondToSelector is available in 10.9, but it says that it's
|
|
||||||
available in 10.10. Either way, if it's there, we're on 10.9 or higher:
|
|
||||||
just return true so we don't clobber the user's console with this. */
|
|
||||||
if ([NSProcessInfo instancesRespondToSelector:@selector(operatingSystemVersion)]) {
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
/* Gestalt() is deprecated in 10.8, but I don't care. Stop using SDL 1.2. */
|
|
||||||
SInt32 major, minor;
|
|
||||||
Gestalt(gestaltSystemVersionMajor, &major);
|
|
||||||
Gestalt(gestaltSystemVersionMinor, &minor);
|
|
||||||
return ( ((major << 16) | minor) >= ((10 << 16) | 9) );
|
|
||||||
}
|
|
||||||
|
|
||||||
static int IsFinderLaunch(const int argc, char **argv)
|
|
||||||
{
|
|
||||||
const int bIsNewerOS = IsTenPointNineOrLater();
|
|
||||||
/* -psn_XXX is passed if we are launched from Finder in 10.8 and earlier */
|
|
||||||
if ( (!bIsNewerOS) && (argc >= 2) && (strncmp(argv[1], "-psn", 4) == 0) ) {
|
|
||||||
return 1;
|
|
||||||
} else if ((bIsNewerOS) && (argc == 1) && IsRootCwd()) {
|
|
||||||
/* we might still be launched from the Finder; on 10.9+, you might not
|
|
||||||
get the -psn command line anymore. Check version, if there's no
|
|
||||||
command line, and if our current working directory is "/". */
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
return 0; /* not a Finder launch. */
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef main
|
#ifdef main
|
||||||
# undef main
|
# undef main
|
||||||
#endif
|
#endif
|
||||||
|
@ -157,24 +110,8 @@ static int IsFinderLaunch(const int argc, char **argv)
|
||||||
// Main entry point to executable - should *not* be SDL_main!
|
// Main entry point to executable - should *not* be SDL_main!
|
||||||
int main (int argc, char* argv[])
|
int main (int argc, char* argv[])
|
||||||
{
|
{
|
||||||
// Copy the arguments into a global variable
|
gArgc = argc;
|
||||||
// This is passed if we are launched by double-clicking
|
gArgv = argv;
|
||||||
if (IsFinderLaunch(argc, argv))
|
|
||||||
{
|
|
||||||
gArgv = (char**) SDL_malloc(sizeof(char*) * 2);
|
|
||||||
gArgv[0] = argv[0];
|
|
||||||
gArgv[1] = NULL;
|
|
||||||
gArgc = 1;
|
|
||||||
gFinderLaunch = YES;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
gArgc = argc;
|
|
||||||
gArgv = (char**) SDL_malloc(sizeof(char*) * (argc+1));
|
|
||||||
for (int i = 0; i <= argc; i++)
|
|
||||||
gArgv[i] = argv[i];
|
|
||||||
gFinderLaunch = NO;
|
|
||||||
}
|
|
||||||
|
|
||||||
NSApplicationMain (argc, (const char**)argv);
|
NSApplicationMain (argc, (const char**)argv);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue