X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/97d7bfb8b470d62d8b2f142d5287b8217d9f3e8b..270a909e20a2c652fd816ad14407113ad0319c9d:/src/common/event.cpp?ds=sidebyside diff --git a/src/common/event.cpp b/src/common/event.cpp index d3abd577ab..795bbef448 100644 --- a/src/common/event.cpp +++ b/src/common/event.cpp @@ -542,7 +542,9 @@ wxEvtHandler::wxEvtHandler() m_isWindow = FALSE; m_pendingEvents = (wxList *) NULL; #if wxUSE_THREADS +# if !defined(__VISAGECPP__) m_eventsLocker = new wxCriticalSection; +# endif #endif } @@ -571,7 +573,9 @@ wxEvtHandler::~wxEvtHandler() delete m_pendingEvents; #if wxUSE_THREADS +# if !defined(__VISAGECPP__) delete m_eventsLocker; +# endif #endif } @@ -579,8 +583,6 @@ wxEvtHandler::~wxEvtHandler() bool wxEvtHandler::ProcessThreadEvent(wxEvent& event) { - wxCriticalSectionLocker locker(*m_eventsLocker); - // check that we are really in a child thread wxASSERT_MSG( !wxThread::IsMain(), wxT("use ProcessEvent() in main thread") ); @@ -594,6 +596,14 @@ bool wxEvtHandler::ProcessThreadEvent(wxEvent& event) void wxEvtHandler::AddPendingEvent(wxEvent& event) { + // 1) Add event to list of pending events of this event handler + +#if defined(__VISAGECPP__) + wxENTER_CRIT_SECT( m_eventsLocker); +#else + wxENTER_CRIT_SECT( *m_eventsLocker); +#endif + if ( !m_pendingEvents ) m_pendingEvents = new wxList; @@ -601,32 +611,66 @@ void wxEvtHandler::AddPendingEvent(wxEvent& event) m_pendingEvents->Append(event2); - wxENTER_CRIT_SECT(wxPendingEventsLocker); +#if defined(__VISAGECPP__) + wxLEAVE_CRIT_SECT( m_eventsLocker); +#else + wxLEAVE_CRIT_SECT( *m_eventsLocker); +#endif + + // 2) Add this event handler to list of event handlers that + // have pending events. + + wxENTER_CRIT_SECT(*wxPendingEventsLocker); if ( !wxPendingEvents ) wxPendingEvents = new wxList; wxPendingEvents->Append(this); - wxLEAVE_CRIT_SECT(wxPendingEventsLocker); - + // 3) Inform the system that new pending events are somwehere, + // and that these should be processed in idle time. + wxWakeUpIdle(); + + wxLEAVE_CRIT_SECT(*wxPendingEventsLocker); } void wxEvtHandler::ProcessPendingEvents() { - wxCRIT_SECT_LOCKER(locker, m_eventsLocker); +#if defined(__VISAGECPP__) + wxENTER_CRIT_SECT( m_eventsLocker); +#else + wxENTER_CRIT_SECT( *m_eventsLocker); +#endif wxNode *node = m_pendingEvents->First(); - wxEvent *event; - while ( node ) { - event = (wxEvent *)node->Data(); + wxEvent *event = (wxEvent *)node->Data(); + delete node; + + // In ProcessEvent, new events might get added and + // we can safely leave the crtical section here. +#if defined(__VISAGECPP__) + wxLEAVE_CRIT_SECT( m_eventsLocker); +#else + wxLEAVE_CRIT_SECT( *m_eventsLocker); +#endif ProcessEvent(*event); delete event; - delete node; +#if defined(__VISAGECPP__) + wxENTER_CRIT_SECT( m_eventsLocker); +#else + wxENTER_CRIT_SECT( *m_eventsLocker); +#endif + node = m_pendingEvents->First(); } + +#if defined(__VISAGECPP__) + wxLEAVE_CRIT_SECT( m_eventsLocker); +#else + wxLEAVE_CRIT_SECT( *m_eventsLocker); +#endif } /*