@@ -95,13 +95,19 @@ class Application:
9595 "Application framework -- your application should be a derived class"
9696
9797 def __init__ (self , nomenubar = 0 ):
98+ self ._doing_asyncevents = 0
9899 self .quitting = 0
99100 self .needmenubarredraw = 0
100101 self ._windows = {}
101102 if nomenubar :
102103 self .menubar = None
103104 else :
104105 self .makemenubar ()
106+
107+ def __del__ (self ):
108+ if self ._doing_asyncevents :
109+ self ._doing_asyncevents = 0
110+ MacOS .SetEventHandler ()
105111
106112 def makemenubar (self ):
107113 self .menubar = MenuBar (self )
@@ -158,6 +164,11 @@ def mainloop(self, mask = everyEvent, wait = 0):
158164
159165 schedparams = MacOS .SchedParams ()
160166
167+ def dopendingevents (self , mask = everyEvent ):
168+ """dopendingevents - Handle all pending events"""
169+ while self .do1event (mask , wait = 0 ):
170+ pass
171+
161172 def do1event (self , mask = everyEvent , wait = 0 ):
162173 ok , event = self .getevent (mask , wait )
163174 if IsDialogEvent (event ):
@@ -179,6 +190,11 @@ def getevent(self, mask = everyEvent, wait = 0):
179190 return ok , event
180191
181192 def dispatch (self , event ):
193+ # The following appears to be double work (already done in do1event)
194+ # but we need it for asynchronous event handling
195+ if IsDialogEvent (event ):
196+ if self .do_dialogevent (event ):
197+ return
182198 (what , message , when , where , modifiers ) = event
183199 if eventname .has_key (what ):
184200 name = "do_" + eventname [what ]
@@ -190,6 +206,21 @@ def dispatch(self, event):
190206 handler = self .do_unknownevent
191207 handler (event )
192208
209+ def asyncevents (self , onoff ):
210+ """asyncevents - Set asynchronous event handling on or off"""
211+ old = self ._doing_asyncevents
212+ if old :
213+ MacOS .SetEventHandler ()
214+ apply (MacOS .SchedParams , self .schedparams )
215+ if onoff :
216+ MacOS .SetEventHandler (self .dispatch )
217+ doint , dummymask , benice , howoften , bgyield = \
218+ self .schedparams
219+ MacOS .SchedParams (doint , everyEvent , benice ,
220+ howoften , bgyield )
221+ self ._doing_asyncevents = onoff
222+ return old
223+
193224 def do_dialogevent (self , event ):
194225 gotone , window , item = DialogSelect (event )
195226 if gotone :
0 commit comments