X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/51fe4b60ab4fec78eb1a67473d08b1c4740d03f5..3f8cdda4851796e5f5f5bcd82d9e867a30581a6f:/src/common/appbase.cpp?ds=sidebyside diff --git a/src/common/appbase.cpp b/src/common/appbase.cpp index 5a741b70ac..740deebb2b 100644 --- a/src/common/appbase.cpp +++ b/src/common/appbase.cpp @@ -163,7 +163,7 @@ bool wxAppConsoleBase::Initialize(int& WXUNUSED(argc), wxChar **argv) #endif // wxUSE_INTL #if wxUSE_THREADS - wxPendingEventsLocker = new wxCriticalSection; + wxHandlersWithPendingEventsLocker = new wxCriticalSection; #endif #ifndef __WXPALMOS__ @@ -190,12 +190,12 @@ void wxAppConsoleBase::CleanUp() m_mainLoop = NULL; } - delete wxPendingEvents; - wxPendingEvents = NULL; + delete wxHandlersWithPendingEvents; + wxHandlersWithPendingEvents = NULL; #if wxUSE_THREADS - delete wxPendingEventsLocker; - wxPendingEventsLocker = NULL; + delete wxHandlersWithPendingEventsLocker; + wxHandlersWithPendingEventsLocker = NULL; #endif // wxUSE_THREADS } @@ -243,7 +243,7 @@ int wxAppConsoleBase::OnExit() #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; @@ -327,11 +327,11 @@ bool wxAppConsoleBase::Dispatch() bool wxAppConsoleBase::HasPendingEvents() const { - wxENTER_CRIT_SECT( *wxPendingEventsLocker ); + wxENTER_CRIT_SECT( *wxHandlersWithPendingEventsLocker ); - bool has = wxPendingEvents && !wxPendingEvents->IsEmpty(); + bool has = wxHandlersWithPendingEvents && !wxHandlersWithPendingEvents->IsEmpty(); - wxLEAVE_CRIT_SECT( *wxPendingEventsLocker ); + wxLEAVE_CRIT_SECT( *wxHandlersWithPendingEventsLocker ); return has; } @@ -347,34 +347,34 @@ bool wxAppConsoleBase::IsMainLoopRunning() void wxAppConsoleBase::ProcessPendingEvents() { #if wxUSE_THREADS - if ( !wxPendingEventsLocker ) + if ( !wxHandlersWithPendingEventsLocker ) return; #endif - wxENTER_CRIT_SECT( *wxPendingEventsLocker ); + wxENTER_CRIT_SECT( *wxHandlersWithPendingEventsLocker ); - if (wxPendingEvents) + if (wxHandlersWithPendingEvents) { // iterate until the list becomes empty: the handlers remove themselves // from it when they don't have any more pending events - wxList::compatibility_iterator node = wxPendingEvents->GetFirst(); + wxList::compatibility_iterator node = wxHandlersWithPendingEvents->GetFirst(); while (node) { // In ProcessPendingEvents(), new handlers might be add // and we can safely leave the critical section here. - wxLEAVE_CRIT_SECT( *wxPendingEventsLocker ); + wxLEAVE_CRIT_SECT( *wxHandlersWithPendingEventsLocker ); wxEvtHandler *handler = (wxEvtHandler *)node->GetData(); handler->ProcessPendingEvents(); - wxENTER_CRIT_SECT( *wxPendingEventsLocker ); + wxENTER_CRIT_SECT( *wxHandlersWithPendingEventsLocker ); // restart as the iterators could have been invalidated - node = wxPendingEvents->GetFirst(); + node = wxHandlersWithPendingEvents->GetFirst(); } } - wxLEAVE_CRIT_SECT( *wxPendingEventsLocker ); + wxLEAVE_CRIT_SECT( *wxHandlersWithPendingEventsLocker ); } void wxAppConsoleBase::WakeUpIdle() @@ -385,6 +385,9 @@ void wxAppConsoleBase::WakeUpIdle() bool wxAppConsoleBase::ProcessIdle() { + // process pending wx events before sending idle events + ProcessPendingEvents(); + wxIdleEvent event; event.SetEventObject(this); @@ -413,6 +416,20 @@ wxAppConsoleBase::HandleEvent(wxEvtHandler *handler, (handler->*func)(event); } +void wxAppConsoleBase::CallEventHandler(wxEvtHandler *handler, + wxEventFunctor& functor, + wxEvent& event) const +{ + // If the functor holds a method then, for backward compatibility, call + // HandleEvent(): + wxEventFunction eventFunction = functor.GetMethod(); + + if ( eventFunction ) + HandleEvent(handler, eventFunction, event); + else + functor(handler, event); +} + void wxAppConsoleBase::OnUnhandledException() { #ifdef __WXDEBUG__