Don't try to process any remaining pending events in ProcessEvents() itself as
this was inconsistent: we only processed low-level toolkit pending events in
the main event loop itself if the loop was exited from a normal event handler
but only processed the wxApp-level pending events if it was exited from a
pending event handler. It also required more code than the new version that
simply processes all the remaining pending events, of both kinds, after the
main event loop termination.
This corrects changes of r71304 and replaces those of r71329.
Closes #14250.
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@71432
c3d73ce0-8a6f-49c7-b76d-
6d57e0e08775
// executed)
if ( wxTheApp )
{
// 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).
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();
-
// generate and process idle events for as long as we don't
// have anything else to do
// generate and process idle events for as long as we don't
// have anything else to do
- while ( !Pending() && ProcessIdle() && !m_shouldExit )
+ while ( !m_shouldExit && !Pending() && ProcessIdle() )
- // if the "should exit" flag is set, the loop should terminate
- // but not before processing any remaining messages so while
- // Pending() returns true, do process them
- {
- while ( Pending() )
- ProcessEvents();
-
// a message came or no more idle processing to do, dispatch
// all the pending events and call Dispatch() to wait for the
// a message came or no more idle processing to do, dispatch
// all the pending events and call Dispatch() to wait for the
+ // Process the remaining queued messages, both at the level of the
+ // underlying toolkit level (Pending/Dispatch()) and wx level
+ // (Has/ProcessPendingEvents()).
+ //
+ // We do run the risk of never exiting this loop if pending event
+ // handlers endlessly generate new events but they shouldn't do
+ // this in a well-behaved program and we shouldn't just discard the
+ // events we already have, they might be important.
+ for ( ;; )
+ {
+ bool hasMoreEvents = false;
+ if ( wxTheApp && wxTheApp->HasPendingEvents() )
+ {
+ wxTheApp->ProcessPendingEvents();
+ hasMoreEvents = true;
+ }
+
+ if ( Pending() )
+ {
+ Dispatch();
+ hasMoreEvents = true;
+ }
+
+ if ( !hasMoreEvents )
+ break;
+ }
+
#if wxUSE_EXCEPTIONS
// exit the outer loop as well
break;
#if wxUSE_EXCEPTIONS
// exit the outer loop as well
break;