switch (status)
{
case eventLoopTimedOutErr :
+ // process pending wx events before sending idle events
+ wxTheApp->ProcessPendingEvents();
if ( wxTheApp->ProcessIdle() )
m_sleepTime = kEventDurationNoWait ;
else
// OnUpdateUI() which is a nice (and desired) side effect)
while ( ProcessIdle() ) {}
+ // if there are pending events, we must process them.
+ if (wxTheApp)
+ wxTheApp->ProcessPendingEvents();
+
#if wxUSE_LOG
wxLog::Resume();
#endif // wxUSE_LOG
{
wxCHECK_RET( !IsModal(), wxT("DoShowModal() called twice") );
+ // If the app hasn't started, flush the event queue
+ // If we don't do this, the Dock doesn't get the message that
+ // the app has started so will refuse to activate it.
+ NSApplication *theNSApp = [NSApplication sharedApplication];
+ if (![theNSApp isRunning])
+ {
+ wxMacAutoreleasePool pool;
+ while(NSEvent *event = [theNSApp nextEventMatchingMask:NSAnyEventMask untilDate:nil inMode:NSDefaultRunLoopMode dequeue:YES])
+ {
+ [theNSApp sendEvent:event];
+ }
+ }
+
wxModalDialogs.Append(this);
SetFocus() ;
// unsafe
[NSApp runModalSession:session];
+ // break if ended, perform no further idle processing
+ if (!IsModal())
+ break;
+
// do some idle processing
+ bool needMore = false;
if (wxTheApp)
- wxTheApp->ProcessIdle();
+ {
+ wxTheApp->ProcessPendingEvents();
+ needMore = wxTheApp->ProcessIdle();
+ }
+
+ if (!needMore)
+ {
+ // no more idle processing wanted - block until the next event
+ [theNSApp nextEventMatchingMask:NSAnyEventMask untilDate:[NSDate distantFuture] inMode:NSDefaultRunLoopMode dequeue:NO];
+ }
}
[NSApp endModalSession:session];
}
else
{
+ if (wxTheApp)
+ wxTheApp->ProcessPendingEvents();
+
if ( wxTheApp->ProcessIdle() )
m_sleepTime = 0.0 ;
else
// OnUpdateUI() which is a nice (and desired) side effect)
while ( ProcessIdle() ) {}
+ // if there are pending events, we must process them.
+ if (wxTheApp)
+ wxTheApp->ProcessPendingEvents();
+
#if wxUSE_LOG
wxLog::Resume();
#endif // wxUSE_LOG