blob: a372bee709ccffb7e2cf4559edf63c6aeb26cab3 [file] [log] [blame]
Jack Jansenbb653771996-03-18 14:21:15 +00001"""AEservertest - Test AppleEvent server interface
2
3(adapted from Guido's 'echo' program).
4
5Build an applet from this source, and include the aete resource that you
6want to test. Use the AEservertest script to try things.
7"""
8
9import addpack
10addpack.addpack('Tools')
11addpack.addpack('bgen')
12addpack.addpack('ae')
13addpack.addpack('evt')
14#addpack.addpack('menu')
15addpack.addpack('win')
16
17import sys
18sys.stdout = sys.stderr
19import traceback
20import MacOS
21import AE
22from AppleEvents import *
23import Evt
24from Events import *
25import Menu
26import Dlg
27import Win
28from Windows import *
29import Qd
30import macfs
31
32import aetools
33import EasyDialogs
34
35kHighLevelEvent = 23 # Not defined anywhere for Python yet?
36
37Quit='Quit'
38
39def mymessage(str):
40 err = AE.AEInteractWithUser(kAEDefaultTimeout)
41 if err:
42 print str
43 EasyDialogs.Message(str)
44
45def myaskstring(str, default=''):
46 err = AE.AEInteractWithUser(kAEDefaultTimeout)
47 if err:
48 return default
49 return EasyDialogs.AskString(str, default)
50
51def main():
52 echo = EchoServer()
53 yield = MacOS.EnableAppswitch(-1) # Disable Python's own "event handling"
54 try:
55 try:
56 echo.mainloop(everyEvent, 0)
57 except Quit:
58 pass
59 finally:
60 MacOS.EnableAppswitch(yield) # Let Python have a go at events
61 echo.close()
62
63
64class EchoServer:
65
66 suites = ['aevt', 'core', 'reqd']
67
68 def __init__(self):
69 self.active = 0
70 #
71 # Install the handlers
72 #
73 for suite in self.suites:
74 AE.AEInstallEventHandler(suite, typeWildCard, self.aehandler)
75 print (suite, typeWildCard, self.aehandler)
76 self.active = 1
77 #
78 # Setup the apple menu and file/quit
79 #
80 self.appleid = 1
81 self.fileid = 2
82
83 Menu.ClearMenuBar()
84 self.applemenu = applemenu = Menu.NewMenu(self.appleid, "\024")
85 applemenu.AppendMenu("All about echo...;(-")
86 applemenu.AppendResMenu('DRVR')
87 applemenu.InsertMenu(0)
88
89 self.filemenu = Menu.NewMenu(self.fileid, 'File')
90 self.filemenu.AppendMenu("Quit/Q")
91 self.filemenu.InsertMenu(0)
92
93 Menu.DrawMenuBar()
94 #
95 # Set interaction allowed (for the return values)
96 #
97 AE.AESetInteractionAllowed(kAEInteractWithAll)
98
99 def __del__(self):
100 self.close()
101
102 def close(self):
103 if self.active:
104 self.active = 0
105 for suite in self.suites:
106 AE.AERemoveEventHandler(suite, typeWildCard)
107
108 def mainloop(self, mask = everyEvent, timeout = 60*60):
109 while 1:
110 self.dooneevent(mask, timeout)
111
112 def dooneevent(self, mask = everyEvent, timeout = 60*60):
113 got, event = Evt.WaitNextEvent(mask, timeout)
114 if got:
115 self.lowlevelhandler(event)
116
117 def lowlevelhandler(self, event):
118 what, message, when, where, modifiers = event
119 h, v = where
120 if what == kHighLevelEvent:
121 msg = "High Level Event: %s %s" % \
122 (`code(message)`, `code(h | (v<<16))`)
123 self.handled_by_us = 0
124 try:
125 AE.AEProcessAppleEvent(event)
126 except AE.Error, err:
127 mymessage(msg + "\015AEProcessAppleEvent error: %s" % str(err))
128 traceback.print_exc()
129 else:
130 if self.handled_by_us == 0:
131 print msg, "Handled by AE, somehow"
132 else:
133 print msg, 'Handled by us.'
134 elif what == keyDown:
135 c = chr(message & charCodeMask)
136 if modifiers & cmdKey:
137 if c == '.':
138 raise KeyboardInterrupt, "Command-period"
139 else:
140 self.menuhit(Menu.MenuKey(message&charCodeMask))
141 ##MacOS.HandleEvent(event)
142 elif what == mouseDown:
143 partcode, window = Win.FindWindow(where)
144 if partcode == inMenuBar:
145 result = Menu.MenuSelect(where)
146 self.menuhit(result)
147 elif what <> autoKey:
148 print "Event:", (eventname(what), message, when, (h, v), modifiers)
149## MacOS.HandleEvent(event)
150
151 def menuhit(self, result):
152 id = (result>>16) & 0xffff # Hi word
153 item = result & 0xffff # Lo word
154 if id == self.appleid:
155 if item == 1:
156 mymessage("Echo -- echo AppleEvents")
157 elif item > 1:
158 name = self.applemenu.GetItem(item)
159 Qd.OpenDeskAcc(name)
160 elif id == self.fileid:
161 if item == 1:
162 raise Quit
163
164 def aehandler(self, request, reply):
165 print "Apple Event!"
166 self.handled_by_us = 1
167 parameters, attributes = aetools.unpackevent(request)
168 print "class =", `attributes['evcl'].type`,
169 print "id =", `attributes['evid'].type`
170 print "Parameters:"
171 keys = parameters.keys()
172 keys.sort()
173 for key in keys:
174 print "%s: %.150s" % (`key`, `parameters[key]`)
175 print " :", str(parameters[key])
176 print "Attributes:"
177 keys = attributes.keys()
178 keys.sort()
179 for key in keys:
180 print "%s: %.150s" % (`key`, `attributes[key]`)
181 parameters['----'] = self.askreplyvalue()
182 aetools.packevent(reply, parameters)
183
184 def askreplyvalue(self):
185 while 1:
186 str = myaskstring('Reply value to send (python-style)', 'None')
187 try:
188 rv = eval(str)
189 break
190 except:
191 pass
192 return rv
193
194_eventnames = {
195 keyDown: 'keyDown',
196 autoKey: 'autoKey',
197 mouseDown: 'mouseDown',
198 mouseUp: 'mouseUp',
199 updateEvt: 'updateEvt',
200 diskEvt: 'diskEvt',
201 activateEvt: 'activateEvt',
202 osEvt: 'osEvt',
203}
204
205def eventname(what):
206 if _eventnames.has_key(what): return _eventnames[what]
207 else: return `what`
208
209def code(x):
210 "Convert a long int to the 4-character code it really is"
211 s = ''
212 for i in range(4):
213 x, c = divmod(x, 256)
214 s = chr(c) + s
215 return s
216
217
218if __name__ == '__main__':
219 main()