1 """MiniAEFrame - A minimal AppleEvent Application framework.
4 AEServer -- a mixin class offering nice AE handling.
5 MiniApplication -- a very minimal alternative to FrameWork.py,
6 only suitable for the simplest of AppleEvent servers.
13 from Carbon
.AppleEvents
import *
14 from Carbon
import Evt
15 from Carbon
.Events
import *
16 from Carbon
import Menu
17 from Carbon
import Win
18 from Carbon
.Windows
import *
24 kHighLevelEvent
= 23 # Not defined anywhere for Python yet?
27 class MiniApplication
:
29 """A minimal FrameWork.Application-like class"""
37 self
.applemenu
= applemenu
= Menu
.NewMenu(self
.appleid
, "\024")
38 applemenu
.AppendMenu("%s;(-" % self
.getaboutmenutext())
39 if MacOS
.runtimemodel
== 'ppc':
40 applemenu
.AppendResMenu('DRVR')
41 applemenu
.InsertMenu(0)
42 self
.quitmenu
= Menu
.NewMenu(self
.quitid
, "File")
43 self
.quitmenu
.AppendMenu("Quit")
44 self
.quitmenu
.SetItemCmd(1, ord("Q"))
45 self
.quitmenu
.InsertMenu(0)
54 def mainloop(self
, mask
= everyEvent
, timeout
= 60*60):
55 while not self
.quitting
:
56 self
.dooneevent(mask
, timeout
)
61 def dooneevent(self
, mask
= everyEvent
, timeout
= 60*60):
62 got
, event
= Evt
.WaitNextEvent(mask
, timeout
)
64 self
.lowlevelhandler(event
)
66 def lowlevelhandler(self
, event
):
67 what
, message
, when
, where
, modifiers
= event
69 if what
== kHighLevelEvent
:
70 msg
= "High Level Event: %s %s" % \
71 (`
code(message
)`
, `
code(h |
(v
<<16))`
)
73 AE
.AEProcessAppleEvent(event
)
75 print 'AE error: ', err
80 c
= chr(message
& charCodeMask
)
81 if modifiers
& cmdKey
:
83 raise KeyboardInterrupt, "Command-period"
88 elif what
== mouseDown
:
89 partcode
, window
= Win
.FindWindow(where
)
90 if partcode
== inMenuBar
:
91 result
= Menu
.MenuSelect(where
)
92 id = (result
>>16) & 0xffff # Hi word
93 item
= result
& 0xffff # Lo word
94 if id == self
.appleid
:
96 EasyDialogs
.Message(self
.getabouttext())
97 elif item
> 1 and hasattr(Menu
, 'OpenDeskAcc'):
98 name
= self
.applemenu
.GetMenuItemText(item
)
99 Menu
.OpenDeskAcc(name
)
100 elif id == self
.quitid
and item
== 1:
105 # Anything not handled is passed to Python/SIOUX
106 MacOS
.HandleEvent(event
)
108 def getabouttext(self
):
109 return self
.__class
__.__name
__
111 def getaboutmenutext(self
):
112 return "About %s\311" % self
.__class
__.__name
__
118 self
.ae_handlers
= {}
120 def installaehandler(self
, classe
, type, callback
):
121 AE
.AEInstallEventHandler(classe
, type, self
.callback_wrapper
)
122 self
.ae_handlers
[(classe
, type)] = callback
125 for classe
, type in self
.ae_handlers
.keys():
126 AE
.AERemoveEventHandler(classe
, type)
128 def callback_wrapper(self
, _request
, _reply
):
129 _parameters
, _attributes
= aetools
.unpackevent(_request
)
130 _class
= _attributes
['evcl'].type
131 _type
= _attributes
['evid'].type
133 if self
.ae_handlers
.has_key((_class
, _type
)):
134 _function
= self
.ae_handlers
[(_class
, _type
)]
135 elif self
.ae_handlers
.has_key((_class
, '****')):
136 _function
= self
.ae_handlers
[(_class
, '****')]
137 elif self
.ae_handlers
.has_key(('****', '****')):
138 _function
= self
.ae_handlers
[('****', '****')]
140 raise 'Cannot happen: AE callback without handler', (_class
, _type
)
142 # XXXX Do key-to-name mapping here
144 _parameters
['_attributes'] = _attributes
145 _parameters
['_class'] = _class
146 _parameters
['_type'] = _type
147 if _parameters
.has_key('----'):
148 _object
= _parameters
['----']
149 del _parameters
['----']
150 # The try/except that used to be here can mask programmer errors.
151 # Let the program crash, the programmer can always add a **args
152 # to the formal parameter list.
153 rv
= apply(_function
, (_object
,), _parameters
)
155 #Same try/except comment as above
156 rv
= apply(_function
, (), _parameters
)
159 aetools
.packevent(_reply
, {})
161 aetools
.packevent(_reply
, {'----':rv
})
165 "Convert a long int to the 4-character code it really is"
168 x
, c
= divmod(x
, 256)
172 class _Test(AEServer
, MiniApplication
):
173 """Mini test application, handles required events"""
176 MiniApplication
.__init
__(self
)
177 AEServer
.__init
__(self
)
178 self
.installaehandler('aevt', 'oapp', self
.open_app
)
179 self
.installaehandler('aevt', 'quit', self
.quit
)
180 self
.installaehandler('****', '****', self
.other
)
183 def quit(self
, **args
):
186 def open_app(self
, **args
):
189 def other(self
, _object
=None, _class
=None, _type
=None, **args
):
190 print 'AppleEvent', (_class
, _type
), 'for', _object
, 'Other args:', args
193 if __name__
== '__main__':