]> granicus.if.org Git - python/commitdiff
Mods by Donovan Preston (with changes by me to make them "go with the flow")
authorJack Jansen <jack.jansen@cwi.nl>
Tue, 11 Sep 2001 13:08:10 +0000 (13:08 +0000)
committerJack Jansen <jack.jansen@cwi.nl>
Tue, 11 Sep 2001 13:08:10 +0000 (13:08 +0000)
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.

Mac/Python/macmain.c

index a14e3a893b833cd94ed244b39220ad3f0d030741..0498be4e6d7ef208be43a03d4afda42a1f90d2fa 100644 (file)
@@ -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");