]> git.saurik.com Git - wxWidgets.git/commitdiff
adding ProcessPendingEvents as ProcessIdle doesn't call it anymore, closes #11132
authorStefan Csomor <csomor@advancedconcepts.ch>
Sat, 26 Sep 2009 18:50:33 +0000 (18:50 +0000)
committerStefan Csomor <csomor@advancedconcepts.ch>
Sat, 26 Sep 2009 18:50:33 +0000 (18:50 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@62159 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

src/osx/carbon/evtloop.cpp
src/osx/cocoa/dialog.mm
src/osx/cocoa/evtloop.mm

index 4278ced1965e83752ed66aefea4b39c7f715d8b3..cdfda0653dac13b3b2344724164b7e8dd70b71b8 100644 (file)
@@ -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
index 4af807536ad6a687ffe1903435d30b885ede199b..ab4ed1e5c32410fe9c1cc8a7a611eb851ef31e87 100644 (file)
@@ -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];
 
index 795a05f9b762fb54e48bd79d16a180644e722052..1101ee217e564edf5fdea217bf540ceebc3f2cd4 100644 (file)
@@ -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