blob: cc63e1d4420104479b9a4055cf4e3b81dc2f7760 [file] [log] [blame]
Jack Jansen7cc57351998-08-18 14:54:11 +00001"""PythonSlave.py
2An application that responds to three types of apple event:
3 'pyth'/'EXEC': execute direct parameter as Python
4 'aevt', 'quit': quit
5 'aevt', 'odoc': perform python scripts
6
7Copyright © 1996, Just van Rossum, Letterror
8"""
9
10__version__ = "0.1.3"
11
12import FrameWork
13import sys
14import traceback
15import aetools
16import string
17import AE
18import EasyDialogs
19import os
20import Qd
21from Types import *
22from Events import charCodeMask, cmdKey
23import MacOS
24import Evt
25
26def dummyfunc(): pass
27
28modulefilename = dummyfunc.func_code.co_filename
29
30def Interact(timeout = 50000000): # timeout after 10 days...
31 AE.AEInteractWithUser(timeout)
32
33
34class PythonSlave(FrameWork.Application):
35 def __init__(self):
36 FrameWork.Application.__init__(self)
37 AE.AEInstallEventHandler('pyth', 'EXEC', ExecHandler)
38 AE.AEInstallEventHandler('aevt', 'quit', QuitHandler)
39 AE.AEInstallEventHandler('aevt', 'odoc', OpenDocumentHandler)
40
41 def makeusermenus(self):
42 self.filemenu = m = FrameWork.Menu(self.menubar, "File")
43 self._quititem = FrameWork.MenuItem(m, "Quit", "Q", self._quit)
44
45 def do_kHighLevelEvent(self, event):
46 (what, message, when, where, modifiers) = event
47 try:
48 AE.AEProcessAppleEvent(event)
49 except AE.Error, detail:
50 print "Apple Event was not handled, error:", detail
51
52 def do_key(self, event):
53 (what, message, when, where, modifiers) = event
54 c = chr(message & charCodeMask)
55 if modifiers & cmdKey and c == '.':
56 return
57 FrameWork.Application.do_key(self, event)
58
59 def idle(self, event):
60 Qd.InitCursor()
61
62 def quit(self, *args):
63 raise self
64
65 def getabouttext(self):
66 return "About PythonSlaveŠ"
67
68 def do_about(self, id, item, window, event):
69 EasyDialogs.Message("PythonSlave " + __version__ + "\rCopyright © 1996, Letterror, JvR")
70
71
72def ExecHandler(theAppleEvent, theReply):
73 parameters, args = aetools.unpackevent(theAppleEvent)
74 if parameters.has_key('----'):
75 if parameters.has_key('NAME'):
76 print '--- executing "' + parameters['NAME'] + '" ---'
77 else:
78 print '--- executing "<unknown>" ---'
79 stuff = parameters['----']
80 MyExec(stuff + "\n") # execute input
81 print '--- done ---'
82 return 0
83
84def MyExec(stuff):
85 stuff = string.splitfields(stuff, '\r') # convert return chars
86 stuff = string.joinfields(stuff, '\n') # to newline chars
87 Interact()
88 saveyield = MacOS.EnableAppswitch(1)
89 try:
90 exec stuff in {}
91 except:
92 MacOS.EnableAppswitch(saveyield)
93 traceback.print_exc()
94 MacOS.EnableAppswitch(saveyield)
95
96def OpenDocumentHandler(theAppleEvent, theReply):
97 parameters, args = aetools.unpackevent(theAppleEvent)
98 docs = parameters['----']
99 if type(docs) <> ListType:
100 docs = [docs]
101 for doc in docs:
102 fss, a = doc.Resolve()
103 path = fss.as_pathname()
104 if path <> modulefilename:
105 MyExecFile(path)
106 return 0
107
108def MyExecFile(path):
109 saveyield = MacOS.EnableAppswitch(1)
110 savewd = os.getcwd()
111 os.chdir(os.path.split(path)[0])
112 print '--- Executing file "' + os.path.split(path)[1] + '"'
113 try:
114 execfile(path, {"__name__": "__main__"})
115 except:
116 traceback.print_exc()
117 MacOS.EnableAppswitch(saveyield)
118 MacOS.EnableAppswitch(saveyield)
119 os.chdir(savewd)
120 print "--- done ---"
121
122def QuitHandler(theAppleEvent, theReply):
123 slave.quit()
124 return 0
125
126
127slave = PythonSlave()
128print "PythonSlave", __version__, "ready."
129slave.mainloop()