annotate Mac/PythonLauncher/doscript.m @ 38644:1cb2ece4b9e1 legacy-trunk

Move Mac/OSX/PythonLauncher one level up
author Ronald Oussoren <ronaldoussoren@mac.com>
date Wed, 07 Jun 2006 18:58:01 +0000
parents Mac/OSX/PythonLauncher/doscript.m@abb5a69d60cb
children 3f84e6ae36da
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
24447
ddd6ff0693c4 Implemented starting Python in a terminal window. The implementation isn't
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
1 /*
ddd6ff0693c4 Implemented starting Python in a terminal window. The implementation isn't
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
2 * doscript.c
ddd6ff0693c4 Implemented starting Python in a terminal window. The implementation isn't
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
3 * PythonLauncher
ddd6ff0693c4 Implemented starting Python in a terminal window. The implementation isn't
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
4 *
ddd6ff0693c4 Implemented starting Python in a terminal window. The implementation isn't
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
5 * Created by Jack Jansen on Wed Jul 31 2002.
ddd6ff0693c4 Implemented starting Python in a terminal window. The implementation isn't
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
6 * Copyright (c) 2002 __MyCompanyName__. All rights reserved.
ddd6ff0693c4 Implemented starting Python in a terminal window. The implementation isn't
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
7 *
ddd6ff0693c4 Implemented starting Python in a terminal window. The implementation isn't
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
8 */
ddd6ff0693c4 Implemented starting Python in a terminal window. The implementation isn't
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
9
ddd6ff0693c4 Implemented starting Python in a terminal window. The implementation isn't
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
10 #import <Cocoa/Cocoa.h>
ddd6ff0693c4 Implemented starting Python in a terminal window. The implementation isn't
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
11 #import <ApplicationServices/ApplicationServices.h>
ddd6ff0693c4 Implemented starting Python in a terminal window. The implementation isn't
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
12 #import "doscript.h"
ddd6ff0693c4 Implemented starting Python in a terminal window. The implementation isn't
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
13
ddd6ff0693c4 Implemented starting Python in a terminal window. The implementation isn't
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
14 /* I assume I could pick these up from somewhere, but where... */
ddd6ff0693c4 Implemented starting Python in a terminal window. The implementation isn't
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
15 #define CREATOR 'trmx'
ddd6ff0693c4 Implemented starting Python in a terminal window. The implementation isn't
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
16
ddd6ff0693c4 Implemented starting Python in a terminal window. The implementation isn't
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
17 #define ACTIVATE_CMD 'misc'
ddd6ff0693c4 Implemented starting Python in a terminal window. The implementation isn't
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
18 #define ACTIVATE_SUITE 'actv'
ddd6ff0693c4 Implemented starting Python in a terminal window. The implementation isn't
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
19
ddd6ff0693c4 Implemented starting Python in a terminal window. The implementation isn't
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
20 #define DOSCRIPT_CMD 'dosc'
ddd6ff0693c4 Implemented starting Python in a terminal window. The implementation isn't
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
21 #define DOSCRIPT_SUITE 'core'
ddd6ff0693c4 Implemented starting Python in a terminal window. The implementation isn't
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
22 #define WITHCOMMAND 'cmnd'
ddd6ff0693c4 Implemented starting Python in a terminal window. The implementation isn't
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
23
ddd6ff0693c4 Implemented starting Python in a terminal window. The implementation isn't
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
24 /* ... and there's probably also a better way to do this... */
ddd6ff0693c4 Implemented starting Python in a terminal window. The implementation isn't
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
25 #define START_TERMINAL "/Applications/Utilities/Terminal.app/Contents/MacOS/Terminal &"
ddd6ff0693c4 Implemented starting Python in a terminal window. The implementation isn't
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
26
ddd6ff0693c4 Implemented starting Python in a terminal window. The implementation isn't
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
27 extern int
ddd6ff0693c4 Implemented starting Python in a terminal window. The implementation isn't
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
28 doscript(const char *command)
ddd6ff0693c4 Implemented starting Python in a terminal window. The implementation isn't
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
29 {
ddd6ff0693c4 Implemented starting Python in a terminal window. The implementation isn't
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
30 OSErr err;
ddd6ff0693c4 Implemented starting Python in a terminal window. The implementation isn't
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
31 AppleEvent theAEvent, theReply;
ddd6ff0693c4 Implemented starting Python in a terminal window. The implementation isn't
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
32 AEAddressDesc terminalAddress;
ddd6ff0693c4 Implemented starting Python in a terminal window. The implementation isn't
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
33 AEDesc commandDesc;
ddd6ff0693c4 Implemented starting Python in a terminal window. The implementation isn't
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
34 OSType terminalCreator = CREATOR;
ddd6ff0693c4 Implemented starting Python in a terminal window. The implementation isn't
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
35
ddd6ff0693c4 Implemented starting Python in a terminal window. The implementation isn't
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
36 /* set up locals */
ddd6ff0693c4 Implemented starting Python in a terminal window. The implementation isn't
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
37 AECreateDesc(typeNull, NULL, 0, &theAEvent);
ddd6ff0693c4 Implemented starting Python in a terminal window. The implementation isn't
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
38 AECreateDesc(typeNull, NULL, 0, &terminalAddress);
ddd6ff0693c4 Implemented starting Python in a terminal window. The implementation isn't
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
39 AECreateDesc(typeNull, NULL, 0, &theReply);
ddd6ff0693c4 Implemented starting Python in a terminal window. The implementation isn't
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
40 AECreateDesc(typeNull, NULL, 0, &commandDesc);
ddd6ff0693c4 Implemented starting Python in a terminal window. The implementation isn't
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
41
ddd6ff0693c4 Implemented starting Python in a terminal window. The implementation isn't
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
42 /* create the "activate" event for Terminal */
ddd6ff0693c4 Implemented starting Python in a terminal window. The implementation isn't
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
43 err = AECreateDesc(typeApplSignature, (Ptr) &terminalCreator,
ddd6ff0693c4 Implemented starting Python in a terminal window. The implementation isn't
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
44 sizeof(terminalCreator), &terminalAddress);
ddd6ff0693c4 Implemented starting Python in a terminal window. The implementation isn't
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
45 if (err != noErr) {
ddd6ff0693c4 Implemented starting Python in a terminal window. The implementation isn't
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
46 NSLog(@"doscript: AECreateDesc: error %d\n", err);
ddd6ff0693c4 Implemented starting Python in a terminal window. The implementation isn't
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
47 goto bail;
ddd6ff0693c4 Implemented starting Python in a terminal window. The implementation isn't
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
48 }
ddd6ff0693c4 Implemented starting Python in a terminal window. The implementation isn't
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
49 err = AECreateAppleEvent(ACTIVATE_SUITE, ACTIVATE_CMD,
ddd6ff0693c4 Implemented starting Python in a terminal window. The implementation isn't
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
50 &terminalAddress, kAutoGenerateReturnID,
ddd6ff0693c4 Implemented starting Python in a terminal window. The implementation isn't
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
51 kAnyTransactionID, &theAEvent);
ddd6ff0693c4 Implemented starting Python in a terminal window. The implementation isn't
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
52
ddd6ff0693c4 Implemented starting Python in a terminal window. The implementation isn't
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
53 if (err != noErr) {
ddd6ff0693c4 Implemented starting Python in a terminal window. The implementation isn't
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
54 NSLog(@"doscript: AECreateAppleEvent(activate): error %d\n", err);
ddd6ff0693c4 Implemented starting Python in a terminal window. The implementation isn't
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
55 goto bail;
ddd6ff0693c4 Implemented starting Python in a terminal window. The implementation isn't
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
56 }
ddd6ff0693c4 Implemented starting Python in a terminal window. The implementation isn't
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
57 /* send the event */
ddd6ff0693c4 Implemented starting Python in a terminal window. The implementation isn't
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
58 err = AESend(&theAEvent, &theReply, kAEWaitReply,
ddd6ff0693c4 Implemented starting Python in a terminal window. The implementation isn't
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
59 kAENormalPriority, kAEDefaultTimeout, NULL, NULL);
ddd6ff0693c4 Implemented starting Python in a terminal window. The implementation isn't
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
60 if ( err == -600 ) {
ddd6ff0693c4 Implemented starting Python in a terminal window. The implementation isn't
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
61 int count=10;
ddd6ff0693c4 Implemented starting Python in a terminal window. The implementation isn't
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
62 /* If it failed with "no such process" try to start Terminal */
ddd6ff0693c4 Implemented starting Python in a terminal window. The implementation isn't
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
63 err = system(START_TERMINAL);
ddd6ff0693c4 Implemented starting Python in a terminal window. The implementation isn't
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
64 if ( err ) {
ddd6ff0693c4 Implemented starting Python in a terminal window. The implementation isn't
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
65 NSLog(@"doscript: system(): %s\n", strerror(errno));
ddd6ff0693c4 Implemented starting Python in a terminal window. The implementation isn't
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
66 goto bail;
ddd6ff0693c4 Implemented starting Python in a terminal window. The implementation isn't
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
67 }
ddd6ff0693c4 Implemented starting Python in a terminal window. The implementation isn't
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
68 do {
ddd6ff0693c4 Implemented starting Python in a terminal window. The implementation isn't
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
69 sleep(1);
ddd6ff0693c4 Implemented starting Python in a terminal window. The implementation isn't
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
70 /* send the event again */
ddd6ff0693c4 Implemented starting Python in a terminal window. The implementation isn't
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
71 err = AESend(&theAEvent, &theReply, kAEWaitReply,
ddd6ff0693c4 Implemented starting Python in a terminal window. The implementation isn't
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
72 kAENormalPriority, kAEDefaultTimeout, NULL, NULL);
ddd6ff0693c4 Implemented starting Python in a terminal window. The implementation isn't
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
73 } while (err == -600 && --count > 0);
ddd6ff0693c4 Implemented starting Python in a terminal window. The implementation isn't
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
74 if ( err == -600 )
ddd6ff0693c4 Implemented starting Python in a terminal window. The implementation isn't
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
75 NSLog(@"doscript: Could not activate Terminal\n");
ddd6ff0693c4 Implemented starting Python in a terminal window. The implementation isn't
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
76 }
ddd6ff0693c4 Implemented starting Python in a terminal window. The implementation isn't
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
77 if (err != noErr) {
ddd6ff0693c4 Implemented starting Python in a terminal window. The implementation isn't
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
78 NSLog(@"doscript: AESend(activate): error %d\n", err);
ddd6ff0693c4 Implemented starting Python in a terminal window. The implementation isn't
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
79 goto bail;
ddd6ff0693c4 Implemented starting Python in a terminal window. The implementation isn't
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
80 }
ddd6ff0693c4 Implemented starting Python in a terminal window. The implementation isn't
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
81
ddd6ff0693c4 Implemented starting Python in a terminal window. The implementation isn't
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
82 /* create the "doscript with command" event for Terminal */
ddd6ff0693c4 Implemented starting Python in a terminal window. The implementation isn't
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
83 err = AECreateAppleEvent(DOSCRIPT_SUITE, DOSCRIPT_CMD,
ddd6ff0693c4 Implemented starting Python in a terminal window. The implementation isn't
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
84 &terminalAddress, kAutoGenerateReturnID,
ddd6ff0693c4 Implemented starting Python in a terminal window. The implementation isn't
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
85 kAnyTransactionID, &theAEvent);
ddd6ff0693c4 Implemented starting Python in a terminal window. The implementation isn't
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
86 if (err != noErr) {
ddd6ff0693c4 Implemented starting Python in a terminal window. The implementation isn't
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
87 NSLog(@"doscript: AECreateAppleEvent(doscript): error %d\n", err);
ddd6ff0693c4 Implemented starting Python in a terminal window. The implementation isn't
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
88 goto bail;
ddd6ff0693c4 Implemented starting Python in a terminal window. The implementation isn't
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
89 }
ddd6ff0693c4 Implemented starting Python in a terminal window. The implementation isn't
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
90
ddd6ff0693c4 Implemented starting Python in a terminal window. The implementation isn't
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
91 /* add the command to the apple event */
ddd6ff0693c4 Implemented starting Python in a terminal window. The implementation isn't
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
92 err = AECreateDesc(typeChar, command, strlen(command), &commandDesc);
ddd6ff0693c4 Implemented starting Python in a terminal window. The implementation isn't
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
93 if (err != noErr) {
ddd6ff0693c4 Implemented starting Python in a terminal window. The implementation isn't
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
94 NSLog(@"doscript: AECreateDesc(command): error %d\n", err);
ddd6ff0693c4 Implemented starting Python in a terminal window. The implementation isn't
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
95 goto bail;
ddd6ff0693c4 Implemented starting Python in a terminal window. The implementation isn't
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
96 }
ddd6ff0693c4 Implemented starting Python in a terminal window. The implementation isn't
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
97 err = AEPutParamDesc(&theAEvent, WITHCOMMAND, &commandDesc);
ddd6ff0693c4 Implemented starting Python in a terminal window. The implementation isn't
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
98 if (err != noErr) {
ddd6ff0693c4 Implemented starting Python in a terminal window. The implementation isn't
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
99 NSLog(@"doscript: AEPutParamDesc: error %d\n", err);
ddd6ff0693c4 Implemented starting Python in a terminal window. The implementation isn't
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
100 goto bail;
ddd6ff0693c4 Implemented starting Python in a terminal window. The implementation isn't
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
101 }
ddd6ff0693c4 Implemented starting Python in a terminal window. The implementation isn't
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
102
27088
abb5a69d60cb correct comment (and add newline at end)
Just van Rossum <just@letterror.com>
parents: 24447
diff changeset
103 /* send the command event to Terminal.app */
24447
ddd6ff0693c4 Implemented starting Python in a terminal window. The implementation isn't
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
104 err = AESend(&theAEvent, &theReply, kAEWaitReply,
ddd6ff0693c4 Implemented starting Python in a terminal window. The implementation isn't
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
105 kAENormalPriority, kAEDefaultTimeout, NULL, NULL);
ddd6ff0693c4 Implemented starting Python in a terminal window. The implementation isn't
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
106
ddd6ff0693c4 Implemented starting Python in a terminal window. The implementation isn't
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
107 if (err != noErr) {
ddd6ff0693c4 Implemented starting Python in a terminal window. The implementation isn't
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
108 NSLog(@"doscript: AESend(docommand): error %d\n", err);
ddd6ff0693c4 Implemented starting Python in a terminal window. The implementation isn't
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
109 goto bail;
ddd6ff0693c4 Implemented starting Python in a terminal window. The implementation isn't
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
110 }
ddd6ff0693c4 Implemented starting Python in a terminal window. The implementation isn't
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
111 /* clean up and leave */
ddd6ff0693c4 Implemented starting Python in a terminal window. The implementation isn't
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
112 bail:
ddd6ff0693c4 Implemented starting Python in a terminal window. The implementation isn't
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
113 AEDisposeDesc(&commandDesc);
ddd6ff0693c4 Implemented starting Python in a terminal window. The implementation isn't
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
114 AEDisposeDesc(&theAEvent);
ddd6ff0693c4 Implemented starting Python in a terminal window. The implementation isn't
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
115 AEDisposeDesc(&terminalAddress);
ddd6ff0693c4 Implemented starting Python in a terminal window. The implementation isn't
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
116 AEDisposeDesc(&theReply);
ddd6ff0693c4 Implemented starting Python in a terminal window. The implementation isn't
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
117 return err;
27088
abb5a69d60cb correct comment (and add newline at end)
Just van Rossum <just@letterror.com>
parents: 24447
diff changeset
118 }