From b0a9bfc8b86bbceaaef545e5c1df052abc537d1a Mon Sep 17 00:00:00 2001 From: Stefan Csomor Date: Sat, 26 Sep 2009 18:50:33 +0000 Subject: [PATCH] adding ProcessPendingEvents as ProcessIdle doesn't call it anymore, closes #11132 git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@62159 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- src/osx/carbon/evtloop.cpp | 6 ++++++ src/osx/cocoa/dialog.mm | 29 ++++++++++++++++++++++++++++- src/osx/cocoa/evtloop.mm | 7 +++++++ 3 files changed, 41 insertions(+), 1 deletion(-) diff --git a/src/osx/carbon/evtloop.cpp b/src/osx/carbon/evtloop.cpp index 4278ced196..cdfda0653d 100644 --- a/src/osx/carbon/evtloop.cpp +++ b/src/osx/carbon/evtloop.cpp @@ -89,6 +89,8 @@ bool wxGUIEventLoop::Dispatch() switch (status) { case eventLoopTimedOutErr : + // process pending wx events before sending idle events + wxTheApp->ProcessPendingEvents(); if ( wxTheApp->ProcessIdle() ) m_sleepTime = kEventDurationNoWait ; else @@ -167,6 +169,10 @@ bool wxGUIEventLoop::YieldFor(long eventsToProcess) // 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 diff --git a/src/osx/cocoa/dialog.mm b/src/osx/cocoa/dialog.mm index 4af807536a..ab4ed1e5c3 100644 --- a/src/osx/cocoa/dialog.mm +++ b/src/osx/cocoa/dialog.mm @@ -28,6 +28,19 @@ void wxDialog::DoShowModal() { 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() ; @@ -55,9 +68,23 @@ void wxDialog::DoShowModal() // 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]; diff --git a/src/osx/cocoa/evtloop.mm b/src/osx/cocoa/evtloop.mm index 795a05f9b7..1101ee217e 100644 --- a/src/osx/cocoa/evtloop.mm +++ b/src/osx/cocoa/evtloop.mm @@ -116,6 +116,9 @@ bool wxGUIEventLoop::Dispatch() } else { + if (wxTheApp) + wxTheApp->ProcessPendingEvents(); + if ( wxTheApp->ProcessIdle() ) m_sleepTime = 0.0 ; else @@ -161,6 +164,10 @@ bool wxGUIEventLoop::YieldFor(long eventsToProcess) // 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 -- 2.45.2