blob: d48434fe376bed45b4708e43a9e8cd795e4c9ab6 [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
36
37def main():
38 echo = EchoServer()
Guido van Rossum227a4231995-03-10 14:42:57 +000039 yield = MacOS.EnableAppswitch(-1) # Disable Python's own "event handling"
Guido van Rossum31559231995-02-05 16:59:27 +000040 try:
Guido van Rossum227a4231995-03-10 14:42:57 +000041 echo.mainloop(everyEvent, 0)
Guido van Rossum31559231995-02-05 16:59:27 +000042 finally:
Guido van Rossum227a4231995-03-10 14:42:57 +000043 MacOS.EnableAppswitch(yield) # Let Python have a go at events
Guido van Rossum31559231995-02-05 16:59:27 +000044 echo.close()
45
46
47class EchoServer:
48
49 suites = ['aevt', 'core']
50
51 def __init__(self):
52 self.active = 0
53 for suite in self.suites:
54 AE.AEInstallEventHandler(suite, typeWildCard, self.aehandler)
55 self.active = 1
Guido van Rossum227a4231995-03-10 14:42:57 +000056 self.appleid = 1
57 Menu.ClearMenuBar()
58 self.applemenu = applemenu = Menu.NewMenu(self.appleid, "\024")
59 applemenu.AppendMenu("All about echo...;(-")
60 applemenu.AddResMenu('DRVR')
61 applemenu.InsertMenu(0)
62 Menu.DrawMenuBar()
Guido van Rossum31559231995-02-05 16:59:27 +000063
64 def __del__(self):
65 self.close()
66
67 def close(self):
68 if self.active:
69 self.active = 0
70 for suite in self.suites:
71 AE.AERemoveEventHandler(suite, typeWildCard)
72
73 def mainloop(self, mask = everyEvent, timeout = 60*60):
74 while 1:
Guido van Rossum97842951995-02-19 15:59:49 +000075 self.dooneevent(mask, timeout)
76
77 def dooneevent(self, mask = everyEvent, timeout = 60*60):
Guido van Rossum31559231995-02-05 16:59:27 +000078 got, event = Evt.WaitNextEvent(mask, timeout)
79 if got:
80 self.lowlevelhandler(event)
81
82 def lowlevelhandler(self, event):
Guido van Rossum227a4231995-03-10 14:42:57 +000083 what, message, when, where, modifiers = event
84 h, v = where
Guido van Rossum31559231995-02-05 16:59:27 +000085 if what == kHighLevelEvent:
Guido van Rossum227a4231995-03-10 14:42:57 +000086 msg = "High Level Event: %s %s" % \
87 (`code(message)`, `code(h | (v<<16))`)
Guido van Rossum31559231995-02-05 16:59:27 +000088 try:
89 AE.AEProcessAppleEvent(event)
Guido van Rossum227a4231995-03-10 14:42:57 +000090 except AE.Error, err:
91 EasyDialogs.Message(msg + "\015AEProcessAppleEvent error: %s" % str(err))
Guido van Rossum31559231995-02-05 16:59:27 +000092 traceback.print_exc()
Guido van Rossum227a4231995-03-10 14:42:57 +000093 else:
94 EasyDialogs.Message(msg + "\015OK!")
Guido van Rossum31559231995-02-05 16:59:27 +000095 elif what == keyDown:
96 c = chr(message & charCodeMask)
97 if c == '.' and modifiers & cmdKey:
98 raise KeyboardInterrupt, "Command-period"
99 MacOS.HandleEvent(event)
Guido van Rossum227a4231995-03-10 14:42:57 +0000100 elif what == mouseDown:
101 partcode, window = Win.FindWindow(where)
102 if partcode == inMenuBar:
103 result = Menu.MenuSelect(where)
104 id = (result>>16) & 0xffff # Hi word
105 item = result & 0xffff # Lo word
106 if id == self.appleid:
107 if item == 1:
108 EasyDialogs.Message("Echo -- echo AppleEvents")
109 elif item > 1:
110 name = self.applemenu.GetItem(item)
111 Qd.OpenDeskAcc(name)
Guido van Rossum31559231995-02-05 16:59:27 +0000112 elif what <> autoKey:
113 print "Event:", (eventname(what), message, when, (h, v), modifiers)
Guido van Rossum227a4231995-03-10 14:42:57 +0000114## MacOS.HandleEvent(event)
Guido van Rossum31559231995-02-05 16:59:27 +0000115
116 def aehandler(self, request, reply):
117 print "Apple Event",
118 parameters, attributes = aetools.unpackevent(request)
119 print "class =", `attributes['evcl'].type`,
120 print "id =", `attributes['evid'].type`
121 print "Parameters:"
122 keys = parameters.keys()
123 keys.sort()
124 for key in keys:
125 print "%s: %.150s" % (`key`, `parameters[key]`)
126 print " :", str(parameters[key])
127 print "Attributes:"
128 keys = attributes.keys()
129 keys.sort()
130 for key in keys:
131 print "%s: %.150s" % (`key`, `attributes[key]`)
132 aetools.packevent(reply, parameters)
133
134
135_eventnames = {
136 keyDown: 'keyDown',
137 autoKey: 'autoKey',
138 mouseDown: 'mouseDown',
139 mouseUp: 'mouseUp',
140 updateEvt: 'updateEvt',
141 diskEvt: 'diskEvt',
142 activateEvt: 'activateEvt',
143 osEvt: 'osEvt',
144}
145
146def eventname(what):
147 if _eventnames.has_key(what): return _eventnames[what]
148 else: return `what`
149
150def code(x):
151 "Convert a long int to the 4-character code it really is"
152 s = ''
153 for i in range(4):
154 x, c = divmod(x, 256)
155 s = chr(c) + s
156 return s
157
158
159if __name__ == '__main__':
160 main()