blob: f84e13baf44ec2bb373fefcb6749a984e667e498 [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
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
Guido van Rossum227a4231995-03-10 14:42:57 +000022
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...;(-")
Guido van Rossum227a4231995-03-10 14:42:57 +000059 applemenu.InsertMenu(0)
60 Menu.DrawMenuBar()
Guido van Rossum31559231995-02-05 16:59:27 +000061
62 def __del__(self):
63 self.close()
64
65 def close(self):
66 if self.active:
67 self.active = 0
68 for suite in self.suites:
69 AE.AERemoveEventHandler(suite, typeWildCard)
70
71 def mainloop(self, mask = everyEvent, timeout = 60*60):
72 while 1:
Guido van Rossum97842951995-02-19 15:59:49 +000073 self.dooneevent(mask, timeout)
74
75 def dooneevent(self, mask = everyEvent, timeout = 60*60):
Guido van Rossum31559231995-02-05 16:59:27 +000076 got, event = Evt.WaitNextEvent(mask, timeout)
77 if got:
78 self.lowlevelhandler(event)
79
80 def lowlevelhandler(self, event):
Guido van Rossum227a4231995-03-10 14:42:57 +000081 what, message, when, where, modifiers = event
82 h, v = where
Guido van Rossum31559231995-02-05 16:59:27 +000083 if what == kHighLevelEvent:
Guido van Rossum227a4231995-03-10 14:42:57 +000084 msg = "High Level Event: %s %s" % \
85 (`code(message)`, `code(h | (v<<16))`)
Guido van Rossum31559231995-02-05 16:59:27 +000086 try:
87 AE.AEProcessAppleEvent(event)
Guido van Rossum227a4231995-03-10 14:42:57 +000088 except AE.Error, err:
Jack Jansen5968bad1995-07-29 15:34:25 +000089 mymessage(msg + "\015AEProcessAppleEvent error: %s" % str(err))
Guido van Rossum31559231995-02-05 16:59:27 +000090 traceback.print_exc()
Guido van Rossum227a4231995-03-10 14:42:57 +000091 else:
Jack Jansen5968bad1995-07-29 15:34:25 +000092 mymessage(msg + "\015OK!")
Guido van Rossum31559231995-02-05 16:59:27 +000093 elif what == keyDown:
94 c = chr(message & charCodeMask)
95 if c == '.' and modifiers & cmdKey:
96 raise KeyboardInterrupt, "Command-period"
97 MacOS.HandleEvent(event)
Guido van Rossum227a4231995-03-10 14:42:57 +000098 elif what == mouseDown:
99 partcode, window = Win.FindWindow(where)
100 if partcode == inMenuBar:
101 result = Menu.MenuSelect(where)
102 id = (result>>16) & 0xffff # Hi word
103 item = result & 0xffff # Lo word
104 if id == self.appleid:
105 if item == 1:
Jack Jansen5968bad1995-07-29 15:34:25 +0000106 mymessage("Echo -- echo AppleEvents")
Guido van Rossum31559231995-02-05 16:59:27 +0000107 elif what <> autoKey:
108 print "Event:", (eventname(what), message, when, (h, v), modifiers)
Guido van Rossum227a4231995-03-10 14:42:57 +0000109## MacOS.HandleEvent(event)
Guido van Rossum31559231995-02-05 16:59:27 +0000110
111 def aehandler(self, request, reply):
Jack Jansen5968bad1995-07-29 15:34:25 +0000112 print "Apple Event!"
Guido van Rossum31559231995-02-05 16:59:27 +0000113 parameters, attributes = aetools.unpackevent(request)
114 print "class =", `attributes['evcl'].type`,
115 print "id =", `attributes['evid'].type`
116 print "Parameters:"
117 keys = parameters.keys()
118 keys.sort()
119 for key in keys:
120 print "%s: %.150s" % (`key`, `parameters[key]`)
121 print " :", str(parameters[key])
122 print "Attributes:"
123 keys = attributes.keys()
124 keys.sort()
125 for key in keys:
126 print "%s: %.150s" % (`key`, `attributes[key]`)
127 aetools.packevent(reply, parameters)
128
129
130_eventnames = {
131 keyDown: 'keyDown',
132 autoKey: 'autoKey',
133 mouseDown: 'mouseDown',
134 mouseUp: 'mouseUp',
135 updateEvt: 'updateEvt',
136 diskEvt: 'diskEvt',
137 activateEvt: 'activateEvt',
138 osEvt: 'osEvt',
139}
140
141def eventname(what):
142 if _eventnames.has_key(what): return _eventnames[what]
143 else: return `what`
144
145def code(x):
146 "Convert a long int to the 4-character code it really is"
147 s = ''
148 for i in range(4):
149 x, c = divmod(x, 256)
150 s = chr(c) + s
151 return s
152
153
154if __name__ == '__main__':
155 main()