X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/8b93348e82c0906364ef2e020fd1adaaa49f519f..c437b3f4e47b74715a2f2385d4862972babd7802:/src/common/evtloopcmn.cpp diff --git a/src/common/evtloopcmn.cpp b/src/common/evtloopcmn.cpp index 29e2d7c423..15813725a8 100644 --- a/src/common/evtloopcmn.cpp +++ b/src/common/evtloopcmn.cpp @@ -34,114 +34,26 @@ wxEventLoopBase::wxEventLoopBase() m_eventsToProcessInsideYield = wxEVT_CATEGORY_ALL; } -void wxEventLoopBase::DelayPendingEventHandler(wxEvtHandler* toDelay) +bool wxEventLoopBase::IsMain() const { - wxENTER_CRIT_SECT(m_handlersWithPendingEventsLocker); - - // move the handler from the list of handlers with processable pending events - // to the list of handlers with pending events which needs to be processed later - m_handlersWithPendingEvents.Remove(toDelay); - - if (m_handlersWithPendingDelayedEvents.Index(toDelay) == wxNOT_FOUND) - m_handlersWithPendingDelayedEvents.Add(toDelay); - - wxLEAVE_CRIT_SECT(m_handlersWithPendingEventsLocker); -} - -void wxEventLoopBase::RemovePendingEventHandler(wxEvtHandler* toRemove) -{ - wxENTER_CRIT_SECT(m_handlersWithPendingEventsLocker); - - if (m_handlersWithPendingEvents.Index(toRemove) != wxNOT_FOUND) - { - m_handlersWithPendingEvents.Remove(toRemove); - - // check that the handler was present only once in the list - wxASSERT_MSG( m_handlersWithPendingEvents.Index(toRemove) == wxNOT_FOUND, - "Handler occurs twice in the m_handlersWithPendingEvents list!" ); - } - //else: it wasn't in this list at all, it's ok - - if (m_handlersWithPendingDelayedEvents.Index(toRemove) != wxNOT_FOUND) - { - m_handlersWithPendingDelayedEvents.Remove(toRemove); - - // check that the handler was present only once in the list - wxASSERT_MSG( m_handlersWithPendingDelayedEvents.Index(toRemove) == wxNOT_FOUND, - "Handler occurs twice in m_handlersWithPendingDelayedEvents list!" ); - } - //else: it wasn't in this list at all, it's ok - - wxLEAVE_CRIT_SECT(m_handlersWithPendingEventsLocker); -} - -void wxEventLoopBase::AppendPendingEventHandler(wxEvtHandler* toAppend) -{ - wxENTER_CRIT_SECT(m_handlersWithPendingEventsLocker); - - if ( m_handlersWithPendingEvents.Index(toAppend) == wxNOT_FOUND ) - m_handlersWithPendingEvents.Add(toAppend); - - wxLEAVE_CRIT_SECT(m_handlersWithPendingEventsLocker); -} - -bool wxEventLoopBase::HasPendingEvents() const -{ - wxENTER_CRIT_SECT(const_cast(this)->m_handlersWithPendingEventsLocker); - - bool has = !m_handlersWithPendingEvents.IsEmpty(); - - wxLEAVE_CRIT_SECT(const_cast(this)->m_handlersWithPendingEventsLocker); - - return has; + if (wxTheApp) + return wxTheApp->GetMainLoop() == this; + return false; } -void wxEventLoopBase::SuspendProcessingOfPendingEvents() +/* static */ +void wxEventLoopBase::SetActive(wxEventLoopBase* loop) { - wxENTER_CRIT_SECT(m_handlersWithPendingEventsLocker); -} + ms_activeLoop = loop; -void wxEventLoopBase::ResumeProcessingOfPendingEvents() -{ - wxLEAVE_CRIT_SECT(m_handlersWithPendingEventsLocker); + if (wxTheApp) + wxTheApp->OnEventLoopEnter(loop); } -void wxEventLoopBase::ProcessPendingEvents() +void wxEventLoopBase::OnExit() { - wxENTER_CRIT_SECT(m_handlersWithPendingEventsLocker); - - wxCHECK_RET( m_handlersWithPendingDelayedEvents.IsEmpty(), - "this helper list should be empty" ); - - // iterate until the list becomes empty: the handlers remove themselves - // from it when they don't have any more pending events - while (!m_handlersWithPendingEvents.IsEmpty()) - { - // In ProcessPendingEvents(), new handlers might be added - // and we can safely leave the critical section here. - wxLEAVE_CRIT_SECT(m_handlersWithPendingEventsLocker); - - // NOTE: we always call ProcessPendingEvents() on the first event handler - // with pending events because handlers auto-remove themselves - // from this list (see RemovePendingEventHandler) if they have no - // more pending events. - m_handlersWithPendingEvents[0]->ProcessPendingEvents(); - - wxENTER_CRIT_SECT(m_handlersWithPendingEventsLocker); - } - - // 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 (!m_handlersWithPendingDelayedEvents.IsEmpty()) - { - WX_APPEND_ARRAY(m_handlersWithPendingEvents, m_handlersWithPendingDelayedEvents); - m_handlersWithPendingDelayedEvents.Clear(); - } - - wxLEAVE_CRIT_SECT(m_handlersWithPendingEventsLocker); + if (wxTheApp) + wxTheApp->OnEventLoopExit(this); } void wxEventLoopBase::WakeUpIdle() @@ -151,13 +63,17 @@ void wxEventLoopBase::WakeUpIdle() bool wxEventLoopBase::ProcessIdle() { + if (!wxTheApp) + return false; + // process pending wx events before sending idle events - ProcessPendingEvents(); + wxTheApp->ProcessPendingEvents(); + // synthetize an idle event and send it to wxApp wxIdleEvent event; - event.SetEventObject(wxTheApp); wxTheApp->ProcessEvent(event); + return event.MoreRequested(); }