-// ========================================================================
-// wxPoseAsInitializer
-// ========================================================================
-wxPoseAsInitializer *wxPoseAsInitializer::sm_first = NULL;
-
-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 /*&& !wxTheApp->IsInAssert()*/ && ([NSDefaultRunLoopMode isEqualToString:mode] || [NSModalPanelRunLoopMode isEqualToString:mode]))
- {
- sg_needIdle = false;
- wxLogDebug(wxT("Processing idle events"));
- while(wxTheApp->ProcessIdle())
- {
- // Get the same events except don't block
- NSEvent *event = [super nextEventMatchingMask:mask untilDate:[NSDate distantPast]/* equivalent to [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
- wxLogDebug(wxT("Looping idle events"));
- }
- // No more idle work requested, block
- wxLogDebug(wxT("Finished idle processing"));
- }
- else
- wxLogDebug(wxT("Avoiding idle processing sg_needIdle=%d"),sg_needIdle);
- return [super nextEventMatchingMask:mask untilDate:expiration inMode:mode dequeue:flag];
-}