blob: 4549000883ad7ebaf70bbf469196be838a6021dd [file] [log] [blame]
Guido van Rossum31559231995-02-05 16:59:27 +00001"""'echo' -- an AppleEvent handler which handles all events the same.
2
3It replies to each event by echoing the parameter back to the client.
4This is a good way to find out how the Script Editor formats AppleEvents,
5especially to figure out all the different forms an object specifier
6can have (without having to rely on Apple's implementation).
7"""
8
Guido van Rossum97842951995-02-19 15:59:49 +00009import addpack
Jack Jansenc7cfb951995-06-05 22:34:12 +000010addpack.addpack('Tools')
Guido van Rossum97842951995-02-19 15:59:49 +000011addpack.addpack('bgen')
12addpack.addpack('ae')
13addpack.addpack('evt')
Guido van Rossum227a4231995-03-10 14:42:57 +000014#addpack.addpack('menu')
15addpack.addpack('win')
Guido van Rossum97842951995-02-19 15:59:49 +000016
17import sys
18sys.stdout = sys.stderr
19import traceback
20import MacOS
Guido van Rossum31559231995-02-05 16:59:27 +000021import AE
22from AppleEvents import *
23import Evt
24from Events import *
Guido van Rossum227a4231995-03-10 14:42:57 +000025import Menu
26import Dlg
27import Win
28from Windows import *
29import Qd
30
Guido van Rossum31559231995-02-05 16:59:27 +000031import aetools
Guido van Rossum227a4231995-03-10 14:42:57 +000032import EasyDialogs
Guido van Rossum31559231995-02-05 16:59:27 +000033
34kHighLevelEvent = 23 # Not defined anywhere for Python yet?
35
Jack Jansen5968bad1995-07-29 15:34:25 +000036def mymessage(str):
37 err = AE.AEInteractWithUser(kAEDefaultTimeout)
38 if err:
39 print str
40 EasyDialogs.Message(str)
Guido van Rossum31559231995-02-05 16:59:27 +000041
42def main():
43 echo = EchoServer()
Guido van Rossum227a4231995-03-10 14:42:57 +000044 yield = MacOS.EnableAppswitch(-1) # Disable Python's own "event handling"
Guido van Rossum31559231995-02-05 16:59:27 +000045 try:
Guido van Rossum227a4231995-03-10 14:42:57 +000046 echo.mainloop(everyEvent, 0)
Guido van Rossum31559231995-02-05 16:59:27 +000047 finally:
Guido van Rossum227a4231995-03-10 14:42:57 +000048 MacOS.EnableAppswitch(yield) # Let Python have a go at events
Guido van Rossum31559231995-02-05 16:59:27 +000049 echo.close()
50
51
52class EchoServer:
53
Jack Jansen5968bad1995-07-29 15:34:25 +000054 #suites = ['aevt', 'core', 'reqd']
55 suites = ['****']
Guido van Rossum31559231995-02-05 16:59:27 +000056
57 def __init__(self):
58 self.active = 0
59 for suite in self.suites:
60 AE.AEInstallEventHandler(suite, typeWildCard, self.aehandler)
Jack Jansen5968bad1995-07-29 15:34:25 +000061 print (suite, typeWildCard, self.aehandler)
Guido van Rossum31559231995-02-05 16:59:27 +000062 self.active = 1
Guido van Rossum227a4231995-03-10 14:42:57 +000063 self.appleid = 1
64 Menu.ClearMenuBar()
65 self.applemenu = applemenu = Menu.NewMenu(self.appleid, "\024")
66 applemenu.AppendMenu("All about echo...;(-")
Jack Jansen5968bad1995-07-29 15:34:25 +000067 applemenu.AppendResMenu('DRVR')
Guido van Rossum227a4231995-03-10 14:42:57 +000068 applemenu.InsertMenu(0)
69 Menu.DrawMenuBar()
Guido van Rossum31559231995-02-05 16:59:27 +000070
71 def __del__(self):
72 self.close()
73
74 def close(self):
75 if self.active:
76 self.active = 0
77 for suite in self.suites:
78 AE.AERemoveEventHandler(suite, typeWildCard)
79
80 def mainloop(self, mask = everyEvent, timeout = 60*60):
81 while 1:
Guido van Rossum97842951995-02-19 15:59:49 +000082 self.dooneevent(mask, timeout)
83
84 def dooneevent(self, mask = everyEvent, timeout = 60*60):
Guido van Rossum31559231995-02-05 16:59:27 +000085 got, event = Evt.WaitNextEvent(mask, timeout)
86 if got:
87 self.lowlevelhandler(event)
88
89 def lowlevelhandler(self, event):
Guido van Rossum227a4231995-03-10 14:42:57 +000090 what, message, when, where, modifiers = event
91 h, v = where
Guido van Rossum31559231995-02-05 16:59:27 +000092 if what == kHighLevelEvent:
Guido van Rossum227a4231995-03-10 14:42:57 +000093 msg = "High Level Event: %s %s" % \
94 (`code(message)`, `code(h | (v<<16))`)
Guido van Rossum31559231995-02-05 16:59:27 +000095 try:
96 AE.AEProcessAppleEvent(event)
Guido van Rossum227a4231995-03-10 14:42:57 +000097 except AE.Error, err:
Jack Jansen5968bad1995-07-29 15:34:25 +000098 mymessage(msg + "\015AEProcessAppleEvent error: %s" % str(err))
Guido van Rossum31559231995-02-05 16:59:27 +000099 traceback.print_exc()
Guido van Rossum227a4231995-03-10 14:42:57 +0000100 else:
Jack Jansen5968bad1995-07-29 15:34:25 +0000101 mymessage(msg + "\015OK!")
Guido van Rossum31559231995-02-05 16:59:27 +0000102 elif what == keyDown:
103 c = chr(message & charCodeMask)
104 if c == '.' and modifiers & cmdKey:
105 raise KeyboardInterrupt, "Command-period"
106 MacOS.HandleEvent(event)
Guido van Rossum227a4231995-03-10 14:42:57 +0000107 elif what == mouseDown:
108 partcode, window = Win.FindWindow(where)
109 if partcode == inMenuBar:
110 result = Menu.MenuSelect(where)
111 id = (result>>16) & 0xffff # Hi word
112 item = result & 0xffff # Lo word
113 if id == self.appleid:
114 if item == 1:
Jack Jansen5968bad1995-07-29 15:34:25 +0000115 mymessage("Echo -- echo AppleEvents")
Guido van Rossum227a4231995-03-10 14:42:57 +0000116 elif item > 1:
117 name = self.applemenu.GetItem(item)
118 Qd.OpenDeskAcc(name)
Guido van Rossum31559231995-02-05 16:59:27 +0000119 elif what <> autoKey:
120 print "Event:", (eventname(what), message, when, (h, v), modifiers)
Guido van Rossum227a4231995-03-10 14:42:57 +0000121## MacOS.HandleEvent(event)
Guido van Rossum31559231995-02-05 16:59:27 +0000122
123 def aehandler(self, request, reply):
Jack Jansen5968bad1995-07-29 15:34:25 +0000124 print "Apple Event!"
Guido van Rossum31559231995-02-05 16:59:27 +0000125 parameters, attributes = aetools.unpackevent(request)
126 print "class =", `attributes['evcl'].type`,
127 print "id =", `attributes['evid'].type`
128 print "Parameters:"
129 keys = parameters.keys()
130 keys.sort()
131 for key in keys:
132 print "%s: %.150s" % (`key`, `parameters[key]`)
133 print " :", str(parameters[key])
134 print "Attributes:"
135 keys = attributes.keys()
136 keys.sort()
137 for key in keys:
138 print "%s: %.150s" % (`key`, `attributes[key]`)
139 aetools.packevent(reply, parameters)
140
141
142_eventnames = {
143 keyDown: 'keyDown',
144 autoKey: 'autoKey',
145 mouseDown: 'mouseDown',
146 mouseUp: 'mouseUp',
147 updateEvt: 'updateEvt',
148 diskEvt: 'diskEvt',
149 activateEvt: 'activateEvt',
150 osEvt: 'osEvt',
151}
152
153def eventname(what):
154 if _eventnames.has_key(what): return _eventnames[what]
155 else: return `what`
156
157def code(x):
158 "Convert a long int to the 4-character code it really is"
159 s = ''
160 for i in range(4):
161 x, c = divmod(x, 256)
162 s = chr(c) + s
163 return s
164
165
166if __name__ == '__main__':
167 main()