blob: 1bad3e137d4ed5192af7d5dc468db5c696e11357 [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 sys
10sys.stdout = sys.stderr
11import traceback
12import MacOS
Guido van Rossum31559231995-02-05 16:59:27 +000013import AE
14from AppleEvents import *
15import Evt
16from Events import *
Guido van Rossum227a4231995-03-10 14:42:57 +000017import Menu
18import Dlg
19import Win
20from Windows import *
21import Qd
22
Guido van Rossum31559231995-02-05 16:59:27 +000023import aetools
Guido van Rossum227a4231995-03-10 14:42:57 +000024import EasyDialogs
Guido van Rossum31559231995-02-05 16:59:27 +000025
26kHighLevelEvent = 23 # Not defined anywhere for Python yet?
27
Jack Jansen5968bad1995-07-29 15:34:25 +000028def mymessage(str):
29 err = AE.AEInteractWithUser(kAEDefaultTimeout)
30 if err:
31 print str
32 EasyDialogs.Message(str)
Guido van Rossum31559231995-02-05 16:59:27 +000033
34def main():
35 echo = EchoServer()
Jack Jansen7fb76e01997-06-12 10:49:56 +000036 saveparams = MacOS.SchedParams(0, 0) # Disable Python's own "event handling"
Guido van Rossum31559231995-02-05 16:59:27 +000037 try:
Guido van Rossum227a4231995-03-10 14:42:57 +000038 echo.mainloop(everyEvent, 0)
Guido van Rossum31559231995-02-05 16:59:27 +000039 finally:
Jack Jansen7fb76e01997-06-12 10:49:56 +000040 apply(MacOS.SchedParams, saveparams) # Let Python have a go at events
Guido van Rossum31559231995-02-05 16:59:27 +000041 echo.close()
42
43
44class EchoServer:
45
Jack Jansen5968bad1995-07-29 15:34:25 +000046 #suites = ['aevt', 'core', 'reqd']
47 suites = ['****']
Guido van Rossum31559231995-02-05 16:59:27 +000048
49 def __init__(self):
50 self.active = 0
51 for suite in self.suites:
52 AE.AEInstallEventHandler(suite, typeWildCard, self.aehandler)
Jack Jansen5968bad1995-07-29 15:34:25 +000053 print (suite, typeWildCard, self.aehandler)
Guido van Rossum31559231995-02-05 16:59:27 +000054 self.active = 1
Guido van Rossum227a4231995-03-10 14:42:57 +000055 self.appleid = 1
56 Menu.ClearMenuBar()
57 self.applemenu = applemenu = Menu.NewMenu(self.appleid, "\024")
58 applemenu.AppendMenu("All about echo...;(-")
Jack Jansen5968bad1995-07-29 15:34:25 +000059 applemenu.AppendResMenu('DRVR')
Guido van Rossum227a4231995-03-10 14:42:57 +000060 applemenu.InsertMenu(0)
61 Menu.DrawMenuBar()
Guido van Rossum31559231995-02-05 16:59:27 +000062
63 def __del__(self):
64 self.close()
65
66 def close(self):
67 if self.active:
68 self.active = 0
69 for suite in self.suites:
70 AE.AERemoveEventHandler(suite, typeWildCard)
71
72 def mainloop(self, mask = everyEvent, timeout = 60*60):
73 while 1:
Guido van Rossum97842951995-02-19 15:59:49 +000074 self.dooneevent(mask, timeout)
75
76 def dooneevent(self, mask = everyEvent, timeout = 60*60):
Guido van Rossum31559231995-02-05 16:59:27 +000077 got, event = Evt.WaitNextEvent(mask, timeout)
78 if got:
79 self.lowlevelhandler(event)
80
81 def lowlevelhandler(self, event):
Guido van Rossum227a4231995-03-10 14:42:57 +000082 what, message, when, where, modifiers = event
83 h, v = where
Guido van Rossum31559231995-02-05 16:59:27 +000084 if what == kHighLevelEvent:
Guido van Rossum227a4231995-03-10 14:42:57 +000085 msg = "High Level Event: %s %s" % \
86 (`code(message)`, `code(h | (v<<16))`)
Guido van Rossum31559231995-02-05 16:59:27 +000087 try:
88 AE.AEProcessAppleEvent(event)
Guido van Rossum227a4231995-03-10 14:42:57 +000089 except AE.Error, err:
Jack Jansen5968bad1995-07-29 15:34:25 +000090 mymessage(msg + "\015AEProcessAppleEvent error: %s" % str(err))
Guido van Rossum31559231995-02-05 16:59:27 +000091 traceback.print_exc()
Guido van Rossum227a4231995-03-10 14:42:57 +000092 else:
Jack Jansen5968bad1995-07-29 15:34:25 +000093 mymessage(msg + "\015OK!")
Guido van Rossum31559231995-02-05 16:59:27 +000094 elif what == keyDown:
95 c = chr(message & charCodeMask)
96 if c == '.' and modifiers & cmdKey:
97 raise KeyboardInterrupt, "Command-period"
98 MacOS.HandleEvent(event)
Guido van Rossum227a4231995-03-10 14:42:57 +000099 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:
Jack Jansen5968bad1995-07-29 15:34:25 +0000107 mymessage("Echo -- echo AppleEvents")
Guido van Rossum227a4231995-03-10 14:42:57 +0000108 elif item > 1:
109 name = self.applemenu.GetItem(item)
110 Qd.OpenDeskAcc(name)
Guido van Rossum31559231995-02-05 16:59:27 +0000111 elif what <> autoKey:
112 print "Event:", (eventname(what), message, when, (h, v), modifiers)
Guido van Rossum227a4231995-03-10 14:42:57 +0000113## MacOS.HandleEvent(event)
Guido van Rossum31559231995-02-05 16:59:27 +0000114
115 def aehandler(self, request, reply):
Jack Jansen5968bad1995-07-29 15:34:25 +0000116 print "Apple Event!"
Guido van Rossum31559231995-02-05 16:59:27 +0000117 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)
132
133
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',
143}
144
145def eventname(what):
146 if _eventnames.has_key(what): return _eventnames[what]
147 else: return `what`
148
149def 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
156
157
158if __name__ == '__main__':
159 main()