X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/7ce2fb71397346ceaba2ea49b73df72c3cdcafb4..3a6ec3c88033c43e108cb1f302717696682eb34f:/src/common/event.cpp diff --git a/src/common/event.cpp b/src/common/event.cpp index 7b33c11e77..590c3adf3e 100644 --- a/src/common/event.cpp +++ b/src/common/event.cpp @@ -561,7 +561,10 @@ wxMouseEvent::wxMouseEvent(wxEventType commandType) 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(this) = event; m_x = event.m_x; m_y = event.m_y; @@ -1140,8 +1143,6 @@ void wxEvtHandler::QueueEvent(wxEvent *event) m_pendingEvents->Append(event); - wxLEAVE_CRIT_SECT( m_pendingEventsLock ); - // 2) Add this event handler to list of event handlers that // have pending events. @@ -1154,6 +1155,14 @@ void wxEvtHandler::QueueEvent(wxEvent *event) 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(); @@ -1169,7 +1178,7 @@ void wxEvtHandler::ProcessPendingEvents() "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(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 @@ -1289,7 +1298,7 @@ bool wxEvtHandler::ProcessEvent(wxEvent& event) 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); } @@ -1374,7 +1383,7 @@ bool wxEvtHandler::SearchEventTable(wxEventTable& table, wxEvent& event) } void wxEvtHandler::Connect( int id, int lastId, - int eventType, + wxEventType eventType, wxObjectEventFunction func, wxObject *userData, wxEvtHandler* eventSink ) @@ -1395,7 +1404,7 @@ void wxEvtHandler::Connect( int id, int lastId, if ( evtConnRef ) evtConnRef->IncRef( ); else - evtConnRef = new wxEventConnectionRef(this, eventSink); + new wxEventConnectionRef(this, eventSink); } }