diff options
author | Ronald Oussoren <ronaldoussoren@mac.com> | 2006-06-07 18:58:01 (GMT) |
---|---|---|
committer | Ronald Oussoren <ronaldoussoren@mac.com> | 2006-06-07 18:58:01 (GMT) |
commit | c629be8a1e77786e3a839ed4784c7b2b36c6344f (patch) | |
tree | bcb61c5bdb2c89bb5028cddeb62646461f33eb46 /Mac | |
parent | 8ec9f866c08f022e2a202c32cf04d0c97822c55e (diff) | |
download | cpython-c629be8a1e77786e3a839ed4784c7b2b36c6344f.zip cpython-c629be8a1e77786e3a839ed4784c7b2b36c6344f.tar.gz cpython-c629be8a1e77786e3a839ed4784c7b2b36c6344f.tar.bz2 |
Move Mac/OSX/PythonLauncher one level up
Diffstat (limited to 'Mac')
24 files changed, 1372 insertions, 0 deletions
diff --git a/Mac/PythonLauncher/English.lproj/Credits.rtf b/Mac/PythonLauncher/English.lproj/Credits.rtf new file mode 100644 index 0000000..930ca22 --- /dev/null +++ b/Mac/PythonLauncher/English.lproj/Credits.rtf @@ -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\ +}
\ No newline at end of file diff --git a/Mac/PythonLauncher/English.lproj/MainMenu.nib/classes.nib b/Mac/PythonLauncher/English.lproj/MainMenu.nib/classes.nib new file mode 100644 index 0000000..47b40ab --- /dev/null +++ b/Mac/PythonLauncher/English.lproj/MainMenu.nib/classes.nib @@ -0,0 +1,12 @@ +{ + IBClasses = ( + {CLASS = FirstResponder; LANGUAGE = ObjC; SUPERCLASS = NSObject; }, + { + ACTIONS = {showPreferences = id; }; + CLASS = MyAppDelegate; + LANGUAGE = ObjC; + SUPERCLASS = NSObject; + } + ); + IBVersion = 1; +}
\ No newline at end of file diff --git a/Mac/PythonLauncher/English.lproj/MainMenu.nib/info.nib b/Mac/PythonLauncher/English.lproj/MainMenu.nib/info.nib new file mode 100644 index 0000000..b96759a --- /dev/null +++ b/Mac/PythonLauncher/English.lproj/MainMenu.nib/info.nib @@ -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> diff --git a/Mac/PythonLauncher/English.lproj/MainMenu.nib/objects.nib b/Mac/PythonLauncher/English.lproj/MainMenu.nib/objects.nib Binary files differnew file mode 100644 index 0000000..532a5c8 --- /dev/null +++ b/Mac/PythonLauncher/English.lproj/MainMenu.nib/objects.nib diff --git a/Mac/PythonLauncher/English.lproj/MyDocument.nib/classes.nib b/Mac/PythonLauncher/English.lproj/MyDocument.nib/classes.nib new file mode 100644 index 0000000..bcdc0cd --- /dev/null +++ b/Mac/PythonLauncher/English.lproj/MyDocument.nib/classes.nib @@ -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; +}
\ No newline at end of file diff --git a/Mac/PythonLauncher/English.lproj/MyDocument.nib/info.nib b/Mac/PythonLauncher/English.lproj/MyDocument.nib/info.nib new file mode 100644 index 0000000..e258c72 --- /dev/null +++ b/Mac/PythonLauncher/English.lproj/MyDocument.nib/info.nib @@ -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> diff --git a/Mac/PythonLauncher/English.lproj/MyDocument.nib/objects.nib b/Mac/PythonLauncher/English.lproj/MyDocument.nib/objects.nib Binary files differnew file mode 100644 index 0000000..0473a31 --- /dev/null +++ b/Mac/PythonLauncher/English.lproj/MyDocument.nib/objects.nib diff --git a/Mac/PythonLauncher/English.lproj/PreferenceWindow.nib/classes.nib b/Mac/PythonLauncher/English.lproj/PreferenceWindow.nib/classes.nib new file mode 100644 index 0000000..467aa8b --- /dev/null +++ b/Mac/PythonLauncher/English.lproj/PreferenceWindow.nib/classes.nib @@ -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; +}
\ No newline at end of file diff --git a/Mac/PythonLauncher/English.lproj/PreferenceWindow.nib/info.nib b/Mac/PythonLauncher/English.lproj/PreferenceWindow.nib/info.nib new file mode 100644 index 0000000..bc558f7 --- /dev/null +++ b/Mac/PythonLauncher/English.lproj/PreferenceWindow.nib/info.nib @@ -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> diff --git a/Mac/PythonLauncher/English.lproj/PreferenceWindow.nib/objects.nib b/Mac/PythonLauncher/English.lproj/PreferenceWindow.nib/objects.nib Binary files differnew file mode 100644 index 0000000..3dfed33 --- /dev/null +++ b/Mac/PythonLauncher/English.lproj/PreferenceWindow.nib/objects.nib diff --git a/Mac/PythonLauncher/FileSettings.h b/Mac/PythonLauncher/FileSettings.h new file mode 100755 index 0000000..d807bae --- /dev/null +++ b/Mac/PythonLauncher/FileSettings.h @@ -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 diff --git a/Mac/PythonLauncher/FileSettings.m b/Mac/PythonLauncher/FileSettings.m new file mode 100755 index 0000000..fc3937b --- /dev/null +++ b/Mac/PythonLauncher/FileSettings.m @@ -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 diff --git a/Mac/PythonLauncher/Info.plist b/Mac/PythonLauncher/Info.plist new file mode 100644 index 0000000..1dd795f --- /dev/null +++ b/Mac/PythonLauncher/Info.plist @@ -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> diff --git a/Mac/PythonLauncher/Makefile.in b/Mac/PythonLauncher/Makefile.in new file mode 100644 index 0000000..19763a6 --- /dev/null +++ b/Mac/PythonLauncher/Makefile.in @@ -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 diff --git a/Mac/PythonLauncher/MyAppDelegate.h b/Mac/PythonLauncher/MyAppDelegate.h new file mode 100644 index 0000000..097b541 --- /dev/null +++ b/Mac/PythonLauncher/MyAppDelegate.h @@ -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 diff --git a/Mac/PythonLauncher/MyAppDelegate.m b/Mac/PythonLauncher/MyAppDelegate.m new file mode 100644 index 0000000..a5ba751 --- /dev/null +++ b/Mac/PythonLauncher/MyAppDelegate.m @@ -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 diff --git a/Mac/PythonLauncher/MyDocument.h b/Mac/PythonLauncher/MyDocument.h new file mode 100755 index 0000000..00c1bae --- /dev/null +++ b/Mac/PythonLauncher/MyDocument.h @@ -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 diff --git a/Mac/PythonLauncher/MyDocument.m b/Mac/PythonLauncher/MyDocument.m new file mode 100755 index 0000000..5acc2dc --- /dev/null +++ b/Mac/PythonLauncher/MyDocument.m @@ -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 diff --git a/Mac/PythonLauncher/PreferencesWindowController.h b/Mac/PythonLauncher/PreferencesWindowController.h new file mode 100644 index 0000000..6346996 --- /dev/null +++ b/Mac/PythonLauncher/PreferencesWindowController.h @@ -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 diff --git a/Mac/PythonLauncher/PreferencesWindowController.m b/Mac/PythonLauncher/PreferencesWindowController.m new file mode 100644 index 0000000..311c375 --- /dev/null +++ b/Mac/PythonLauncher/PreferencesWindowController.m @@ -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 diff --git a/Mac/PythonLauncher/doscript.h b/Mac/PythonLauncher/doscript.h new file mode 100644 index 0000000..eef0b56 --- /dev/null +++ b/Mac/PythonLauncher/doscript.h @@ -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/PythonLauncher/doscript.m b/Mac/PythonLauncher/doscript.m new file mode 100644 index 0000000..3e4e223 --- /dev/null +++ b/Mac/PythonLauncher/doscript.m @@ -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; +} diff --git a/Mac/PythonLauncher/factorySettings.plist b/Mac/PythonLauncher/factorySettings.plist new file mode 100644 index 0000000..1202421 --- /dev/null +++ b/Mac/PythonLauncher/factorySettings.plist @@ -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> diff --git a/Mac/PythonLauncher/main.m b/Mac/PythonLauncher/main.m new file mode 100755 index 0000000..6841433 --- /dev/null +++ b/Mac/PythonLauncher/main.m @@ -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); +} |