]> granicus.if.org Git - python/commitdiff
Implemented starting Python in a terminal window. The implementation isn't
authorJack Jansen <jack.jansen@cwi.nl>
Wed, 31 Jul 2002 13:15:59 +0000 (13:15 +0000)
committerJack Jansen <jack.jansen@cwi.nl>
Wed, 31 Jul 2002 13:15:59 +0000 (13:15 +0000)
optimal, especially if Terminal wasn't running yet, but it works.

Mac/OSX/PythonLauncher/FileSettings.m
Mac/OSX/PythonLauncher/MyDocument.m
Mac/OSX/PythonLauncher/PythonLauncher.pbproj/project.pbxproj
Mac/OSX/PythonLauncher/doscript.h [new file with mode: 0644]
Mac/OSX/PythonLauncher/doscript.m [new file with mode: 0644]

index 99a1166854e26f6fee164e693099ebb1cd83a1f0..b3fc25a21118e0cd7d0371916a0e856ac72484fe 100755 (executable)
         tabs?" -t":"",
         others,
         script,
-        with_terminal? "" : " &"];
+        with_terminal? "&& exit" : " &"];
 }
 
 // FileSettingsSource protocol 
index a4c20d1042db9d5c371e02c8f391e552e689f887..25718570b9e39f9b5ed6fc1391d58b7ea3c9dafa 100755 (executable)
@@ -8,6 +8,7 @@
 
 #import "MyDocument.h"
 #import "MyAppDelegate.h"
+#import "doscript.h"
 
 @implementation MyDocument
 
     const char *cmdline;
     int sts;
     
-    if ([settings with_terminal]) {
-        NSLog(@"Terminal not implemented yet\n");
-        return NO;
+     cmdline = [[settings commandLineForScript: script] cString];
+   if ([settings with_terminal]) {
+        sts = doscript(cmdline);
+    } else {
+        sts = system(cmdline);
     }
-    cmdline = [[settings commandLineForScript: script] cString];
-    sts = system(cmdline);
     if (sts) {
         NSLog(@"Exit status: %d\n", sts);
         return NO;
index 849aeb3a039bc8caea611d42ac5bf54b2962217e..607e8eed157b3370ed2aac6511a1803dcd1621aa 100755 (executable)
@@ -57,6 +57,7 @@
                1058C7A6FEA54F5311CA2CBB = {
                        children = (
                                1058C7A7FEA54F5311CA2CBB,
+                               F5AA9D0102F807EE0110C447,
                        );
                        isa = PBXGroup;
                        name = "Linked Frameworks";
                };
                2A37F4AFFDCFA73011CA2CEA = {
                        children = (
+                               F5AA9C6A02F8042D0110C447,
                                2A37F4B0FDCFA73011CA2CEA,
+                               F5AAA21D02F8115D0110C447,
                        );
                        isa = PBXGroup;
                        name = "Other Sources";
                                F52A90D002EB5C6A01000102,
                                F5A4C14202F2055D01000102,
                                F5A4C14702F2070D01000102,
+                               F5AA9C6C02F8042D0110C447,
                        );
                        isa = PBXHeadersBuildPhase;
                };
                                F52A90CF02EB5C6A01000102,
                                F5A4C14302F2055D01000102,
                                F5A4C14602F2070D01000102,
+                               F5AAA21E02F8115D0110C447,
                        );
                        isa = PBXSourcesBuildPhase;
                };
                        buildActionMask = 2147483647;
                        files = (
                                1058C7A9FEA54F5311CA2CBB,
+                               F5AA9D9B02F807EF0110C447,
                        );
                        isa = PBXFrameworksBuildPhase;
                };
                        settings = {
                        };
                };
+               F5AA9C6A02F8042D0110C447 = {
+                       isa = PBXFileReference;
+                       path = doscript.h;
+                       refType = 4;
+               };
+               F5AA9C6C02F8042D0110C447 = {
+                       fileRef = F5AA9C6A02F8042D0110C447;
+                       isa = PBXBuildFile;
+                       settings = {
+                       };
+               };
+               F5AA9D0102F807EE0110C447 = {
+                       isa = PBXFrameworkReference;
+                       name = Carbon.framework;
+                       path = /System/Library/Frameworks/Carbon.framework;
+                       refType = 0;
+               };
+               F5AA9D9B02F807EF0110C447 = {
+                       fileRef = F5AA9D0102F807EE0110C447;
+                       isa = PBXBuildFile;
+                       settings = {
+                       };
+               };
+               F5AAA21D02F8115D0110C447 = {
+                       isa = PBXFileReference;
+                       path = doscript.m;
+                       refType = 4;
+               };
+               F5AAA21E02F8115D0110C447 = {
+                       fileRef = F5AAA21D02F8115D0110C447;
+                       isa = PBXBuildFile;
+                       settings = {
+                       };
+               };
        };
        rootObject = 2A37F4A9FDCFA73011CA2CEA;
 }
diff --git a/Mac/OSX/PythonLauncher/doscript.h b/Mac/OSX/PythonLauncher/doscript.h
new file mode 100644 (file)
index 0000000..eef0b56
--- /dev/null
@@ -0,0 +1,12 @@
+/*
+ *  doscript.h
+ *  PythonLauncher
+ *
+ *  Created by Jack Jansen on Wed Jul 31 2002.
+ *  Copyright (c) 2002 __MyCompanyName__. All rights reserved.
+ *
+ */
+
+#include <Carbon/Carbon.h>
+
+extern int doscript(const char *command);
\ No newline at end of file
diff --git a/Mac/OSX/PythonLauncher/doscript.m b/Mac/OSX/PythonLauncher/doscript.m
new file mode 100644 (file)
index 0000000..c2c5886
--- /dev/null
@@ -0,0 +1,118 @@
+/*
+ *  doscript.c
+ *  PythonLauncher
+ *
+ *  Created by Jack Jansen on Wed Jul 31 2002.
+ *  Copyright (c) 2002 __MyCompanyName__. All rights reserved.
+ *
+ */
+
+#import <Cocoa/Cocoa.h>
+#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;
+    }
+
+    /* send the event to the Finder */
+    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;
+}
\ No newline at end of file