X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/5cd99866132366b74289e5a08e963723732bae01..902b679a455b146555607d6123cf8b9159c39888:/src/common/evtloopcmn.cpp diff --git a/src/common/evtloopcmn.cpp b/src/common/evtloopcmn.cpp index 5f9894d125..f6f7c4aa1f 100644 --- a/src/common/evtloopcmn.cpp +++ b/src/common/evtloopcmn.cpp @@ -82,7 +82,7 @@ bool wxEventLoopBase::Yield(bool onlyIfNeeded) } // wxEventLoopManual is unused in the other ports -#if defined(__WXMSW__) || defined(__WXMAC__) || defined(__WXDFB__) || (defined(__UNIX__) && wxUSE_BASE) +#if defined(__WINDOWS__) || defined(__WXDFB__) || ( ( defined(__UNIX__) && !defined(__WXOSX__) ) && wxUSE_BASE) // ============================================================================ // wxEventLoopManual implementation @@ -104,8 +104,26 @@ bool wxEventLoopManual::ProcessEvents() // and this input is only removed from it when pending event handlers are // executed) if ( wxTheApp ) + { + const bool hadExitedBefore = m_shouldExit; + wxTheApp->ProcessPendingEvents(); + // One of the pending event handlers could have decided to exit the + // loop so check for the flag before trying to dispatch more events + // (which could block indefinitely if no more are coming). + if ( !hadExitedBefore && m_shouldExit ) + { + // We still need to dispatch any remaining pending events, just as + // we do in the event loop in Run() if the loop is exited from a + // normal event handler. + while ( wxTheApp->HasPendingEvents() ) + wxTheApp->ProcessPendingEvents(); + + return false; + } + } + return Dispatch(); } @@ -139,7 +157,7 @@ int wxEventLoopManual::Run() // generate and process idle events for as long as we don't // have anything else to do - while ( !Pending() && ProcessIdle() ) + while ( !Pending() && ProcessIdle() && !m_shouldExit ) ; // if the "should exit" flag is set, the loop should terminate @@ -213,5 +231,5 @@ void wxEventLoopManual::Exit(int rc) WakeUp(); } -#endif // __WXMSW__ || __WXMAC__ || __WXDFB__ +#endif // __WINDOWS__ || __WXMAC__ || __WXDFB__