#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
// ----------------------------------------------------------------------------
DEFINE_EVENT_TYPE(wxEVT_COMMAND_TOOL_RCLICKED)
DEFINE_EVENT_TYPE(wxEVT_COMMAND_TOOL_ENTER)
DEFINE_EVENT_TYPE(wxEVT_COMMAND_SPINCTRL_UPDATED)
+DEFINE_EVENT_TYPE(wxEVT_COMMAND_SPINCTRLDOUBLE_UPDATED)
DEFINE_EVENT_TYPE(wxEVT_COMMAND_TOOL_DROPDOWN_CLICKED)
// Mouse event types
#endif // wxUSE_THREADS
-void wxEvtHandler::AddPendingEvent(const wxEvent& event)
+void wxEvtHandler::QueueEvent(wxEvent *event)
{
- // 1) Add event to list of pending events of this event handler
-
- wxEvent *eventCopy = event.Clone();
-
- // we must be able to copy the events here so the event class must
- // implement Clone() properly instead of just providing a NULL stab for it
- wxCHECK_RET( eventCopy,
- _T("events of this type aren't supposed to be posted") );
+ wxCHECK_RET( event, "NULL event can't be posted" );
+ // 1) Add this event to our list of pending events
wxENTER_CRIT_SECT( m_pendingEventsLock );
if ( !m_pendingEvents )
m_pendingEvents = new wxList;
- m_pendingEvents->Append(eventCopy);
+ m_pendingEvents->Append(event);
wxLEAVE_CRIT_SECT( m_pendingEventsLock );
"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
// if there are no more pending events left, we don't need to stay in this
// list
if ( m_pendingEvents->IsEmpty() )
+ {
+#if wxUSE_THREADS
+ if (wxPendingEventsLocker)
+ wxENTER_CRIT_SECT(*wxPendingEventsLocker);
+#endif
wxPendingEvents->DeleteObject(this);
+#if wxUSE_THREADS
+ if (wxPendingEventsLocker)
+ wxLEAVE_CRIT_SECT(*wxPendingEventsLocker);
+#endif
+ }
wxLEAVE_CRIT_SECT( m_pendingEventsLock );
// 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;
}
/*
m_dynamicEvents->Insert( (wxObject*) entry );
// Make sure we get to know when a sink is destroyed
- if ( eventSink )
+ if ( eventSink && eventSink != this )
{
wxEventConnectionRef *evtConnRef = FindRefInTrackerList(eventSink);
if ( evtConnRef )
return false;
// Remove connection from tracker node (wxEventConnectionRef)
- if ( eventSink )
+ if ( eventSink && eventSink != this )
{
wxEventConnectionRef *evtConnRef = FindRefInTrackerList(eventSink);
if ( evtConnRef )