diff options
author | Jack Jansen <jack.jansen@cwi.nl> | 2001-09-11 13:08:10 (GMT) |
---|---|---|
committer | Jack Jansen <jack.jansen@cwi.nl> | 2001-09-11 13:08:10 (GMT) |
commit | 998a40a6d40a4ee5272f8683fbc3e9c801867fca (patch) | |
tree | 836f90d6039d1dd324e0f1442a650c1c57b11e01 /Mac | |
parent | 0b60772ee9c32f9baa0d739aa603743ca9c511f6 (diff) | |
download | cpython-998a40a6d40a4ee5272f8683fbc3e9c801867fca.zip cpython-998a40a6d40a4ee5272f8683fbc3e9c801867fca.tar.gz cpython-998a40a6d40a4ee5272f8683fbc3e9c801867fca.tar.bz2 |
Mods by Donovan Preston (with changes by me to make them "go with the flow")
that will detect an __main__.py or __rawmain__.py in the application bundle.
This file is then exectued as the main script. We now have applets in
MachO Python!!!
The difference between __main__ and __rawmain__ is that the former gets a
complete simulated argv (so you can drop files on the applet and the script
sees them in sys.argv) while the latter skips the argv simulation and the
<option>key dialog. This keeps the AppleEvent that started the app intact,
as well as the funny "-psn_xxxx" argv[1] argument, so the script can do
with these what it wants.
Diffstat (limited to 'Mac')
-rw-r--r-- | Mac/Python/macmain.c | 104 |
1 files changed, 90 insertions, 14 deletions
diff --git a/Mac/Python/macmain.c b/Mac/Python/macmain.c index a14e3a8..0498be4 100644 --- a/Mac/Python/macmain.c +++ b/Mac/Python/macmain.c @@ -81,7 +81,7 @@ int console_output_state = STATE_UNKNOWN; PyMac_PrefRecord PyMac_options; -static void Py_Main(int, char **); /* Forward */ +static void Py_Main(int, char **, char *); /* Forward */ void PyMac_Exit(int); /* Forward */ static void init_appearance(void) @@ -488,17 +488,87 @@ PyMac_Initialize(void) #endif /* USE_MAC_APPLET_SUPPORT */ #if TARGET_API_MAC_OSX + +static int +locateResourcePy(char * resourceName, char * resourceURLCStr, int length) { + CFBundleRef mainBundle = NULL; + CFURLRef URL, absoluteURL; + CFStringRef filenameString, filepathString, rsrcString; + CFIndex size, i; + CFArrayRef arrayRef; + Boolean success = 0; + + /* Create a CFString with the resource name in it */ + rsrcString = CFStringCreateWithCString(0, resourceName, kCFStringEncodingMacRoman); + + /* Get a reference to our main bundle */ + mainBundle = CFBundleGetMainBundle(); + + /* Look for py files in the main bundle by type */ + arrayRef = CFBundleCopyResourceURLsOfType( mainBundle, + CFSTR("py"), + NULL ); + + /* See if there are any filename matches */ + size = CFArrayGetCount(arrayRef); + for (i = 0; i < size; i++) { + URL = CFArrayGetValueAtIndex(arrayRef, i); + filenameString = CFURLCopyLastPathComponent(URL); + if (CFStringCompare(filenameString, rsrcString, 0) == kCFCompareEqualTo) { + /* We found a match, get the file's full path */ + absoluteURL = CFURLCopyAbsoluteURL(URL); + filepathString = CFURLCopyFileSystemPath(absoluteURL, kCFURLPOSIXPathStyle); + CFRelease(absoluteURL); + + /* Copy the full path into the caller's character buffer */ + success = CFStringGetCString(filepathString, resourceURLCStr, length, + kCFStringEncodingMacRoman); + + CFRelease(filepathString); + } + CFRelease(filenameString); + } + CFRelease(rsrcString); + CFRelease(arrayRef); + + return success; +} + int main(int argc, char **argv) { - int i; - printf("first argc=%d\n", argc); - for(i=0; i<argc; i++) printf("first argv[%d] = \"%s\"\n", i, argv[i]); - init_common(&argc, &argv, 0); - printf("second argc=%d\n", argc); - for(i=0; i<argc; i++) printf("second argv[%d] = \"%s\"\n", i, argv[i]); - Py_Main(argc, argv); - return 0; + int i; + static char scriptpath[1024]; + char *script = NULL; + + /* First we see whether we have __rawmain__.py and run that if it + ** is there + */ + if (locateResourcePy("__rawmain__.py", scriptpath, 1024)) { + /* If we have a raw main we don't do AppleEvent processing. + ** Notice that this also means we keep the -psn.... argv[1] + ** value intact. Not sure whether that is important to someone, + ** but you never know... + */ + script = scriptpath; + } else { + /* Otherwise we look for __main__.py. Whether that is + ** found or not we also process AppleEvent arguments. + */ + if (locateResourcePy("__main__.py", scriptpath, 1024)) + script = scriptpath; + + printf("original argc=%d\n", argc); + for(i=0; i<argc; i++) printf("original argv[%d] = \"%s\"\n", i, argv[i]); + + init_common(&argc, &argv, 0); + + printf("modified argc=%d\n", argc); + for(i=0; i<argc; i++) printf("modified argv[%d] = \"%s\"\n", i, argv[i]); + } + + Py_Main(argc, argv, script); + return 0; } #else @@ -533,21 +603,27 @@ PyMac_InitApplication(void) exit(0); } } - Py_Main(argc, argv); + Py_Main(argc, argv, NULL); } #endif /* TARGET_API_MAC_OSX */ /* Main program */ static void -Py_Main(int argc, char **argv) +Py_Main(int argc, char **argv, char *filename) { int sts; char *command = NULL; - char *filename = NULL; FILE *fp = stdin; - filename = argv[1]; + if ( filename ) { + /* Someone else has found our "script" already */ + argv[0] = filename; + } else { + filename = argv[1]; + argv++; + argc--; + } if (Py_VerboseFlag || (command == NULL && filename == NULL && isatty((int)fileno(fp)))) @@ -573,7 +649,7 @@ Py_Main(int argc, char **argv) PyMac_InstallNavServicesForSF(); - PySys_SetArgv(argc-1, argv+1); + PySys_SetArgv(argc, argv); if (filename == NULL && isatty((int)fileno(fp))) { FILE *fp = fopen(STARTUP, "r"); |