]> git.saurik.com Git - wxWidgets.git/blobdiff - src/common/event.cpp
Partial fix for big_endian image conversion probs.
[wxWidgets.git] / src / common / event.cpp
index 32b436d3a969331365109d4db904d62497cbb766..fb953f101acdfd9b4adf8c371d30f0ad53f0d1f8 100644 (file)
@@ -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();
-#else // 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,