m_isWindow = FALSE;
m_pendingEvents = (wxList *) NULL;
#if wxUSE_THREADS
+# if !defined(__VISAGECPP__)
m_eventsLocker = new wxCriticalSection;
+# endif
#endif
}
delete m_pendingEvents;
#if wxUSE_THREADS
+# if !defined(__VISAGECPP__)
delete m_eventsLocker;
+# endif
#endif
}
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(),
wxLEAVE_CRIT_SECT(wxPendingEventsLocker);
- // TODO: Wake up idle handler for the other platforms.
-#ifdef __WXGTK__
wxWakeUpIdle();
-#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
}
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;
{
event = (wxEvent *)node->Data();
ProcessEvent(*event);
+ delete event;
delete node;
node = m_pendingEvents->First();
}
}
return FALSE;
}
+
void wxEvtHandler::Connect( int id, int lastId,
wxEventType eventType,
wxObjectEventFunction func,
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,