X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/e87271f35887a50e011c7c97fc63c35f5d623e50..285c163f987b73d7773c758db75a925d380764fa:/src/common/event.cpp diff --git a/src/common/event.cpp b/src/common/event.cpp index 1b71ae0912..fb953f101a 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,7 +583,11 @@ wxEvtHandler::~wxEvtHandler() bool wxEvtHandler::ProcessThreadEvent(wxEvent& event) { +#if defined(__VISAGECPP__) + wxCriticalSectionLocker locker(m_eventsLocker); +#else wxCriticalSectionLocker locker(*m_eventsLocker); +#endif // check that we are really in a child thread wxASSERT_MSG( !wxThread::IsMain(), @@ -609,23 +617,16 @@ void wxEvtHandler::AddPendingEvent(wxEvent& event) wxLEAVE_CRIT_SECT(wxPendingEventsLocker); - // TODO: Wake up idle handler for the other platforms. -#ifdef __WXGTK__ - extern bool g_isIdle; - extern void wxapp_install_idle_handler(); - if ( g_isIdle ) - wxapp_install_idle_handler(); -#elif wxUSE_GUI // this works for wxMSW, but may be for others too? - // might also send a dummy message to the top level window, this would - // probably be cleaner? - wxIdleEvent eventIdle; - wxTheApp->OnIdle(eventIdle); -#endif // platform + wxWakeUpIdle(); } void wxEvtHandler::ProcessPendingEvents() { +#if defined(__VISAGECPP__) + wxCRIT_SECT_LOCKER(locker, &m_eventsLocker); +#else wxCRIT_SECT_LOCKER(locker, m_eventsLocker); +#endif wxNode *node = m_pendingEvents->First(); wxEvent *event; @@ -634,6 +635,7 @@ void wxEvtHandler::ProcessPendingEvents() { event = (wxEvent *)node->Data(); ProcessEvent(*event); + delete event; delete node; node = m_pendingEvents->First(); } @@ -770,6 +772,7 @@ bool wxEvtHandler::SearchEventTable(wxEventTable& table, wxEvent& event) } return FALSE; } + void wxEvtHandler::Connect( int id, int lastId, wxEventType eventType, wxObjectEventFunction func, @@ -788,6 +791,33 @@ void wxEvtHandler::Connect( int id, int lastId, m_dynamicEvents->Append( (wxObject*) entry ); } +bool wxEvtHandler::Disconnect( int id, int lastId, wxEventType eventType, + wxObjectEventFunction func, + wxObject *userData ) +{ + if (!m_dynamicEvents) + return FALSE; + + wxNode *node = m_dynamicEvents->First(); + while (node) + { + wxEventTableEntry *entry = (wxEventTableEntry*)node->Data(); + if ((entry->m_id == id) && + ((entry->m_lastId == lastId) || (lastId == -1)) && + ((entry->m_eventType == eventType) || (eventType == wxEVT_NULL)) && + ((entry->m_fn == func) || (func == (wxObjectEventFunction)NULL)) && + ((entry->m_callbackUserData == userData) || (userData == (wxObject*)NULL))) + { + if (entry->m_callbackUserData) delete entry->m_callbackUserData; + m_dynamicEvents->DeleteNode( node ); + delete entry; + return TRUE; + } + node = node->Next(); + } + return FALSE; +} + bool wxEvtHandler::SearchDynamicEventTable( wxEvent& event ) { wxCHECK_MSG( m_dynamicEvents, FALSE,