The 0.5 release happened on 2/15, not on 2/14. :-)
[python/dscho.git] / Mac / Lib / test / echo.py
blob1bad3e137d4ed5192af7d5dc468db5c696e11357
1 """'echo' -- an AppleEvent handler which handles all events the same.
3 It replies to each event by echoing the parameter back to the client.
4 This is a good way to find out how the Script Editor formats AppleEvents,
5 especially to figure out all the different forms an object specifier
6 can have (without having to rely on Apple's implementation).
7 """
9 import sys
10 sys.stdout = sys.stderr
11 import traceback
12 import MacOS
13 import AE
14 from AppleEvents import *
15 import Evt
16 from Events import *
17 import Menu
18 import Dlg
19 import Win
20 from Windows import *
21 import Qd
23 import aetools
24 import EasyDialogs
26 kHighLevelEvent = 23 # Not defined anywhere for Python yet?
28 def mymessage(str):
29 err = AE.AEInteractWithUser(kAEDefaultTimeout)
30 if err:
31 print str
32 EasyDialogs.Message(str)
34 def main():
35 echo = EchoServer()
36 saveparams = MacOS.SchedParams(0, 0) # Disable Python's own "event handling"
37 try:
38 echo.mainloop(everyEvent, 0)
39 finally:
40 apply(MacOS.SchedParams, saveparams) # Let Python have a go at events
41 echo.close()
44 class EchoServer:
46 #suites = ['aevt', 'core', 'reqd']
47 suites = ['****']
49 def __init__(self):
50 self.active = 0
51 for suite in self.suites:
52 AE.AEInstallEventHandler(suite, typeWildCard, self.aehandler)
53 print (suite, typeWildCard, self.aehandler)
54 self.active = 1
55 self.appleid = 1
56 Menu.ClearMenuBar()
57 self.applemenu = applemenu = Menu.NewMenu(self.appleid, "\024")
58 applemenu.AppendMenu("All about echo...;(-")
59 applemenu.AppendResMenu('DRVR')
60 applemenu.InsertMenu(0)
61 Menu.DrawMenuBar()
63 def __del__(self):
64 self.close()
66 def close(self):
67 if self.active:
68 self.active = 0
69 for suite in self.suites:
70 AE.AERemoveEventHandler(suite, typeWildCard)
72 def mainloop(self, mask = everyEvent, timeout = 60*60):
73 while 1:
74 self.dooneevent(mask, timeout)
76 def dooneevent(self, mask = everyEvent, timeout = 60*60):
77 got, event = Evt.WaitNextEvent(mask, timeout)
78 if got:
79 self.lowlevelhandler(event)
81 def lowlevelhandler(self, event):
82 what, message, when, where, modifiers = event
83 h, v = where
84 if what == kHighLevelEvent:
85 msg = "High Level Event: %s %s" % \
86 (`code(message)`, `code(h | (v<<16))`)
87 try:
88 AE.AEProcessAppleEvent(event)
89 except AE.Error, err:
90 mymessage(msg + "\015AEProcessAppleEvent error: %s" % str(err))
91 traceback.print_exc()
92 else:
93 mymessage(msg + "\015OK!")
94 elif what == keyDown:
95 c = chr(message & charCodeMask)
96 if c == '.' and modifiers & cmdKey:
97 raise KeyboardInterrupt, "Command-period"
98 MacOS.HandleEvent(event)
99 elif what == mouseDown:
100 partcode, window = Win.FindWindow(where)
101 if partcode == inMenuBar:
102 result = Menu.MenuSelect(where)
103 id = (result>>16) & 0xffff # Hi word
104 item = result & 0xffff # Lo word
105 if id == self.appleid:
106 if item == 1:
107 mymessage("Echo -- echo AppleEvents")
108 elif item > 1:
109 name = self.applemenu.GetItem(item)
110 Qd.OpenDeskAcc(name)
111 elif what <> autoKey:
112 print "Event:", (eventname(what), message, when, (h, v), modifiers)
113 ## MacOS.HandleEvent(event)
115 def aehandler(self, request, reply):
116 print "Apple Event!"
117 parameters, attributes = aetools.unpackevent(request)
118 print "class =", `attributes['evcl'].type`,
119 print "id =", `attributes['evid'].type`
120 print "Parameters:"
121 keys = parameters.keys()
122 keys.sort()
123 for key in keys:
124 print "%s: %.150s" % (`key`, `parameters[key]`)
125 print " :", str(parameters[key])
126 print "Attributes:"
127 keys = attributes.keys()
128 keys.sort()
129 for key in keys:
130 print "%s: %.150s" % (`key`, `attributes[key]`)
131 aetools.packevent(reply, parameters)
134 _eventnames = {
135 keyDown: 'keyDown',
136 autoKey: 'autoKey',
137 mouseDown: 'mouseDown',
138 mouseUp: 'mouseUp',
139 updateEvt: 'updateEvt',
140 diskEvt: 'diskEvt',
141 activateEvt: 'activateEvt',
142 osEvt: 'osEvt',
145 def eventname(what):
146 if _eventnames.has_key(what): return _eventnames[what]
147 else: return `what`
149 def code(x):
150 "Convert a long int to the 4-character code it really is"
151 s = ''
152 for i in range(4):
153 x, c = divmod(x, 256)
154 s = chr(c) + s
155 return s
158 if __name__ == '__main__':
159 main()