]> git.saurik.com Git - wxWidgets.git/blobdiff - src/common/event.cpp
wxSocekt now uses wxPostEvent.
[wxWidgets.git] / src / common / event.cpp
index e6190d9674e9f057fab8489bd94bbfbad063e8de..97f135ff08c874c6106e64ec2802c752be135757 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
@@ -175,10 +173,24 @@ void wxCommandEvent::CopyObject(wxObject& obj_d) const
 
     wxEvent::CopyObject(obj_d);
 
-    obj->m_clientData   = m_clientData;
-    obj->m_clientObject = m_clientObject;
-    obj->m_extraLong    = m_extraLong;
-    obj->m_commandInt   = m_commandInt;
+    obj->m_clientData    = m_clientData;
+    obj->m_clientObject  = m_clientObject;
+    obj->m_extraLong     = m_extraLong;
+    obj->m_commandInt    = m_commandInt;
+    obj->m_commandString = m_commandString;
+}
+
+/*
+ * Notify events
+ */
+
+void wxNotifyEvent::CopyObject(wxObject& obj_d) const
+{
+    wxNotifyEvent *obj = (wxNotifyEvent *)&obj_d;
+
+    wxEvent::CopyObject(obj_d);
+
+    if (!m_bAllow) obj->Veto();
 }
 
 /*
@@ -382,6 +394,10 @@ void wxKeyEvent::CopyObject(wxObject& obj_d) const
     wxKeyEvent *obj = (wxKeyEvent *)&obj_d;
     wxEvent::CopyObject(obj_d);
 
+    obj->m_x = m_x;
+    obj->m_y = m_y;
+    obj->m_keyCode = m_keyCode;
+    
     obj->m_shiftDown   = m_shiftDown;
     obj->m_controlDown = m_controlDown;
     obj->m_metaDown    = m_metaDown;
@@ -508,14 +524,16 @@ void wxQueryNewPaletteEvent::CopyObject(wxObject& obj_d) const
 }
 
 wxWindowCreateEvent::wxWindowCreateEvent(wxWindow *win)
-                   : wxEvent(wxEVT_CREATE)
+                   : wxEvent()
 {
+    SetEventType(wxEVT_CREATE);
     SetEventObject(win);
 }
 
 wxWindowDestroyEvent::wxWindowDestroyEvent(wxWindow *win)
-                    : wxEvent(wxEVT_DESTROY)
+                    : wxEvent()
 {
+    SetEventType(wxEVT_DESTROY);
     SetEventObject(win);
 }
 
@@ -583,12 +601,6 @@ 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(),
                   wxT("use ProcessEvent() in main thread") );
@@ -602,6 +614,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;
 
@@ -609,6 +629,15 @@ void wxEvtHandler::AddPendingEvent(wxEvent& event)
 
     m_pendingEvents->Append(event2);
 
+#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 )
@@ -616,29 +645,49 @@ void wxEvtHandler::AddPendingEvent(wxEvent& event)
     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();
 }
 
 void wxEvtHandler::ProcessPendingEvents()
 {
 #if defined(__VISAGECPP__)
-    wxCRIT_SECT_LOCKER(locker, m_eventsLocker);
+    wxENTER_CRIT_SECT( m_eventsLocker);
 #else
-    wxCRIT_SECT_LOCKER(locker, *m_eventsLocker);
+    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
 }
 
 /*
@@ -655,11 +704,18 @@ bool wxEvtHandler::ProcessEvent(wxEvent& event)
     // An event handler can be enabled or disabled
     if ( GetEvtHandlerEnabled() )
     {
-#if wxUSE_THREADS
+    
+#if 0
+/*
+        What is this? When using GUI threads, a non main
+        threads can send an event and process it itself.
+        This breaks GTK's GUI threads, so please explain.
+*/
+
         // Check whether we are in a child thread.
         if ( !wxThread::IsMain() )
           return ProcessThreadEvent(event);
-#endif // wxUSE_THREADS
+#endif
 
         // Handle per-instance dynamic event tables first
         if ( m_dynamicEvents && SearchDynamicEventTable(event) )
@@ -797,7 +853,7 @@ bool wxEvtHandler::Disconnect( int id, int lastId, wxEventType eventType,
 {
     if (!m_dynamicEvents)
         return FALSE;
-       
+
     wxNode *node = m_dynamicEvents->First();
     while (node)
     {