blob: d474f437224235461c83c9d8220c665027a17792 [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
Jack Jansen5a6fdcd2001-08-25 12:15:04 +000013from Carbon import AE
14from Carbon.AppleEvents import *
15from Carbon import Evt
16from Carbon.Events import *
17from Carbon import Menu
18from Carbon import Dlg
19from Carbon import Win
20from Carbon.Windows import *
21from Carbon import Qd
Jack Jansenbb653771996-03-18 14:21:15 +000022import 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()
Jack Jansen7fb76e01997-06-12 10:49:56 +000045 savepars = MacOS.SchedParams(0, 0) # Disable Python's own "event handling"
Jack Jansenbb653771996-03-18 14:21:15 +000046 try:
47 try:
48 echo.mainloop(everyEvent, 0)
49 except Quit:
50 pass
51 finally:
Jack Jansen7fb76e01997-06-12 10:49:56 +000052 apply(MacOS.SchedParams, savepars) # Let Python have a go at events
Jack Jansenbb653771996-03-18 14:21:15 +000053 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...;(-")
Jack Jansenbb653771996-03-18 14:21:15 +000078 applemenu.InsertMenu(0)
79
80 self.filemenu = Menu.NewMenu(self.fileid, 'File')
81 self.filemenu.AppendMenu("Quit/Q")
82 self.filemenu.InsertMenu(0)
83
84 Menu.DrawMenuBar()
85 #
86 # Set interaction allowed (for the return values)
87 #
88 AE.AESetInteractionAllowed(kAEInteractWithAll)
89
90 def __del__(self):
91 self.close()
92
93 def close(self):
94 if self.active:
95 self.active = 0
96 for suite in self.suites:
97 AE.AERemoveEventHandler(suite, typeWildCard)
98
99 def mainloop(self, mask = everyEvent, timeout = 60*60):
100 while 1:
101 self.dooneevent(mask, timeout)
102
103 def dooneevent(self, mask = everyEvent, timeout = 60*60):
104 got, event = Evt.WaitNextEvent(mask, timeout)
105 if got:
106 self.lowlevelhandler(event)
107
108 def lowlevelhandler(self, event):
109 what, message, when, where, modifiers = event
110 h, v = where
111 if what == kHighLevelEvent:
112 msg = "High Level Event: %s %s" % \
113 (`code(message)`, `code(h | (v<<16))`)
114 self.handled_by_us = 0
115 try:
116 AE.AEProcessAppleEvent(event)
117 except AE.Error, err:
118 mymessage(msg + "\015AEProcessAppleEvent error: %s" % str(err))
119 traceback.print_exc()
120 else:
121 if self.handled_by_us == 0:
122 print msg, "Handled by AE, somehow"
123 else:
124 print msg, 'Handled by us.'
125 elif what == keyDown:
126 c = chr(message & charCodeMask)
127 if modifiers & cmdKey:
128 if c == '.':
129 raise KeyboardInterrupt, "Command-period"
130 else:
131 self.menuhit(Menu.MenuKey(message&charCodeMask))
132 ##MacOS.HandleEvent(event)
133 elif what == mouseDown:
134 partcode, window = Win.FindWindow(where)
135 if partcode == inMenuBar:
136 result = Menu.MenuSelect(where)
137 self.menuhit(result)
138 elif what <> autoKey:
139 print "Event:", (eventname(what), message, when, (h, v), modifiers)
140## MacOS.HandleEvent(event)
141
142 def menuhit(self, result):
143 id = (result>>16) & 0xffff # Hi word
144 item = result & 0xffff # Lo word
145 if id == self.appleid:
146 if item == 1:
147 mymessage("Echo -- echo AppleEvents")
Jack Jansenbb653771996-03-18 14:21:15 +0000148 elif id == self.fileid:
149 if item == 1:
150 raise Quit
151
152 def aehandler(self, request, reply):
153 print "Apple Event!"
154 self.handled_by_us = 1
155 parameters, attributes = aetools.unpackevent(request)
156 print "class =", `attributes['evcl'].type`,
157 print "id =", `attributes['evid'].type`
158 print "Parameters:"
159 keys = parameters.keys()
160 keys.sort()
161 for key in keys:
162 print "%s: %.150s" % (`key`, `parameters[key]`)
163 print " :", str(parameters[key])
164 print "Attributes:"
165 keys = attributes.keys()
166 keys.sort()
167 for key in keys:
168 print "%s: %.150s" % (`key`, `attributes[key]`)
169 parameters['----'] = self.askreplyvalue()
170 aetools.packevent(reply, parameters)
171
172 def askreplyvalue(self):
173 while 1:
174 str = myaskstring('Reply value to send (python-style)', 'None')
175 try:
176 rv = eval(str)
177 break
178 except:
179 pass
180 return rv
181
182_eventnames = {
183 keyDown: 'keyDown',
184 autoKey: 'autoKey',
185 mouseDown: 'mouseDown',
186 mouseUp: 'mouseUp',
187 updateEvt: 'updateEvt',
188 diskEvt: 'diskEvt',
189 activateEvt: 'activateEvt',
190 osEvt: 'osEvt',
191}
192
193def eventname(what):
194 if _eventnames.has_key(what): return _eventnames[what]
195 else: return `what`
196
197def code(x):
198 "Convert a long int to the 4-character code it really is"
199 s = ''
200 for i in range(4):
201 x, c = divmod(x, 256)
202 s = chr(c) + s
203 return s
204
205
206if __name__ == '__main__':
207 main()