]> git.saurik.com Git - wxWidgets.git/blobdiff - src/common/event.cpp
removed wxHtmlParser::GetTempData (internal function, obsoleted)
[wxWidgets.git] / src / common / event.cpp
index d3abd577abd1a6c260444ee7b48f2a3b54e2b663..4b157d7e99d4525b4ce454ad0880a8a7a78edabe 100644 (file)
@@ -50,7 +50,6 @@
 // wxWin macros
 // ----------------------------------------------------------------------------
 
-#if !USE_SHARED_LIBRARY
     IMPLEMENT_DYNAMIC_CLASS(wxEvtHandler, wxObject)
     IMPLEMENT_ABSTRACT_CLASS(wxEvent, wxObject)
     IMPLEMENT_DYNAMIC_CLASS(wxIdleEvent, wxEvent)
@@ -94,7 +93,6 @@
     const wxEventTableEntry wxEvtHandler::sm_eventTableEntries[] =
         { { 0, 0, 0, (wxObjectEventFunction) NULL, (wxObject*) NULL } };
 
-#endif // !USE_SHARED_LIBRARY
 
 // ----------------------------------------------------------------------------
 // global variables
@@ -542,7 +540,9 @@ wxEvtHandler::wxEvtHandler()
     m_isWindow = FALSE;
     m_pendingEvents = (wxList *) NULL;
 #if wxUSE_THREADS
+#  if !defined(__VISAGECPP__)
     m_eventsLocker = new wxCriticalSection;
+#  endif
 #endif
 }
 
@@ -571,7 +571,9 @@ wxEvtHandler::~wxEvtHandler()
     delete m_pendingEvents;
 
 #if wxUSE_THREADS
+#  if !defined(__VISAGECPP__)
     delete m_eventsLocker;
+#  endif
 #endif
 }
 
@@ -579,8 +581,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 +594,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 +609,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
 }
 
 /*