summaryrefslogtreecommitdiffstats
path: root/Mac/Contrib/BBPy/PythonSlave.py
diff options
context:
space:
mode:
Diffstat (limited to 'Mac/Contrib/BBPy/PythonSlave.py')
-rw-r--r--Mac/Contrib/BBPy/PythonSlave.py129
1 files changed, 129 insertions, 0 deletions
diff --git a/Mac/Contrib/BBPy/PythonSlave.py b/Mac/Contrib/BBPy/PythonSlave.py
new file mode 100644
index 0000000..cc63e1d
--- /dev/null
+++ b/Mac/Contrib/BBPy/PythonSlave.py
@@ -0,0 +1,129 @@
+"""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
+import AE
+import EasyDialogs
+import os
+import Qd
+from Types import *
+from Events import charCodeMask, cmdKey
+import MacOS
+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 "<unknown>" ---'
+ 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()