mirror of https://github.com/python/cpython
Implemented starting Python in a terminal window. The implementation isn't
optimal, especially if Terminal wasn't running yet, but it works.
This commit is contained in:
parent
33876f514a
commit
b7276cdf71
|
@ -165,7 +165,7 @@
|
||||||
tabs?" -t":"",
|
tabs?" -t":"",
|
||||||
others,
|
others,
|
||||||
script,
|
script,
|
||||||
with_terminal? "" : " &"];
|
with_terminal? "&& exit" : " &"];
|
||||||
}
|
}
|
||||||
|
|
||||||
// FileSettingsSource protocol
|
// FileSettingsSource protocol
|
||||||
|
|
|
@ -8,6 +8,7 @@
|
||||||
|
|
||||||
#import "MyDocument.h"
|
#import "MyDocument.h"
|
||||||
#import "MyAppDelegate.h"
|
#import "MyAppDelegate.h"
|
||||||
|
#import "doscript.h"
|
||||||
|
|
||||||
@implementation MyDocument
|
@implementation MyDocument
|
||||||
|
|
||||||
|
@ -71,12 +72,12 @@
|
||||||
const char *cmdline;
|
const char *cmdline;
|
||||||
int sts;
|
int sts;
|
||||||
|
|
||||||
if ([settings with_terminal]) {
|
|
||||||
NSLog(@"Terminal not implemented yet\n");
|
|
||||||
return NO;
|
|
||||||
}
|
|
||||||
cmdline = [[settings commandLineForScript: script] cString];
|
cmdline = [[settings commandLineForScript: script] cString];
|
||||||
|
if ([settings with_terminal]) {
|
||||||
|
sts = doscript(cmdline);
|
||||||
|
} else {
|
||||||
sts = system(cmdline);
|
sts = system(cmdline);
|
||||||
|
}
|
||||||
if (sts) {
|
if (sts) {
|
||||||
NSLog(@"Exit status: %d\n", sts);
|
NSLog(@"Exit status: %d\n", sts);
|
||||||
return NO;
|
return NO;
|
||||||
|
|
|
@ -57,6 +57,7 @@
|
||||||
1058C7A6FEA54F5311CA2CBB = {
|
1058C7A6FEA54F5311CA2CBB = {
|
||||||
children = (
|
children = (
|
||||||
1058C7A7FEA54F5311CA2CBB,
|
1058C7A7FEA54F5311CA2CBB,
|
||||||
|
F5AA9D0102F807EE0110C447,
|
||||||
);
|
);
|
||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
name = "Linked Frameworks";
|
name = "Linked Frameworks";
|
||||||
|
@ -179,7 +180,9 @@
|
||||||
};
|
};
|
||||||
2A37F4AFFDCFA73011CA2CEA = {
|
2A37F4AFFDCFA73011CA2CEA = {
|
||||||
children = (
|
children = (
|
||||||
|
F5AA9C6A02F8042D0110C447,
|
||||||
2A37F4B0FDCFA73011CA2CEA,
|
2A37F4B0FDCFA73011CA2CEA,
|
||||||
|
F5AAA21D02F8115D0110C447,
|
||||||
);
|
);
|
||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
name = "Other Sources";
|
name = "Other Sources";
|
||||||
|
@ -401,6 +404,7 @@
|
||||||
F52A90D002EB5C6A01000102,
|
F52A90D002EB5C6A01000102,
|
||||||
F5A4C14202F2055D01000102,
|
F5A4C14202F2055D01000102,
|
||||||
F5A4C14702F2070D01000102,
|
F5A4C14702F2070D01000102,
|
||||||
|
F5AA9C6C02F8042D0110C447,
|
||||||
);
|
);
|
||||||
isa = PBXHeadersBuildPhase;
|
isa = PBXHeadersBuildPhase;
|
||||||
};
|
};
|
||||||
|
@ -432,6 +436,7 @@
|
||||||
F52A90CF02EB5C6A01000102,
|
F52A90CF02EB5C6A01000102,
|
||||||
F5A4C14302F2055D01000102,
|
F5A4C14302F2055D01000102,
|
||||||
F5A4C14602F2070D01000102,
|
F5A4C14602F2070D01000102,
|
||||||
|
F5AAA21E02F8115D0110C447,
|
||||||
);
|
);
|
||||||
isa = PBXSourcesBuildPhase;
|
isa = PBXSourcesBuildPhase;
|
||||||
};
|
};
|
||||||
|
@ -455,6 +460,7 @@
|
||||||
buildActionMask = 2147483647;
|
buildActionMask = 2147483647;
|
||||||
files = (
|
files = (
|
||||||
1058C7A9FEA54F5311CA2CBB,
|
1058C7A9FEA54F5311CA2CBB,
|
||||||
|
F5AA9D9B02F807EF0110C447,
|
||||||
);
|
);
|
||||||
isa = PBXFrameworksBuildPhase;
|
isa = PBXFrameworksBuildPhase;
|
||||||
};
|
};
|
||||||
|
@ -607,6 +613,40 @@
|
||||||
settings = {
|
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;
|
rootObject = 2A37F4A9FDCFA73011CA2CEA;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
|
@ -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;
|
||||||
|
}
|
Loading…
Reference in New Issue