-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.
-
- This overridden method calls the superclass method with an untilDate
- parameter that indicates nil should be returned if there are no pending
- events. That is, nextEventMatchingMask: should not wait for an event.
- If nil is returned then idle event processing occurs until the user
- does not request anymore idle events or until a real event comes through.
-
- Apple documentation states that nil can be passed in place of
- [NSDate distantPast] to the untilDate parameter. However, according
- to Ryan Norton this crashes on Jaguar (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