-static bool sg_needIdle = true;
-
-// ========================================================================
-// wxPoserNSApplication
-// ========================================================================
-@interface wxPoserNSApplication : NSApplication
-{
-}
-
-- (NSEvent *)nextEventMatchingMask:(unsigned int)mask untilDate:(NSDate *)expiration inMode:(NSString *)mode dequeue:(BOOL)flag;
-- (void)sendEvent: (NSEvent*)anEvent;
-@end // wxPoserNSApplication
-
-WX_IMPLEMENT_POSER(wxPoserNSApplication);
-
-@implementation wxPoserNSApplication : NSApplication
-
-/* NOTE: The old method of idle event handling added the handler using the
- [NSRunLoop -performSelector:target:argument:order:modes] which caused
- the invocation to occur at the begining of [NSApplication
- -nextEventMatchingMask:untilDate:expiration:inMode:dequeue:]. However,
- the code would be scheduled for invocation with every iteration of
- the event loop. This new method simply overrides the method. The
- same caveats apply. In particular, by the time the event loop has
- called this method, it usually expects to receive an event. If you
- plan on stopping the event loop, it is wise to send an event through
- the queue to ensure this method will return.
- See wxEventLoop::Exit() for more information.
-
- Ê ÊRN: We used to use nil as the untilDate in previous versions since nil
-Ê Êis a shorter and more concise way of specifying an infinite amount of
-ÊÊ Êtime than [NSDate distantPast]. ÊHowever, Apple neglects to mention in
-Ê Êtheir documentation that nil is not handled correctly in OSX 10.2
-Ê Ê(and possibly lower) and when the call is reached the system comes to
-Ê Êa screeching halt, therefore we need to specify [NSDate distantPast]
-Ê Êexplicitly so that wxCocoa will work correctly in OSX 10.2.
-*/
-
-- (NSEvent *)nextEventMatchingMask:(unsigned int)mask untilDate:(NSDate *)expiration inMode:(NSString *)mode dequeue:(BOOL)flag
-{
- // Get the same events except don't block
- NSEvent *event = [super nextEventMatchingMask:mask untilDate:[NSDate distantPast] inMode:mode dequeue:flag];
- // If we got one, simply return it
- if(event)
- return event;
- // No events, try doing some idle stuff
- if(sg_needIdle
-#ifdef __WXDEBUG__
- && !wxTheApp->IsInAssert()
-#endif
- && ([NSDefaultRunLoopMode isEqualToString:mode] || [NSModalPanelRunLoopMode isEqualToString:mode]))
- {
- sg_needIdle = false;
- wxLogTrace(wxTRACE_COCOA,wxT("Processing idle events"));
- while(wxTheApp->ProcessIdle())
- {
- // Get the same events except don't block
- NSEvent *event = [super nextEventMatchingMask:mask untilDate:[NSDate distantPast] inMode:mode dequeue:flag];
- // If we got one, simply return it
- if(event)
- return event;
- // we didn't get one, do some idle work
- wxLogTrace(wxTRACE_COCOA,wxT("Looping idle events"));
- }
- // No more idle work requested, block
- wxLogTrace(wxTRACE_COCOA,wxT("Finished idle processing"));
- }
- else
- wxLogTrace(wxTRACE_COCOA,wxT("Avoiding idle processing sg_needIdle=%d"),sg_needIdle);
- return [super nextEventMatchingMask:mask untilDate:expiration inMode:mode dequeue:flag];
-}
-
-- (void)sendEvent: (NSEvent*)anEvent
-{
- wxLogTrace(wxTRACE_COCOA,wxT("SendEvent"));
- sg_needIdle = true;
- [super sendEvent: anEvent];
-}
-
-@end // wxPoserNSApplication