void wxMouseEvent::Assign(const wxMouseEvent& event)
{
wxEvent::operator=(event);
- wxMouseState::operator=(event);
+
+ // Borland C++ 5.82 doesn't compile an explicit call to an implicitly
+ // defined operator=() so need to do it this way:
+ *static_cast<wxMouseState *>(this) = event;
m_x = event.m_x;
m_y = event.m_y;
m_pendingEvents->Append(event);
- wxLEAVE_CRIT_SECT( m_pendingEventsLock );
-
// 2) Add this event handler to list of event handlers that
// have pending events.
wxLEAVE_CRIT_SECT(*wxPendingEventsLocker);
+ // only release m_pendingEventsLock now because otherwise there is a race
+ // condition as described in the ticket #9093: we could process the event
+ // just added to m_pendingEvents in our ProcessPendingEvents() below before
+ // we had time to append this pointer to wxPendingEvents list; thus
+ // breaking the invariant that a handler should be in the list iff it has
+ // any pending events to process
+ wxLEAVE_CRIT_SECT( m_pendingEventsLock );
+
// 3) Inform the system that new pending events are somewhere,
// and that these should be processed in idle time.
wxWakeUpIdle();
"should have pending events if called" );
wxList::compatibility_iterator node = m_pendingEvents->GetFirst();
- wxEventPtr event(wx_static_cast(wxEvent *, node->GetData()));
+ wxEventPtr event(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
return true;
// propagate the event upwards the window chain and/or to the application
- // object if it wasn't processed at this level
+ // object if it wasn't processed at this level
return TryParent(event);
}
}
void wxEvtHandler::Connect( int id, int lastId,
- int eventType,
+ wxEventType eventType,
wxObjectEventFunction func,
wxObject *userData,
wxEvtHandler* eventSink )
if ( evtConnRef )
evtConnRef->IncRef( );
else
- evtConnRef = new wxEventConnectionRef(this, eventSink);
+ new wxEventConnectionRef(this, eventSink);
}
}