X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/cc6ceca789f584cf3fc3fc17f6da4b7493ca69bd..bba35861478a26f5d8c756a9a7fa2bbd19a69cb1:/src/common/event.cpp diff --git a/src/common/event.cpp b/src/common/event.cpp index a03b9fe1b9..da4b8066bc 100644 --- a/src/common/event.cpp +++ b/src/common/event.cpp @@ -45,6 +45,13 @@ #include "wx/thread.h" +#if wxUSE_BASE + #include "wx/ptr_scpd.h" + + wxDECLARE_SCOPED_PTR(wxEvent, wxEventPtr) + wxDEFINE_SCOPED_PTR(wxEvent, wxEventPtr) +#endif // wxUSE_BASE + // ---------------------------------------------------------------------------- // wxWin macros // ---------------------------------------------------------------------------- @@ -1053,6 +1060,7 @@ wxEvtHandler::~wxEvtHandler() { wxDynamicEventTableEntry *entry = (wxDynamicEventTableEntry*)*it; +#if wxUSE_WEAKREF // Remove ourselves from sink destructor notifications // (this has usually been been done, in wxTrackable destructor) wxEvtHandler *eventSink = entry->m_eventSink; @@ -1066,6 +1074,7 @@ wxEvtHandler::~wxEvtHandler() delete evtConnRef; } } +#endif // wxUSE_WEAKREF if (entry->m_callbackUserData) delete entry->m_callbackUserData; @@ -1167,7 +1176,7 @@ void wxEvtHandler::ProcessPendingEvents() "should have pending events if called" ); wxList::compatibility_iterator node = m_pendingEvents->GetFirst(); - wxEvent * const event = wx_static_cast(wxEvent *, node->GetData()); + wxEventPtr event(wx_static_cast(wxEvent *, node->GetData())); // it's important we remove event from list before processing it, else a // nested event loop, for example from a modal dialog, might process the @@ -1186,8 +1195,6 @@ void wxEvtHandler::ProcessPendingEvents() // careful: this object could have been deleted by the event handler // executed by the above ProcessEvent() call, so we can't access any fields // of this object any more - - delete event; } /* @@ -1367,8 +1374,9 @@ void wxEvtHandler::Connect( int id, int lastId, // Insert at the front of the list so most recent additions are found first m_dynamicEvents->Insert( (wxObject*) entry ); +#if wxUSE_WEAKREF // Make sure we get to know when a sink is destroyed - if ( eventSink ) + if ( eventSink && eventSink != this ) { wxEventConnectionRef *evtConnRef = FindRefInTrackerList(eventSink); if ( evtConnRef ) @@ -1376,6 +1384,7 @@ void wxEvtHandler::Connect( int id, int lastId, else evtConnRef = new wxEventConnectionRef(this, eventSink); } +#endif // wxUSE_WEAKREF } bool wxEvtHandler::Disconnect( int id, int lastId, wxEventType eventType, @@ -1386,13 +1395,15 @@ bool wxEvtHandler::Disconnect( int id, int lastId, wxEventType eventType, if (!m_dynamicEvents) return false; +#if wxUSE_WEAKREF // Remove connection from tracker node (wxEventConnectionRef) - if ( eventSink ) + if ( eventSink && eventSink != this ) { wxEventConnectionRef *evtConnRef = FindRefInTrackerList(eventSink); if ( evtConnRef ) evtConnRef->DecRef(); } +#endif // wxUSE_WEAKREF wxList::compatibility_iterator node = m_dynamicEvents->GetFirst(); while (node) @@ -1484,6 +1495,7 @@ void *wxEvtHandler::DoGetClientData() const return m_clientData; } +#if wxUSE_WEAKREF // A helper to find an wxEventConnectionRef object wxEventConnectionRef * wxEvtHandler::FindRefInTrackerList(wxEvtHandler *eventSink) @@ -1523,6 +1535,7 @@ void wxEvtHandler::OnSinkDestroyed( wxEvtHandler *sink ) node = node_nxt; } } +#endif // wxUSE_WEAKREF #endif // wxUSE_BASE