mirror of https://github.com/python/cpython
Move Mac/OSX/PythonLauncher one level up
This commit is contained in:
parent
8ec9f866c0
commit
c629be8a1e
|
@ -0,0 +1,30 @@
|
|||
{\rtf1\mac\ansicpg10000\cocoartf100
|
||||
{\fonttbl\f0\fswiss\fcharset77 Helvetica-Bold;\f1\fswiss\fcharset77 Helvetica;}
|
||||
{\colortbl;\red255\green255\blue255;}
|
||||
\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\ql\qnatural
|
||||
|
||||
\f0\b\fs24 \cf0 Engineering:
|
||||
\f1\b0 \
|
||||
Jack Jansen\
|
||||
\
|
||||
|
||||
\f0\b Human Interface Design:
|
||||
\f1\b0 \
|
||||
Jack Jansen\
|
||||
\
|
||||
|
||||
\f0\b Testing:
|
||||
\f1\b0 \
|
||||
Jack Jansen\
|
||||
Pythonmac-SIG@python.org\
|
||||
\
|
||||
|
||||
\f0\b Documentation:
|
||||
\f1\b0 \
|
||||
Missing\
|
||||
\
|
||||
|
||||
\f0\b With special thanks to:
|
||||
\f1\b0 \
|
||||
Guido, of course\
|
||||
}
|
|
@ -0,0 +1,12 @@
|
|||
{
|
||||
IBClasses = (
|
||||
{CLASS = FirstResponder; LANGUAGE = ObjC; SUPERCLASS = NSObject; },
|
||||
{
|
||||
ACTIONS = {showPreferences = id; };
|
||||
CLASS = MyAppDelegate;
|
||||
LANGUAGE = ObjC;
|
||||
SUPERCLASS = NSObject;
|
||||
}
|
||||
);
|
||||
IBVersion = 1;
|
||||
}
|
|
@ -0,0 +1,21 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist SYSTEM "file://localhost/System/Library/DTDs/PropertyList.dtd">
|
||||
<plist version="0.9">
|
||||
<dict>
|
||||
<key>IBDocumentLocation</key>
|
||||
<string>99 33 356 240 0 0 800 578 </string>
|
||||
<key>IBEditorPositions</key>
|
||||
<dict>
|
||||
<key>29</key>
|
||||
<string>82 396 318 44 0 0 800 578 </string>
|
||||
</dict>
|
||||
<key>IBFramework Version</key>
|
||||
<string>263.2</string>
|
||||
<key>IBOpenObjects</key>
|
||||
<array>
|
||||
<integer>29</integer>
|
||||
</array>
|
||||
<key>IBSystem Version</key>
|
||||
<string>5S66</string>
|
||||
</dict>
|
||||
</plist>
|
Binary file not shown.
|
@ -0,0 +1,26 @@
|
|||
{
|
||||
IBClasses = (
|
||||
{CLASS = FirstResponder; LANGUAGE = ObjC; SUPERCLASS = NSObject; },
|
||||
{
|
||||
ACTIONS = {"do_apply" = id; "do_cancel" = id; "do_reset" = id; "do_run" = id; };
|
||||
CLASS = MyDocument;
|
||||
LANGUAGE = ObjC;
|
||||
OUTLETS = {
|
||||
commandline = NSTextField;
|
||||
debug = NSButton;
|
||||
honourhashbang = NSButton;
|
||||
inspect = NSButton;
|
||||
interpreter = NSTextField;
|
||||
nosite = NSButton;
|
||||
optimize = NSButton;
|
||||
others = NSTextField;
|
||||
scriptargs = NSTextField;
|
||||
tabs = NSButton;
|
||||
verbose = NSButton;
|
||||
"with_terminal" = NSButton;
|
||||
};
|
||||
SUPERCLASS = NSDocument;
|
||||
}
|
||||
);
|
||||
IBVersion = 1;
|
||||
}
|
|
@ -0,0 +1,16 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>IBDocumentLocation</key>
|
||||
<string>398 60 356 240 0 0 1024 746 </string>
|
||||
<key>IBFramework Version</key>
|
||||
<string>291.0</string>
|
||||
<key>IBOpenObjects</key>
|
||||
<array>
|
||||
<integer>5</integer>
|
||||
</array>
|
||||
<key>IBSystem Version</key>
|
||||
<string>6L60</string>
|
||||
</dict>
|
||||
</plist>
|
Binary file not shown.
|
@ -0,0 +1,26 @@
|
|||
{
|
||||
IBClasses = (
|
||||
{CLASS = FirstResponder; LANGUAGE = ObjC; SUPERCLASS = NSObject; },
|
||||
{
|
||||
ACTIONS = {"do_apply" = id; "do_filetype" = id; "do_reset" = id; };
|
||||
CLASS = PreferencesWindowController;
|
||||
LANGUAGE = ObjC;
|
||||
OUTLETS = {
|
||||
commandline = NSTextField;
|
||||
debug = NSButton;
|
||||
filetype = NSPopUpButton;
|
||||
honourhashbang = NSButton;
|
||||
inspect = NSButton;
|
||||
interpreter = NSTextField;
|
||||
nosite = NSButton;
|
||||
optimize = NSButton;
|
||||
others = NSTextField;
|
||||
tabs = NSButton;
|
||||
verbose = NSButton;
|
||||
"with_terminal" = NSButton;
|
||||
};
|
||||
SUPERCLASS = NSWindowController;
|
||||
}
|
||||
);
|
||||
IBVersion = 1;
|
||||
}
|
|
@ -0,0 +1,16 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>IBDocumentLocation</key>
|
||||
<string>565 235 519 534 0 0 1280 1002 </string>
|
||||
<key>IBFramework Version</key>
|
||||
<string>364.0</string>
|
||||
<key>IBOpenObjects</key>
|
||||
<array>
|
||||
<integer>5</integer>
|
||||
</array>
|
||||
<key>IBSystem Version</key>
|
||||
<string>7H63</string>
|
||||
</dict>
|
||||
</plist>
|
Binary file not shown.
|
@ -0,0 +1,64 @@
|
|||
//
|
||||
// FileSettings.h
|
||||
// PythonLauncher
|
||||
//
|
||||
// Created by Jack Jansen on Sun Jul 21 2002.
|
||||
// Copyright (c) 2002 __MyCompanyName__. All rights reserved.
|
||||
//
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
|
||||
@protocol FileSettingsSource
|
||||
- (NSString *) interpreter;
|
||||
- (BOOL) honourhashbang;
|
||||
- (BOOL) debug;
|
||||
- (BOOL) verbose;
|
||||
- (BOOL) inspect;
|
||||
- (BOOL) optimize;
|
||||
- (BOOL) nosite;
|
||||
- (BOOL) tabs;
|
||||
- (NSString *) others;
|
||||
- (BOOL) with_terminal;
|
||||
- (NSString *) scriptargs;
|
||||
@end
|
||||
|
||||
@interface FileSettings : NSObject <FileSettingsSource>
|
||||
{
|
||||
NSString *interpreter; // The pathname of the interpreter to use
|
||||
NSArray *interpreters; // List of known interpreters
|
||||
BOOL honourhashbang; // #! line overrides interpreter
|
||||
BOOL debug; // -d option: debug parser
|
||||
BOOL verbose; // -v option: verbose import
|
||||
BOOL inspect; // -i option: interactive mode after script
|
||||
BOOL optimize; // -O option: optimize bytecode
|
||||
BOOL nosite; // -S option: don't import site.py
|
||||
BOOL tabs; // -t option: warn about inconsistent tabs
|
||||
NSString *others; // other options
|
||||
NSString *scriptargs; // script arguments (not for preferences)
|
||||
BOOL with_terminal; // Run in terminal window
|
||||
|
||||
FileSettings *origsource;
|
||||
NSString *prefskey;
|
||||
}
|
||||
|
||||
+ (id)getDefaultsForFileType: (NSString *)filetype;
|
||||
+ (id)getFactorySettingsForFileType: (NSString *)filetype;
|
||||
+ (id)newSettingsForFileType: (NSString *)filetype;
|
||||
|
||||
//- (id)init;
|
||||
- (id)initForFileType: (NSString *)filetype;
|
||||
- (id)initForFSDefaultFileType: (NSString *)filetype;
|
||||
- (id)initForDefaultFileType: (NSString *)filetype;
|
||||
//- (id)initWithFileSettings: (FileSettings *)source;
|
||||
|
||||
- (void)updateFromSource: (id <FileSettingsSource>)source;
|
||||
- (NSString *)commandLineForScript: (NSString *)script;
|
||||
|
||||
//- (void)applyFactorySettingsForFileType: (NSString *)filetype;
|
||||
//- (void)saveDefaults;
|
||||
//- (void)applyUserDefaults: (NSString *)filetype;
|
||||
- (void)applyValuesFromDict: (NSDictionary *)dict;
|
||||
- (void)reset;
|
||||
- (NSArray *) interpreters;
|
||||
|
||||
@end
|
|
@ -0,0 +1,298 @@
|
|||
//
|
||||
// FileSettings.m
|
||||
// PythonLauncher
|
||||
//
|
||||
// Created by Jack Jansen on Sun Jul 21 2002.
|
||||
// Copyright (c) 2002 __MyCompanyName__. All rights reserved.
|
||||
//
|
||||
|
||||
#import "FileSettings.h"
|
||||
|
||||
@implementation FileSettings
|
||||
|
||||
+ (id)getFactorySettingsForFileType: (NSString *)filetype
|
||||
{
|
||||
static FileSettings *fsdefault_py, *fsdefault_pyw, *fsdefault_pyc;
|
||||
FileSettings **curdefault;
|
||||
|
||||
if ([filetype isEqualToString: @"Python Script"]) {
|
||||
curdefault = &fsdefault_py;
|
||||
} else if ([filetype isEqualToString: @"Python GUI Script"]) {
|
||||
curdefault = &fsdefault_pyw;
|
||||
} else if ([filetype isEqualToString: @"Python Bytecode Document"]) {
|
||||
curdefault = &fsdefault_pyc;
|
||||
} else {
|
||||
NSLog(@"Funny File Type: %@\n", filetype);
|
||||
curdefault = &fsdefault_py;
|
||||
filetype = @"Python Script";
|
||||
}
|
||||
if (!*curdefault) {
|
||||
*curdefault = [[FileSettings new] initForFSDefaultFileType: filetype];
|
||||
}
|
||||
return *curdefault;
|
||||
}
|
||||
|
||||
+ (id)getDefaultsForFileType: (NSString *)filetype
|
||||
{
|
||||
static FileSettings *default_py, *default_pyw, *default_pyc;
|
||||
FileSettings **curdefault;
|
||||
|
||||
if ([filetype isEqualToString: @"Python Script"]) {
|
||||
curdefault = &default_py;
|
||||
} else if ([filetype isEqualToString: @"Python GUI Script"]) {
|
||||
curdefault = &default_pyw;
|
||||
} else if ([filetype isEqualToString: @"Python Bytecode Document"]) {
|
||||
curdefault = &default_pyc;
|
||||
} else {
|
||||
NSLog(@"Funny File Type: %@\n", filetype);
|
||||
curdefault = &default_py;
|
||||
filetype = @"Python Script";
|
||||
}
|
||||
if (!*curdefault) {
|
||||
*curdefault = [[FileSettings new] initForDefaultFileType: filetype];
|
||||
}
|
||||
return *curdefault;
|
||||
}
|
||||
|
||||
+ (id)newSettingsForFileType: (NSString *)filetype
|
||||
{
|
||||
FileSettings *cur;
|
||||
|
||||
cur = [FileSettings new];
|
||||
[cur initForFileType: filetype];
|
||||
return [cur retain];
|
||||
}
|
||||
|
||||
- (id)initWithFileSettings: (FileSettings *)source
|
||||
{
|
||||
self = [super init];
|
||||
if (!self) return self;
|
||||
|
||||
interpreter = [source->interpreter retain];
|
||||
honourhashbang = source->honourhashbang;
|
||||
debug = source->debug;
|
||||
verbose = source->verbose;
|
||||
inspect = source->inspect;
|
||||
optimize = source->optimize;
|
||||
nosite = source->nosite;
|
||||
tabs = source->tabs;
|
||||
others = [source->others retain];
|
||||
scriptargs = [source->scriptargs retain];
|
||||
with_terminal = source->with_terminal;
|
||||
prefskey = source->prefskey;
|
||||
if (prefskey) [prefskey retain];
|
||||
|
||||
return self;
|
||||
}
|
||||
|
||||
- (id)initForFileType: (NSString *)filetype
|
||||
{
|
||||
FileSettings *defaults;
|
||||
|
||||
defaults = [FileSettings getDefaultsForFileType: filetype];
|
||||
self = [self initWithFileSettings: defaults];
|
||||
origsource = [defaults retain];
|
||||
return self;
|
||||
}
|
||||
|
||||
//- (id)init
|
||||
//{
|
||||
// self = [self initForFileType: @"Python Script"];
|
||||
// return self;
|
||||
//}
|
||||
|
||||
- (id)initForFSDefaultFileType: (NSString *)filetype
|
||||
{
|
||||
int i;
|
||||
NSString *filename;
|
||||
NSDictionary *dict;
|
||||
static NSDictionary *factorySettings;
|
||||
|
||||
self = [super init];
|
||||
if (!self) return self;
|
||||
|
||||
if (factorySettings == NULL) {
|
||||
NSBundle *bdl = [NSBundle mainBundle];
|
||||
NSString *path = [ bdl pathForResource: @"factorySettings"
|
||||
ofType: @"plist"];
|
||||
factorySettings = [[NSDictionary dictionaryWithContentsOfFile:
|
||||
path] retain];
|
||||
if (factorySettings == NULL) {
|
||||
NSLog(@"Missing %@", path);
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
dict = [factorySettings objectForKey: filetype];
|
||||
if (dict == NULL) {
|
||||
NSLog(@"factorySettings.plist misses file type \"%@\"", filetype);
|
||||
interpreter = [@"no default found" retain];
|
||||
return NULL;
|
||||
}
|
||||
[self applyValuesFromDict: dict];
|
||||
interpreters = [dict objectForKey: @"interpreter_list"];
|
||||
interpreter = NULL;
|
||||
for (i=0; i < [interpreters count]; i++) {
|
||||
filename = [interpreters objectAtIndex: i];
|
||||
filename = [filename stringByExpandingTildeInPath];
|
||||
if ([[NSFileManager defaultManager] fileExistsAtPath: filename]) {
|
||||
interpreter = [filename retain];
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (interpreter == NULL)
|
||||
interpreter = [@"no default found" retain];
|
||||
origsource = NULL;
|
||||
return self;
|
||||
}
|
||||
|
||||
- (void)applyUserDefaults: (NSString *)filetype
|
||||
{
|
||||
NSUserDefaults *defaults;
|
||||
NSDictionary *dict;
|
||||
|
||||
defaults = [NSUserDefaults standardUserDefaults];
|
||||
dict = [defaults dictionaryForKey: filetype];
|
||||
if (!dict)
|
||||
return;
|
||||
[self applyValuesFromDict: dict];
|
||||
}
|
||||
|
||||
- (id)initForDefaultFileType: (NSString *)filetype
|
||||
{
|
||||
FileSettings *fsdefaults;
|
||||
|
||||
fsdefaults = [FileSettings getFactorySettingsForFileType: filetype];
|
||||
self = [self initWithFileSettings: fsdefaults];
|
||||
if (!self) return self;
|
||||
interpreters = [fsdefaults->interpreters retain];
|
||||
scriptargs = [@"" retain];
|
||||
[self applyUserDefaults: filetype];
|
||||
prefskey = [filetype retain];
|
||||
return self;
|
||||
}
|
||||
|
||||
- (void)reset
|
||||
{
|
||||
if (origsource) {
|
||||
[self updateFromSource: origsource];
|
||||
} else {
|
||||
FileSettings *fsdefaults;
|
||||
fsdefaults = [FileSettings getFactorySettingsForFileType: prefskey];
|
||||
[self updateFromSource: fsdefaults];
|
||||
}
|
||||
}
|
||||
|
||||
- (void)updateFromSource: (id <FileSettingsSource>)source
|
||||
{
|
||||
interpreter = [[source interpreter] retain];
|
||||
honourhashbang = [source honourhashbang];
|
||||
debug = [source debug];
|
||||
verbose = [source verbose];
|
||||
inspect = [source inspect];
|
||||
optimize = [source optimize];
|
||||
nosite = [source nosite];
|
||||
tabs = [source tabs];
|
||||
others = [[source others] retain];
|
||||
scriptargs = [[source scriptargs] retain];
|
||||
with_terminal = [source with_terminal];
|
||||
// And if this is a user defaults object we also save the
|
||||
// values
|
||||
if (!origsource) {
|
||||
NSUserDefaults *defaults;
|
||||
NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:
|
||||
interpreter, @"interpreter",
|
||||
[NSNumber numberWithBool: honourhashbang], @"honourhashbang",
|
||||
[NSNumber numberWithBool: debug], @"debug",
|
||||
[NSNumber numberWithBool: verbose], @"verbose",
|
||||
[NSNumber numberWithBool: inspect], @"inspect",
|
||||
[NSNumber numberWithBool: optimize], @"optimize",
|
||||
[NSNumber numberWithBool: nosite], @"nosite",
|
||||
[NSNumber numberWithBool: nosite], @"nosite",
|
||||
others, @"others",
|
||||
scriptargs, @"scriptargs",
|
||||
[NSNumber numberWithBool: with_terminal], @"with_terminal",
|
||||
nil];
|
||||
defaults = [NSUserDefaults standardUserDefaults];
|
||||
[defaults setObject: dict forKey: prefskey];
|
||||
}
|
||||
}
|
||||
|
||||
- (void)applyValuesFromDict: (NSDictionary *)dict
|
||||
{
|
||||
id value;
|
||||
|
||||
value = [dict objectForKey: @"interpreter"];
|
||||
if (value) interpreter = [value retain];
|
||||
value = [dict objectForKey: @"honourhashbang"];
|
||||
if (value) honourhashbang = [value boolValue];
|
||||
value = [dict objectForKey: @"debug"];
|
||||
if (value) debug = [value boolValue];
|
||||
value = [dict objectForKey: @"verbose"];
|
||||
if (value) verbose = [value boolValue];
|
||||
value = [dict objectForKey: @"inspect"];
|
||||
if (value) inspect = [value boolValue];
|
||||
value = [dict objectForKey: @"optimize"];
|
||||
if (value) optimize = [value boolValue];
|
||||
value = [dict objectForKey: @"nosite"];
|
||||
if (value) nosite = [value boolValue];
|
||||
value = [dict objectForKey: @"nosite"];
|
||||
if (value) tabs = [value boolValue];
|
||||
value = [dict objectForKey: @"others"];
|
||||
if (value) others = [value retain];
|
||||
value = [dict objectForKey: @"scriptargs"];
|
||||
if (value) scriptargs = [value retain];
|
||||
value = [dict objectForKey: @"with_terminal"];
|
||||
if (value) with_terminal = [value boolValue];
|
||||
}
|
||||
|
||||
- (NSString *)commandLineForScript: (NSString *)script
|
||||
{
|
||||
NSString *cur_interp = NULL;
|
||||
char hashbangbuf[1024];
|
||||
FILE *fp;
|
||||
char *p;
|
||||
|
||||
if (honourhashbang &&
|
||||
(fp=fopen([script cString], "r")) &&
|
||||
fgets(hashbangbuf, sizeof(hashbangbuf), fp) &&
|
||||
strncmp(hashbangbuf, "#!", 2) == 0 &&
|
||||
(p=strchr(hashbangbuf, '\n'))) {
|
||||
*p = '\0';
|
||||
p = hashbangbuf + 2;
|
||||
while (*p == ' ') p++;
|
||||
cur_interp = [NSString stringWithCString: p];
|
||||
}
|
||||
if (!cur_interp)
|
||||
cur_interp = interpreter;
|
||||
|
||||
return [NSString stringWithFormat:
|
||||
@"\"%@\"%s%s%s%s%s%s %@ \"%@\" %@ %s",
|
||||
cur_interp,
|
||||
debug?" -d":"",
|
||||
verbose?" -v":"",
|
||||
inspect?" -i":"",
|
||||
optimize?" -O":"",
|
||||
nosite?" -S":"",
|
||||
tabs?" -t":"",
|
||||
others,
|
||||
script,
|
||||
scriptargs,
|
||||
with_terminal? "&& echo Exit status: $? && exit 1" : " &"];
|
||||
}
|
||||
|
||||
- (NSArray *) interpreters { return interpreters;};
|
||||
|
||||
// FileSettingsSource protocol
|
||||
- (NSString *) interpreter { return interpreter;};
|
||||
- (BOOL) honourhashbang { return honourhashbang; };
|
||||
- (BOOL) debug { return debug;};
|
||||
- (BOOL) verbose { return verbose;};
|
||||
- (BOOL) inspect { return inspect;};
|
||||
- (BOOL) optimize { return optimize;};
|
||||
- (BOOL) nosite { return nosite;};
|
||||
- (BOOL) tabs { return tabs;};
|
||||
- (NSString *) others { return others;};
|
||||
- (NSString *) scriptargs { return scriptargs;};
|
||||
- (BOOL) with_terminal { return with_terminal;};
|
||||
|
||||
@end
|
|
@ -0,0 +1,65 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>CFBundleDevelopmentRegion</key>
|
||||
<string>English</string>
|
||||
<key>CFBundleDocumentTypes</key>
|
||||
<array>
|
||||
<dict>
|
||||
<key>CFBundleTypeExtensions</key>
|
||||
<array>
|
||||
<string>py</string>
|
||||
<string>pyw</string>
|
||||
</array>
|
||||
<key>CFBundleTypeIconFile</key>
|
||||
<string>PythonSource.icns</string>
|
||||
<key>CFBundleTypeName</key>
|
||||
<string>Python Script</string>
|
||||
<key>CFBundleTypeRole</key>
|
||||
<string>Viewer</string>
|
||||
<key>NSDocumentClass</key>
|
||||
<string>MyDocument</string>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>CFBundleTypeExtensions</key>
|
||||
<array>
|
||||
<string>pyc</string>
|
||||
<string>pyo</string>
|
||||
</array>
|
||||
<key>CFBundleTypeIconFile</key>
|
||||
<string>PythonCompiled.icns</string>
|
||||
<key>CFBundleTypeName</key>
|
||||
<string>Python Bytecode Document</string>
|
||||
<key>CFBundleTypeRole</key>
|
||||
<string>Viewer</string>
|
||||
<key>NSDocumentClass</key>
|
||||
<string>MyDocument</string>
|
||||
</dict>
|
||||
</array>
|
||||
<key>CFBundleExecutable</key>
|
||||
<string>PythonLauncher</string>
|
||||
<key>CFBundleGetInfoString</key>
|
||||
<string>2.5, © 001-2006 Python Software Foundation</string>
|
||||
<key>CFBundleIconFile</key>
|
||||
<string>PythonLauncher.icns</string>
|
||||
<key>CFBundleIdentifier</key>
|
||||
<string>org.python.PythonLauncher</string>
|
||||
<key>CFBundleInfoDictionaryVersion</key>
|
||||
<string>6.0</string>
|
||||
<key>CFBundleName</key>
|
||||
<string>Python Launcher</string>
|
||||
<key>CFBundlePackageType</key>
|
||||
<string>APPL</string>
|
||||
<key>CFBundleShortVersionString</key>
|
||||
<string>2.5</string>
|
||||
<key>CFBundleSignature</key>
|
||||
<string>PytL</string>
|
||||
<key>CFBundleVersion</key>
|
||||
<string>2.5</string>
|
||||
<key>NSMainNibFile</key>
|
||||
<string>MainMenu</string>
|
||||
<key>NSPrincipalClass</key>
|
||||
<string>NSApplication</string>
|
||||
</dict>
|
||||
</plist>
|
|
@ -0,0 +1,78 @@
|
|||
CC=@CC@
|
||||
LD=@CC@
|
||||
BASECFLAGS=@BASECFLAGS@
|
||||
OPT=@OPT@
|
||||
CFLAGS=$(BASECFLAGS) $(OPT)
|
||||
LDFLAGS=@LDFLAGS@
|
||||
srcdir= @srcdir@
|
||||
VERSION= @VERSION@
|
||||
UNIVERSALSDK=@UNIVERSALSDK@
|
||||
builddir= ../..
|
||||
|
||||
RUNSHARED= @RUNSHARED@
|
||||
BUILDEXE= @BUILDEXEEXT@
|
||||
BUILDPYTHON= $(builddir)/python$(BUILDEXE)
|
||||
|
||||
# Deployment target selected during configure, to be checked
|
||||
# by distutils
|
||||
MACOSX_DEPLOYMENT_TARGET=@CONFIGURE_MACOSX_DEPLOYMENT_TARGET@
|
||||
@EXPORT_MACOSX_DEPLOYMENT_TARGET@export MACOSX_DEPLOYMENT_TARGET
|
||||
|
||||
BUNDLEBULDER=$(srcdir)/../../Lib/plat-mac/bundlebuilder.py
|
||||
|
||||
PYTHONAPPSDIR=/Applications/MacPython $(VERSION)
|
||||
OBJECTS=FileSettings.o MyAppDelegate.o MyDocument.o PreferencesWindowController.o doscript.o main.o
|
||||
|
||||
all: Python\ Launcher.app
|
||||
|
||||
install: Python\ Launcher.app
|
||||
test -d "$(DESTDIR)$(PYTHONAPPSDIR)" || mkdir -p "$(DESTDIR)$(PYTHONAPPSDIR)"
|
||||
-test -d "$(DESTDIR)$(PYTHONAPPSDIR)/Python Launcher.app" && rm -r "$(DESTDIR)$(PYTHONAPPSDIR)/Python Launcher.app"
|
||||
cp -r "Python Launcher.app" "$(DESTDIR)$(PYTHONAPPSDIR)"
|
||||
touch "$(DESTDIR)$(PYTHONAPPSDIR)/Python Launcher.app"
|
||||
|
||||
clean:
|
||||
rm -f *.o "Python Launcher"
|
||||
rm -rf "Python Launcher.app"
|
||||
|
||||
Python\ Launcher.app: \
|
||||
Python\ Launcher $(srcdir)/../Icons/PythonLauncher.icns \
|
||||
$(srcdir)/../Icons/PythonSource.icns \
|
||||
$(srcdir)/../Icons/PythonCompiled.icns \
|
||||
$(srcdir)/factorySettings.plist
|
||||
rm -fr "Python Launcher.app"
|
||||
$(RUNSHARED) $(BUILDPYTHON) $(BUNDLEBULDER) \
|
||||
--builddir=. \
|
||||
--name="Python Launcher" \
|
||||
--executable="Python Launcher" \
|
||||
--iconfile=$(srcdir)/../Icons/PythonLauncher.icns \
|
||||
--bundle-id=org.python.PythonLauncher \
|
||||
--resource=$(srcdir)/../Icons/PythonSource.icns \
|
||||
--resource=$(srcdir)/../Icons/PythonCompiled.icns \
|
||||
--resource=$(srcdir)/English.lproj \
|
||||
--resource=$(srcdir)/factorySettings.plist \
|
||||
--plist=$(srcdir)/Info.plist \
|
||||
build
|
||||
find "Python Launcher.app" -name '.svn' -print0 | xargs -0 rm -r
|
||||
|
||||
|
||||
FileSettings.o: $(srcdir)/FileSettings.m
|
||||
$(CC) $(CFLAGS) -o $@ -c $(srcdir)/FileSettings.m
|
||||
|
||||
MyAppDelegate.o: $(srcdir)/MyAppDelegate.m
|
||||
$(CC) $(CFLAGS) -o $@ -c $(srcdir)/MyAppDelegate.m
|
||||
|
||||
MyDocument.o: $(srcdir)/MyDocument.m
|
||||
$(CC) $(CFLAGS) -o $@ -c $(srcdir)/MyDocument.m
|
||||
|
||||
PreferencesWindowController.o: $(srcdir)/PreferencesWindowController.m
|
||||
$(CC) $(CFLAGS) -o $@ -c $(srcdir)/PreferencesWindowController.m
|
||||
|
||||
doscript.o: $(srcdir)/doscript.m
|
||||
$(CC) $(CFLAGS) -o $@ -c $(srcdir)/doscript.m
|
||||
|
||||
main.o: $(srcdir)/main.m
|
||||
$(CC) $(CFLAGS) -o $@ -c $(srcdir)/main.m
|
||||
|
||||
Python\ Launcher: $(OBJECTS)
|
||||
$(CC) $(LDFLAGS) -o "Python Launcher" $(OBJECTS) -framework AppKit -framework Carbon
|
|
@ -0,0 +1,15 @@
|
|||
/* MyAppDelegate */
|
||||
|
||||
#import <Cocoa/Cocoa.h>
|
||||
|
||||
@interface MyAppDelegate : NSObject
|
||||
{
|
||||
BOOL initial_action_done;
|
||||
BOOL should_terminate;
|
||||
}
|
||||
- (id)init;
|
||||
- (IBAction)showPreferences:(id)sender;
|
||||
- (BOOL)shouldShowUI;
|
||||
- (BOOL)shouldTerminate;
|
||||
- (void)testFileTypeBinding;
|
||||
@end
|
|
@ -0,0 +1,96 @@
|
|||
#import "MyAppDelegate.h"
|
||||
#import "PreferencesWindowController.h"
|
||||
#import <Carbon/Carbon.h>
|
||||
#import <ApplicationServices/ApplicationServices.h>
|
||||
|
||||
@implementation MyAppDelegate
|
||||
|
||||
- (id)init
|
||||
{
|
||||
self = [super init];
|
||||
initial_action_done = NO;
|
||||
should_terminate = NO;
|
||||
return self;
|
||||
}
|
||||
|
||||
- (IBAction)showPreferences:(id)sender
|
||||
{
|
||||
[PreferencesWindowController getPreferencesWindow];
|
||||
}
|
||||
|
||||
- (void)applicationDidFinishLaunching:(NSNotification *)notification
|
||||
{
|
||||
// Test that the file mappings are correct
|
||||
[self testFileTypeBinding];
|
||||
// If we were opened because of a file drag or doubleclick
|
||||
// we've set initial_action_done in shouldShowUI
|
||||
// Otherwise we open a preferences dialog.
|
||||
if (!initial_action_done) {
|
||||
initial_action_done = YES;
|
||||
[self showPreferences: self];
|
||||
}
|
||||
}
|
||||
|
||||
- (BOOL)shouldShowUI
|
||||
{
|
||||
// if this call comes before applicationDidFinishLaunching: we
|
||||
// should terminate immedeately after starting the script.
|
||||
if (!initial_action_done)
|
||||
should_terminate = YES;
|
||||
initial_action_done = YES;
|
||||
if( GetCurrentKeyModifiers() & optionKey )
|
||||
return YES;
|
||||
return NO;
|
||||
}
|
||||
|
||||
- (BOOL)shouldTerminate
|
||||
{
|
||||
return should_terminate;
|
||||
}
|
||||
|
||||
- (BOOL)applicationShouldOpenUntitledFile:(NSApplication *)sender
|
||||
{
|
||||
return NO;
|
||||
}
|
||||
|
||||
- (void)testFileTypeBinding
|
||||
{
|
||||
NSURL *ourUrl;
|
||||
OSStatus err;
|
||||
FSRef appRef;
|
||||
NSURL *appUrl;
|
||||
static NSString *extensions[] = { @"py", @"pyw", @"pyc", NULL};
|
||||
NSString **ext_p;
|
||||
int i;
|
||||
|
||||
if ([[NSUserDefaults standardUserDefaults] boolForKey: @"SkipFileBindingTest"])
|
||||
return;
|
||||
ourUrl = [NSURL fileURLWithPath: [[NSBundle mainBundle] bundlePath]];
|
||||
for( ext_p = extensions; *ext_p; ext_p++ ) {
|
||||
err = LSGetApplicationForInfo(
|
||||
kLSUnknownType,
|
||||
kLSUnknownCreator,
|
||||
(CFStringRef)*ext_p,
|
||||
kLSRolesViewer,
|
||||
&appRef,
|
||||
(CFURLRef *)&appUrl);
|
||||
if (err || ![appUrl isEqual: ourUrl] ) {
|
||||
i = NSRunAlertPanel(@"File type binding",
|
||||
@"PythonLauncher is not the default application for all " \
|
||||
@"Python script types. You should fix this with the " \
|
||||
@"Finder's \"Get Info\" command.\n\n" \
|
||||
@"See \"Changing the application that opens a file\" in " \
|
||||
@"Mac Help for details.",
|
||||
@"OK",
|
||||
@"Don't show this warning again",
|
||||
NULL);
|
||||
if ( i == 0 ) { // Don't show again
|
||||
[[NSUserDefaults standardUserDefaults]
|
||||
setObject:@"YES" forKey:@"SkipFileBindingTest"];
|
||||
}
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@end
|
|
@ -0,0 +1,41 @@
|
|||
//
|
||||
// MyDocument.h
|
||||
// PythonLauncher
|
||||
//
|
||||
// Created by Jack Jansen on Fri Jul 19 2002.
|
||||
// Copyright (c) 2002 __MyCompanyName__. All rights reserved.
|
||||
//
|
||||
|
||||
|
||||
#import <Cocoa/Cocoa.h>
|
||||
|
||||
#import "FileSettings.h"
|
||||
|
||||
@interface MyDocument : NSDocument <FileSettingsSource>
|
||||
{
|
||||
IBOutlet NSTextField *interpreter;
|
||||
IBOutlet NSButton *honourhashbang;
|
||||
IBOutlet NSButton *debug;
|
||||
IBOutlet NSButton *verbose;
|
||||
IBOutlet NSButton *inspect;
|
||||
IBOutlet NSButton *optimize;
|
||||
IBOutlet NSButton *nosite;
|
||||
IBOutlet NSButton *tabs;
|
||||
IBOutlet NSTextField *others;
|
||||
IBOutlet NSButton *with_terminal;
|
||||
IBOutlet NSTextField *scriptargs;
|
||||
IBOutlet NSTextField *commandline;
|
||||
|
||||
NSString *script;
|
||||
NSString *filetype;
|
||||
FileSettings *settings;
|
||||
}
|
||||
|
||||
- (IBAction)do_run:(id)sender;
|
||||
- (IBAction)do_cancel:(id)sender;
|
||||
- (IBAction)do_reset:(id)sender;
|
||||
- (IBAction)do_apply:(id)sender;
|
||||
|
||||
- (void)controlTextDidChange:(NSNotification *)aNotification;
|
||||
|
||||
@end
|
|
@ -0,0 +1,175 @@
|
|||
//
|
||||
// MyDocument.m
|
||||
// PythonLauncher
|
||||
//
|
||||
// Created by Jack Jansen on Fri Jul 19 2002.
|
||||
// Copyright (c) 2002 __MyCompanyName__. All rights reserved.
|
||||
//
|
||||
|
||||
#import "MyDocument.h"
|
||||
#import "MyAppDelegate.h"
|
||||
#import "doscript.h"
|
||||
|
||||
@implementation MyDocument
|
||||
|
||||
- (id)init
|
||||
{
|
||||
self = [super init];
|
||||
if (self) {
|
||||
|
||||
// Add your subclass-specific initialization here.
|
||||
// If an error occurs here, send a [self dealloc] message and return nil.
|
||||
script = [@"<no script>.py" retain];
|
||||
filetype = [@"Python Script" retain];
|
||||
settings = NULL;
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
||||
- (NSString *)windowNibName
|
||||
{
|
||||
// Override returning the nib file name of the document
|
||||
// If you need to use a subclass of NSWindowController or if your document supports multiple NSWindowControllers, you should remove this method and override -makeWindowControllers instead.
|
||||
return @"MyDocument";
|
||||
}
|
||||
|
||||
- (void)close
|
||||
{
|
||||
NSApplication *app = [NSApplication sharedApplication];
|
||||
[super close];
|
||||
if ([[app delegate] shouldTerminate])
|
||||
[app terminate: self];
|
||||
}
|
||||
|
||||
- (void)load_defaults
|
||||
{
|
||||
// if (settings) [settings release];
|
||||
settings = [FileSettings newSettingsForFileType: filetype];
|
||||
}
|
||||
|
||||
- (void)update_display
|
||||
{
|
||||
// [[self window] setTitle: script];
|
||||
|
||||
[interpreter setStringValue: [settings interpreter]];
|
||||
[honourhashbang setState: [settings honourhashbang]];
|
||||
[debug setState: [settings debug]];
|
||||
[verbose setState: [settings verbose]];
|
||||
[inspect setState: [settings inspect]];
|
||||
[optimize setState: [settings optimize]];
|
||||
[nosite setState: [settings nosite]];
|
||||
[tabs setState: [settings tabs]];
|
||||
[others setStringValue: [settings others]];
|
||||
[scriptargs setStringValue: [settings scriptargs]];
|
||||
[with_terminal setState: [settings with_terminal]];
|
||||
|
||||
[commandline setStringValue: [settings commandLineForScript: script]];
|
||||
}
|
||||
|
||||
- (void)update_settings
|
||||
{
|
||||
[settings updateFromSource: self];
|
||||
}
|
||||
|
||||
- (BOOL)run
|
||||
{
|
||||
const char *cmdline;
|
||||
int sts;
|
||||
|
||||
cmdline = [[settings commandLineForScript: script] cString];
|
||||
if ([settings with_terminal]) {
|
||||
sts = doscript(cmdline);
|
||||
} else {
|
||||
sts = system(cmdline);
|
||||
}
|
||||
if (sts) {
|
||||
NSLog(@"Exit status: %d\n", sts);
|
||||
return NO;
|
||||
}
|
||||
return YES;
|
||||
}
|
||||
|
||||
- (void)windowControllerDidLoadNib:(NSWindowController *) aController
|
||||
{
|
||||
[super windowControllerDidLoadNib:aController];
|
||||
// Add any code here that need to be executed once the windowController has loaded the document's window.
|
||||
[self load_defaults];
|
||||
[self update_display];
|
||||
}
|
||||
|
||||
- (NSData *)dataRepresentationOfType:(NSString *)aType
|
||||
{
|
||||
// Insert code here to write your document from the given data. You can also choose to override -fileWrapperRepresentationOfType: or -writeToFile:ofType: instead.
|
||||
return nil;
|
||||
}
|
||||
|
||||
- (BOOL)readFromFile:(NSString *)fileName ofType:(NSString *)type;
|
||||
{
|
||||
// Insert code here to read your document from the given data. You can also choose to override -loadFileWrapperRepresentation:ofType: or -readFromFile:ofType: instead.
|
||||
BOOL show_ui;
|
||||
|
||||
// ask the app delegate whether we should show the UI or not.
|
||||
show_ui = [[[NSApplication sharedApplication] delegate] shouldShowUI];
|
||||
[script release];
|
||||
script = [fileName retain];
|
||||
[filetype release];
|
||||
filetype = [type retain];
|
||||
// if (settings) [settings release];
|
||||
settings = [FileSettings newSettingsForFileType: filetype];
|
||||
if (show_ui) {
|
||||
[self update_display];
|
||||
return YES;
|
||||
} else {
|
||||
[self run];
|
||||
[self close];
|
||||
return NO;
|
||||
}
|
||||
}
|
||||
|
||||
- (IBAction)do_run:(id)sender
|
||||
{
|
||||
[self update_settings];
|
||||
[self update_display];
|
||||
if ([self run])
|
||||
[self close];
|
||||
}
|
||||
|
||||
- (IBAction)do_cancel:(id)sender
|
||||
{
|
||||
[self close];
|
||||
}
|
||||
|
||||
|
||||
- (IBAction)do_reset:(id)sender
|
||||
{
|
||||
[settings reset];
|
||||
[self update_display];
|
||||
}
|
||||
|
||||
- (IBAction)do_apply:(id)sender
|
||||
{
|
||||
[self update_settings];
|
||||
[self update_display];
|
||||
}
|
||||
|
||||
// FileSettingsSource protocol
|
||||
- (NSString *) interpreter { return [interpreter stringValue];};
|
||||
- (BOOL) honourhashbang { return [honourhashbang state];};
|
||||
- (BOOL) debug { return [debug state];};
|
||||
- (BOOL) verbose { return [verbose state];};
|
||||
- (BOOL) inspect { return [inspect state];};
|
||||
- (BOOL) optimize { return [optimize state];};
|
||||
- (BOOL) nosite { return [nosite state];};
|
||||
- (BOOL) tabs { return [tabs state];};
|
||||
- (NSString *) others { return [others stringValue];};
|
||||
- (NSString *) scriptargs { return [scriptargs stringValue];};
|
||||
- (BOOL) with_terminal { return [with_terminal state];};
|
||||
|
||||
// Delegates
|
||||
- (void)controlTextDidChange:(NSNotification *)aNotification
|
||||
{
|
||||
[self update_settings];
|
||||
[self update_display];
|
||||
};
|
||||
|
||||
@end
|
|
@ -0,0 +1,38 @@
|
|||
/* PreferencesWindowController */
|
||||
|
||||
#import <Cocoa/Cocoa.h>
|
||||
|
||||
#import "FileSettings.h"
|
||||
|
||||
@interface PreferencesWindowController : NSWindowController <FileSettingsSource>
|
||||
{
|
||||
IBOutlet NSPopUpButton *filetype;
|
||||
IBOutlet NSComboBox *interpreter;
|
||||
IBOutlet NSButton *honourhashbang;
|
||||
IBOutlet NSButton *debug;
|
||||
IBOutlet NSButton *verbose;
|
||||
IBOutlet NSButton *inspect;
|
||||
IBOutlet NSButton *optimize;
|
||||
IBOutlet NSButton *nosite;
|
||||
IBOutlet NSButton *tabs;
|
||||
IBOutlet NSTextField *others;
|
||||
IBOutlet NSButton *with_terminal;
|
||||
IBOutlet NSTextField *commandline;
|
||||
|
||||
FileSettings *settings;
|
||||
}
|
||||
|
||||
+ getPreferencesWindow;
|
||||
|
||||
- (IBAction)do_reset:(id)sender;
|
||||
- (IBAction)do_apply:(id)sender;
|
||||
- (IBAction)do_filetype:(id)sender;
|
||||
|
||||
- (void)controlTextDidChange:(NSNotification *)aNotification;
|
||||
|
||||
- (unsigned int)comboBox:(NSComboBox *)aComboBox indexOfItemWithStringValue:(NSString *)aString;
|
||||
- (id)comboBox:(NSComboBox *)aComboBox objectValueForItemAtIndex:(int)index;
|
||||
- (int)numberOfItemsInComboBox:(NSComboBox *)aComboBox;
|
||||
|
||||
|
||||
@end
|
|
@ -0,0 +1,121 @@
|
|||
#import "PreferencesWindowController.h"
|
||||
|
||||
@implementation PreferencesWindowController
|
||||
|
||||
+ getPreferencesWindow
|
||||
{
|
||||
static PreferencesWindowController *_singleton;
|
||||
|
||||
if (!_singleton)
|
||||
_singleton = [[PreferencesWindowController alloc] init];
|
||||
[_singleton showWindow: _singleton];
|
||||
return _singleton;
|
||||
}
|
||||
|
||||
- (id) init
|
||||
{
|
||||
self = [self initWithWindowNibName: @"PreferenceWindow"];
|
||||
return self;
|
||||
}
|
||||
|
||||
- (void)load_defaults
|
||||
{
|
||||
NSString *title = [filetype titleOfSelectedItem];
|
||||
|
||||
settings = [FileSettings getDefaultsForFileType: title];
|
||||
}
|
||||
|
||||
- (void)update_display
|
||||
{
|
||||
// [[self window] setTitle: script];
|
||||
|
||||
[interpreter reloadData];
|
||||
[interpreter setStringValue: [settings interpreter]];
|
||||
[honourhashbang setState: [settings honourhashbang]];
|
||||
[debug setState: [settings debug]];
|
||||
[verbose setState: [settings verbose]];
|
||||
[inspect setState: [settings inspect]];
|
||||
[optimize setState: [settings optimize]];
|
||||
[nosite setState: [settings nosite]];
|
||||
[tabs setState: [settings tabs]];
|
||||
[others setStringValue: [settings others]];
|
||||
[with_terminal setState: [settings with_terminal]];
|
||||
// Not scriptargs, it isn't for preferences
|
||||
|
||||
[commandline setStringValue: [settings commandLineForScript: @"<your script here>"]];
|
||||
}
|
||||
|
||||
- (void) windowDidLoad
|
||||
{
|
||||
[super windowDidLoad];
|
||||
[self load_defaults];
|
||||
[self update_display];
|
||||
}
|
||||
|
||||
- (void)update_settings
|
||||
{
|
||||
[settings updateFromSource: self];
|
||||
}
|
||||
|
||||
- (IBAction)do_filetype:(id)sender
|
||||
{
|
||||
[self load_defaults];
|
||||
[self update_display];
|
||||
}
|
||||
|
||||
- (IBAction)do_reset:(id)sender
|
||||
{
|
||||
[settings reset];
|
||||
[self update_display];
|
||||
}
|
||||
|
||||
- (IBAction)do_apply:(id)sender
|
||||
{
|
||||
[self update_settings];
|
||||
[self update_display];
|
||||
}
|
||||
|
||||
// FileSettingsSource protocol
|
||||
- (NSString *) interpreter { return [interpreter stringValue];};
|
||||
- (BOOL) honourhashbang { return [honourhashbang state]; };
|
||||
- (BOOL) debug { return [debug state];};
|
||||
- (BOOL) verbose { return [verbose state];};
|
||||
- (BOOL) inspect { return [inspect state];};
|
||||
- (BOOL) optimize { return [optimize state];};
|
||||
- (BOOL) nosite { return [nosite state];};
|
||||
- (BOOL) tabs { return [tabs state];};
|
||||
- (NSString *) others { return [others stringValue];};
|
||||
- (BOOL) with_terminal { return [with_terminal state];};
|
||||
- (NSString *) scriptargs { return @"";};
|
||||
|
||||
// Delegates
|
||||
- (void)controlTextDidChange:(NSNotification *)aNotification
|
||||
{
|
||||
[self update_settings];
|
||||
[self update_display];
|
||||
};
|
||||
|
||||
// NSComboBoxDataSource protocol
|
||||
- (unsigned int)comboBox:(NSComboBox *)aComboBox indexOfItemWithStringValue:(NSString *)aString
|
||||
{
|
||||
NSArray *interp_list = [settings interpreters];
|
||||
unsigned int rv = [interp_list indexOfObjectIdenticalTo: aString];
|
||||
return rv;
|
||||
}
|
||||
|
||||
- (id)comboBox:(NSComboBox *)aComboBox objectValueForItemAtIndex:(int)index
|
||||
{
|
||||
NSArray *interp_list = [settings interpreters];
|
||||
id rv = [interp_list objectAtIndex: index];
|
||||
return rv;
|
||||
}
|
||||
|
||||
- (int)numberOfItemsInComboBox:(NSComboBox *)aComboBox
|
||||
{
|
||||
NSArray *interp_list = [settings interpreters];
|
||||
int rv = [interp_list count];
|
||||
return rv;
|
||||
}
|
||||
|
||||
|
||||
@end
|
|
@ -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 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;
|
||||
}
|
|
@ -0,0 +1,87 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>Python GUI Script</key>
|
||||
<dict>
|
||||
<key>debug</key>
|
||||
<false/>
|
||||
<key>inspect</key>
|
||||
<false/>
|
||||
<key>interpreter_list</key>
|
||||
<array>
|
||||
<string>/usr/local/bin/pythonw</string>
|
||||
<string>/usr/bin/pythonw</string>
|
||||
<string>/sw/bin/pythonw</string>
|
||||
</array>
|
||||
<key>honourhashbang</key>
|
||||
<false/>
|
||||
<key>nosite</key>
|
||||
<false/>
|
||||
<key>optimize</key>
|
||||
<false/>
|
||||
<key>others</key>
|
||||
<string></string>
|
||||
<key>verbose</key>
|
||||
<false/>
|
||||
<key>with_terminal</key>
|
||||
<false/>
|
||||
</dict>
|
||||
<key>Python Script</key>
|
||||
<dict>
|
||||
<key>debug</key>
|
||||
<false/>
|
||||
<key>inspect</key>
|
||||
<false/>
|
||||
<key>interpreter_list</key>
|
||||
<array>
|
||||
<string>/usr/local/bin/pythonw</string>
|
||||
<string>/usr/local/bin/python</string>
|
||||
<string>/usr/bin/pythonw</string>
|
||||
<string>/usr/bin/python</string>
|
||||
<string>/sw/bin/pythonw</string>
|
||||
<string>/sw/bin/python</string>
|
||||
</array>
|
||||
<key>honourhashbang</key>
|
||||
<false/>
|
||||
<key>nosite</key>
|
||||
<false/>
|
||||
<key>optimize</key>
|
||||
<false/>
|
||||
<key>others</key>
|
||||
<string></string>
|
||||
<key>verbose</key>
|
||||
<false/>
|
||||
<key>with_terminal</key>
|
||||
<true/>
|
||||
</dict>
|
||||
<key>Python Bytecode Document</key>
|
||||
<dict>
|
||||
<key>debug</key>
|
||||
<false/>
|
||||
<key>inspect</key>
|
||||
<false/>
|
||||
<key>interpreter_list</key>
|
||||
<array>
|
||||
<string>/usr/local/bin/pythonw</string>
|
||||
<string>/usr/local/bin/python</string>
|
||||
<string>/usr/bin/pythonw</string>
|
||||
<string>/usr/bin/python</string>
|
||||
<string>/sw/bin/pythonw</string>
|
||||
<string>/sw/bin/python</string>
|
||||
</array>
|
||||
<key>honourhashbang</key>
|
||||
<false/>
|
||||
<key>nosite</key>
|
||||
<false/>
|
||||
<key>optimize</key>
|
||||
<false/>
|
||||
<key>others</key>
|
||||
<string></string>
|
||||
<key>verbose</key>
|
||||
<false/>
|
||||
<key>with_terminal</key>
|
||||
<true/>
|
||||
</dict>
|
||||
</dict>
|
||||
</plist>
|
|
@ -0,0 +1,17 @@
|
|||
//
|
||||
// main.m
|
||||
// PythonLauncher
|
||||
//
|
||||
// Created by Jack Jansen on Fri Jul 19 2002.
|
||||
// Copyright (c) 2002 __MyCompanyName__. All rights reserved.
|
||||
//
|
||||
|
||||
#import <Cocoa/Cocoa.h>
|
||||
#include <unistd.h>
|
||||
|
||||
int main(int argc, const char *argv[])
|
||||
{
|
||||
char *home = getenv("HOME");
|
||||
if (home) chdir(home);
|
||||
return NSApplicationMain(argc, argv);
|
||||
}
|
Loading…
Reference in New Issue