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