|
9011
|
1 """PythonSlave.py
|
|
|
2 An 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
|
|
|
7 Copyright © 1996, Just van Rossum, Letterror
|
|
|
8 """
|
|
|
9
|
|
|
10 __version__ = "0.1.3"
|
|
|
11
|
|
|
12 import FrameWork
|
|
|
13 import sys
|
|
|
14 import traceback
|
|
|
15 import aetools
|
|
|
16 import string
|
|
|
17 import AE
|
|
|
18 import EasyDialogs
|
|
|
19 import os
|
|
|
20 import Qd
|
|
|
21 from Types import *
|
|
|
22 from Events import charCodeMask, cmdKey
|
|
|
23 import MacOS
|
|
|
24 import Evt
|
|
|
25
|
|
|
26 def dummyfunc(): pass
|
|
|
27
|
|
|
28 modulefilename = dummyfunc.func_code.co_filename
|
|
|
29
|
|
|
30 def Interact(timeout = 50000000): # timeout after 10 days...
|
|
|
31 AE.AEInteractWithUser(timeout)
|
|
|
32
|
|
|
33
|
|
|
34 class 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
|
|
|
72 def 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
|
|
|
84 def 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
|
|
|
96 def 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
|
|
|
108 def 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
|
|
|
122 def QuitHandler(theAppleEvent, theReply):
|
|
|
123 slave.quit()
|
|
|
124 return 0
|
|
|
125
|
|
|
126
|
|
|
127 slave = PythonSlave()
|
|
|
128 print "PythonSlave", __version__, "ready."
|
|
|
129 slave.mainloop()
|