Commit 998a40a6 authored by Jack Jansen's avatar Jack Jansen

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.
parent 0b60772e
...@@ -81,7 +81,7 @@ int console_output_state = STATE_UNKNOWN; ...@@ -81,7 +81,7 @@ int console_output_state = STATE_UNKNOWN;
PyMac_PrefRecord PyMac_options; PyMac_PrefRecord PyMac_options;
static void Py_Main(int, char **); /* Forward */ static void Py_Main(int, char **, char *); /* Forward */
void PyMac_Exit(int); /* Forward */ void PyMac_Exit(int); /* Forward */
static void init_appearance(void) static void init_appearance(void)
...@@ -488,17 +488,87 @@ PyMac_Initialize(void) ...@@ -488,17 +488,87 @@ PyMac_Initialize(void)
#endif /* USE_MAC_APPLET_SUPPORT */ #endif /* USE_MAC_APPLET_SUPPORT */
#if TARGET_API_MAC_OSX #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 int
main(int argc, char **argv) main(int argc, char **argv)
{ {
int i; int i;
printf("first argc=%d\n", argc); static char scriptpath[1024];
for(i=0; i<argc; i++) printf("first argv[%d] = \"%s\"\n", i, argv[i]); char *script = NULL;
init_common(&argc, &argv, 0);
printf("second argc=%d\n", argc); /* First we see whether we have __rawmain__.py and run that if it
for(i=0; i<argc; i++) printf("second argv[%d] = \"%s\"\n", i, argv[i]); ** is there
Py_Main(argc, argv); */
return 0; 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 #else
...@@ -533,21 +603,27 @@ PyMac_InitApplication(void) ...@@ -533,21 +603,27 @@ PyMac_InitApplication(void)
exit(0); exit(0);
} }
} }
Py_Main(argc, argv); Py_Main(argc, argv, NULL);
} }
#endif /* TARGET_API_MAC_OSX */ #endif /* TARGET_API_MAC_OSX */
/* Main program */ /* Main program */
static void static void
Py_Main(int argc, char **argv) Py_Main(int argc, char **argv, char *filename)
{ {
int sts; int sts;
char *command = NULL; char *command = NULL;
char *filename = NULL;
FILE *fp = stdin; 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 || if (Py_VerboseFlag ||
(command == NULL && filename == NULL && isatty((int)fileno(fp)))) (command == NULL && filename == NULL && isatty((int)fileno(fp))))
...@@ -573,7 +649,7 @@ Py_Main(int argc, char **argv) ...@@ -573,7 +649,7 @@ Py_Main(int argc, char **argv)
PyMac_InstallNavServicesForSF(); PyMac_InstallNavServicesForSF();
PySys_SetArgv(argc-1, argv+1); PySys_SetArgv(argc, argv);
if (filename == NULL && isatty((int)fileno(fp))) { if (filename == NULL && isatty((int)fileno(fp))) {
FILE *fp = fopen(STARTUP, "r"); FILE *fp = fopen(STARTUP, "r");
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment