]> granicus.if.org Git - python/commitdiff
Backport of revision 62648
authorRonald Oussoren <ronaldoussoren@mac.com>
Fri, 2 May 2008 21:46:55 +0000 (21:46 +0000)
committerRonald Oussoren <ronaldoussoren@mac.com>
Fri, 2 May 2008 21:46:55 +0000 (21:46 +0000)
Lib/plat-mac/Carbon/AppleEvents.py
Lib/plat-mac/terminalcommand.py
Mac/PythonLauncher/doscript.m

index e23c0797a5ddfbbd2bc1500433aeaa63ae3df61e..a4d7dcf903ca2b1fdea58262a678675c735f56c3 100644 (file)
@@ -1,6 +1,7 @@
 # Generated from 'AEDataModel.h'
 
 def FOUR_CHAR_CODE(x): return x
+typeApplicationBundleID = FOUR_CHAR_CODE('bund')
 typeBoolean = FOUR_CHAR_CODE('bool')
 typeChar = FOUR_CHAR_CODE('TEXT')
 typeSInt16 = FOUR_CHAR_CODE('shor')
index 292f09c7d80a633fc975eb16a0b4dd29d7cecf39..480797b42aeaeab7168c5fd948bd5637edc39436 100644 (file)
@@ -27,7 +27,7 @@ SEND_MODE = kAENoReply  # kAEWaitReply hangs when run from Terminal.app itself
 
 def run(command):
     """Run a shell command in a new Terminal.app window."""
-    termAddress = AE.AECreateDesc(typeApplSignature, TERMINAL_SIG)
+    termAddress = AE.AECreateDesc(typeApplicationBundleID, "com.apple.Terminal")
     theEvent = AE.AECreateAppleEvent(kAECoreSuite, kAEDoScript, termAddress,
                                      kAutoGenerateReturnID, kAnyTransactionID)
     commandDesc = AE.AECreateDesc(typeChar, command)
index 3e4e22393c04906f8983ec2878dea71d2d4cd0f0..024b883f1903b0d0b1e0d9289520b710c06c4a1f 100644 (file)
 #import <ApplicationServices/ApplicationServices.h>
 #import "doscript.h"
 
-/* I assume I could pick these up from somewhere, but where... */
-#define CREATOR 'trmx'
-
-#define ACTIVATE_CMD 'misc'
-#define ACTIVATE_SUITE 'actv'
-
-#define DOSCRIPT_CMD 'dosc'
-#define DOSCRIPT_SUITE 'core'
-#define WITHCOMMAND 'cmnd'
-
-/* ... and there's probably also a better way to do this... */
-#define START_TERMINAL "/Applications/Utilities/Terminal.app/Contents/MacOS/Terminal &"
-
 extern int 
 doscript(const char *command)
 {
-    OSErr err;
-    AppleEvent theAEvent, theReply;
-    AEAddressDesc terminalAddress;
-    AEDesc commandDesc;
-    OSType terminalCreator = CREATOR;
-    
-    /* set up locals  */
-    AECreateDesc(typeNull, NULL, 0, &theAEvent);
-    AECreateDesc(typeNull, NULL, 0, &terminalAddress);
-    AECreateDesc(typeNull, NULL, 0, &theReply);
-    AECreateDesc(typeNull, NULL, 0, &commandDesc);
-    
-    /* create the "activate" event for Terminal */
-    err = AECreateDesc(typeApplSignature, (Ptr) &terminalCreator,
-            sizeof(terminalCreator), &terminalAddress);
-    if (err != noErr) {
-        NSLog(@"doscript: AECreateDesc: error %d\n", err);
-        goto bail;
-    }
-    err = AECreateAppleEvent(ACTIVATE_SUITE, ACTIVATE_CMD,
-            &terminalAddress, kAutoGenerateReturnID,
-            kAnyTransactionID, &theAEvent);
-    
-    if (err != noErr) {
-        NSLog(@"doscript: AECreateAppleEvent(activate): error %d\n", err);
-        goto bail;
-    }
-    /* send the event  */
-    err = AESend(&theAEvent, &theReply, kAEWaitReply,
-            kAENormalPriority, kAEDefaultTimeout, NULL, NULL);
-    if ( err == -600 ) {
-        int count=10;
-        /* If it failed with "no such process" try to start Terminal */
-        err = system(START_TERMINAL);
-        if ( err ) {
-            NSLog(@"doscript: system(): %s\n", strerror(errno));
-            goto bail;
-        }
-        do {
-            sleep(1);
-            /* send the event again */
-            err = AESend(&theAEvent, &theReply, kAEWaitReply,
-                    kAENormalPriority, kAEDefaultTimeout, NULL, NULL);
-        } while (err == -600 && --count > 0);
-        if ( err == -600 )
-            NSLog(@"doscript: Could not activate Terminal\n");
-    }
-    if (err != noErr) {
-        NSLog(@"doscript: AESend(activate): error %d\n", err);
-        goto bail;
-    }
-            
-    /* create the "doscript with command" event for Terminal */
-    err = AECreateAppleEvent(DOSCRIPT_SUITE, DOSCRIPT_CMD,
-            &terminalAddress, kAutoGenerateReturnID,
-            kAnyTransactionID, &theAEvent);
-    if (err != noErr) {
-        NSLog(@"doscript: AECreateAppleEvent(doscript): error %d\n", err);
-        goto bail;
-    }
-    
-    /* add the command to the apple event */
-    err = AECreateDesc(typeChar, command, strlen(command), &commandDesc);
-    if (err != noErr) {
-        NSLog(@"doscript: AECreateDesc(command): error %d\n", err);
-        goto bail;
-    }
-    err = AEPutParamDesc(&theAEvent, WITHCOMMAND, &commandDesc);
-    if (err != noErr) {
-        NSLog(@"doscript: AEPutParamDesc: error %d\n", err);
-        goto bail;
-    }
+       char *bundleID = "com.apple.Terminal";
+       AppleEvent evt, res;
+       AEDesc desc;
+       OSStatus err;
+
+       [[NSWorkspace sharedWorkspace] launchApplication:@"/Applications/Utilities/Terminal.app/"];
+
+       // Build event
+       err = AEBuildAppleEvent(kAECoreSuite, kAEDoScript,
+                                typeApplicationBundleID,
+                                bundleID, strlen(bundleID),
+                                kAutoGenerateReturnID,
+                                kAnyTransactionID,
+                                &evt, NULL,
+                                "'----':utf8(@)", strlen(command),
+                                command);
+       if (err) {
+               NSLog(@"AEBuildAppleEvent failed: %d\n", err);
+               return err;
+       }
+
+       // Send event and check for any Apple Event Manager errors
+       err = AESendMessage(&evt, &res, kAEWaitReply, kAEDefaultTimeout);
+       AEDisposeDesc(&evt);
+       if (err) {
+               NSLog(@"AESendMessage failed: %d\n", err);
+               return err;
+       }
+       // Check for any application errors
+       err = AEGetParamDesc(&res, keyErrorNumber, typeSInt32, &desc);
+       AEDisposeDesc(&res);
+       if (!err) {
+               AEGetDescData(&desc, &err, sizeof(err));
+               NSLog(@"Terminal returned an error: %d", err);
+               AEDisposeDesc(&desc);
+       } else if (err == errAEDescNotFound) {
+               err = noErr;
+       } else {
+               NSLog(@"AEGetPArmDesc returned an error: %d", err);
+       }
 
-    /* send the command event to Terminal.app */
-    err = AESend(&theAEvent, &theReply, kAEWaitReply,
-            kAENormalPriority, kAEDefaultTimeout, NULL, NULL);
-    
-    if (err != noErr) {
-        NSLog(@"doscript: AESend(docommand): error %d\n", err);
-        goto bail;
-    }
-    /* clean up and leave */
-bail:
-    AEDisposeDesc(&commandDesc);
-    AEDisposeDesc(&theAEvent);
-    AEDisposeDesc(&terminalAddress);
-    AEDisposeDesc(&theReply);
-    return err;
+       return err;
 }