"""PythonSlave.py An application that responds to three types of apple event: 'pyth'/'EXEC': execute direct parameter as Python 'aevt', 'quit': quit 'aevt', 'odoc': perform python scripts Copyright © 1996, Just van Rossum, Letterror """ __version__ = "0.1.3" import FrameWork import sys import traceback import aetools import string from Carbon import AE import EasyDialogs import os from Carbon import Qd from types import * from Carbon.Events import charCodeMask, cmdKey import MacOS from Carbon import Evt def dummyfunc(): pass modulefilename = dummyfunc.func_code.co_filename def Interact(timeout = 50000000): # timeout after 10 days... AE.AEInteractWithUser(timeout) class PythonSlave(FrameWork.Application): def __init__(self): FrameWork.Application.__init__(self) AE.AEInstallEventHandler('pyth', 'EXEC', ExecHandler) AE.AEInstallEventHandler('aevt', 'quit', QuitHandler) AE.AEInstallEventHandler('aevt', 'odoc', OpenDocumentHandler) def makeusermenus(self): self.filemenu = m = FrameWork.Menu(self.menubar, "File") self._quititem = FrameWork.MenuItem(m, "Quit", "Q", self._quit) def do_kHighLevelEvent(self, event): (what, message, when, where, modifiers) = event try: AE.AEProcessAppleEvent(event) except AE.Error, detail: print "Apple Event was not handled, error:", detail def do_key(self, event): (what, message, when, where, modifiers) = event c = chr(message & charCodeMask) if modifiers & cmdKey and c == '.': return FrameWork.Application.do_key(self, event) def idle(self, event): Qd.InitCursor() def quit(self, *args): raise self def getabouttext(self): return "About PythonSlaveƒ" def do_about(self, id, item, window, event): EasyDialogs.Message("PythonSlave " + __version__ + "\rCopyright © 1996, Letterror, JvR") def ExecHandler(theAppleEvent, theReply): parameters, args = aetools.unpackevent(theAppleEvent) if parameters.has_key('----'): if parameters.has_key('NAME'): print '--- executing "' + parameters['NAME'] + '" ---' else: print '--- executing "" ---' stuff = parameters['----'] MyExec(stuff + "\n") # execute input print '--- done ---' return 0 def MyExec(stuff): stuff = string.splitfields(stuff, '\r') # convert return chars stuff = string.joinfields(stuff, '\n') # to newline chars Interact() saveyield = MacOS.EnableAppswitch(1) try: exec stuff in {} except: MacOS.EnableAppswitch(saveyield) traceback.print_exc() MacOS.EnableAppswitch(saveyield) def OpenDocumentHandler(theAppleEvent, theReply): parameters, args = aetools.unpackevent(theAppleEvent) docs = parameters['----'] if type(docs) <> ListType: docs = [docs] for doc in docs: fss, a = doc.Resolve() path = fss.as_pathname() if path <> modulefilename: MyExecFile(path) return 0 def MyExecFile(path): saveyield = MacOS.EnableAppswitch(1) savewd = os.getcwd() os.chdir(os.path.split(path)[0]) print '--- Executing file "' + os.path.split(path)[1] + '"' try: execfile(path, {"__name__": "__main__"}) except: traceback.print_exc() MacOS.EnableAppswitch(saveyield) MacOS.EnableAppswitch(saveyield) os.chdir(savewd) print "--- done ---" def QuitHandler(theAppleEvent, theReply): slave.quit() return 0 slave = PythonSlave() print "PythonSlave", __version__, "ready." slave.mainloop()