#include "wx/evtloop.h"
#include "wx/filename.h"
#include "wx/msgout.h"
-#include "wx/ptr_scpd.h"
+#include "wx/scopedptr.h"
#include "wx/tokenzr.h"
#include "wx/thread.h"
#if wxUSE_THREADS
wxHandlersWithPendingEventsLocker = new wxCriticalSection;
+ wxHandlersWithPendingDelayedEvents = new wxList;
#endif
#ifndef __WXPALMOS__
delete wxHandlersWithPendingEvents;
wxHandlersWithPendingEvents = NULL;
+ delete wxHandlersWithPendingDelayedEvents;
+ wxHandlersWithPendingDelayedEvents = NULL;
+
#if wxUSE_THREADS
delete wxHandlersWithPendingEventsLocker;
wxHandlersWithPendingEventsLocker = NULL;
#if wxUSE_CONFIG
// delete the config object if any (don't use Get() here, but Set()
// because Get() could create a new config object)
- delete wxConfigBase::Set((wxConfigBase *) NULL);
+ delete wxConfigBase::Set(NULL);
#endif // wxUSE_CONFIG
return 0;
return has;
}
+void wxAppConsoleBase::SuspendProcessingOfPendingEvents()
+{
+ wxENTER_CRIT_SECT( *wxHandlersWithPendingEventsLocker );
+}
+
+void wxAppConsoleBase::ResumeProcessingOfPendingEvents()
+{
+ wxLEAVE_CRIT_SECT( *wxHandlersWithPendingEventsLocker );
+}
+
/* static */
bool wxAppConsoleBase::IsMainLoopRunning()
{
wxENTER_CRIT_SECT( *wxHandlersWithPendingEventsLocker );
+ wxCHECK_RET( wxHandlersWithPendingDelayedEvents->IsEmpty(),
+ "this helper list should be empty" );
+
if (wxHandlersWithPendingEvents)
{
// iterate until the list becomes empty: the handlers remove themselves
wxList::compatibility_iterator node = wxHandlersWithPendingEvents->GetFirst();
while (node)
{
- // In ProcessPendingEvents(), new handlers might be add
+ // In ProcessPendingEvents(), new handlers might be added
// and we can safely leave the critical section here.
wxLEAVE_CRIT_SECT( *wxHandlersWithPendingEventsLocker );
}
}
+ // now the wxHandlersWithPendingEvents is surely empty; however some event
+ // handlers may have moved themselves into wxHandlersWithPendingDelayedEvents
+ // because of a selective wxYield call in progress.
+ // Now we need to move them back to wxHandlersWithPendingEvents so the next
+ // call to this function has the chance of processing them:
+ if (!wxHandlersWithPendingDelayedEvents->IsEmpty())
+ {
+ if (!wxHandlersWithPendingEvents)
+ wxHandlersWithPendingEvents = new wxList;
+
+ WX_APPEND_LIST(wxHandlersWithPendingEvents, wxHandlersWithPendingDelayedEvents);
+ wxHandlersWithPendingDelayedEvents->Clear();
+ }
+
wxLEAVE_CRIT_SECT( *wxHandlersWithPendingEventsLocker );
}