X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/0dba08dd3987303ff116bf77d5fb877b6d8f32d0..622f7a49ef5ddf9a47096e14bf1f8d93be3c8668:/src/common/wincmn.cpp?ds=inline diff --git a/src/common/wincmn.cpp b/src/common/wincmn.cpp index bf4f7da301..03e49a2a0c 100644 --- a/src/common/wincmn.cpp +++ b/src/common/wincmn.cpp @@ -379,6 +379,12 @@ wxWindowBase::~wxWindowBase() #endif } +bool wxWindowBase::IsBeingDeleted() const +{ + return m_isBeingDeleted || + (!IsTopLevel() && m_parent && m_parent->IsBeingDeleted()); +} + void wxWindowBase::SendDestroyEvent() { wxWindowDestroyEvent event; @@ -841,18 +847,21 @@ void wxWindowBase::DoGetScreenPosition(int *x, int *y) const ClientToScreen(x, y); } -void wxWindowBase::SendSizeEvent() +void wxWindowBase::SendSizeEvent(int flags) { wxSizeEvent event(GetSize(), GetId()); event.SetEventObject(this); - HandleWindowEvent(event); + if ( flags & wxSEND_EVENT_POST ) + wxPostEvent(this, event); + else + HandleWindowEvent(event); } -void wxWindowBase::SendSizeEventToParent() +void wxWindowBase::SendSizeEventToParent(int flags) { wxWindow * const parent = GetParent(); if ( parent && !parent->IsBeingDeleted() ) - parent->SendSizeEvent(); + parent->SendSizeEvent(flags); } // ---------------------------------------------------------------------------- @@ -1004,7 +1013,7 @@ void wxWindowBase::AddChild(wxWindowBase *child) GetChildren().Append((wxWindow*)child); child->SetParent(this); - // adding a child while frozen will assert when thawn, so freeze it as if + // adding a child while frozen will assert when thawed, so freeze it as if // it had been already present when we were frozen if ( IsFrozen() && !child->IsTopLevel() ) child->Freeze(); @@ -1016,7 +1025,10 @@ void wxWindowBase::RemoveChild(wxWindowBase *child) // removing a child while frozen may result in permanently frozen window // if used e.g. from Reparent(), so thaw it - if ( IsFrozen() && !child->IsTopLevel() ) + // + // NB: IsTopLevel() doesn't return true any more when a TLW child is being + // removed from its ~wxWindowBase, so check for IsBeingDeleted() too + if ( IsFrozen() && !child->IsBeingDeleted() && !child->IsTopLevel() ) child->Thaw(); GetChildren().DeleteObject((wxWindow *)child); @@ -2635,7 +2647,10 @@ void wxWindowBase::ReleaseMouse() wxASSERT_MSG( !ms_winCaptureChanging, _T("recursive ReleaseMouse call?") ); - wxASSERT_MSG( GetCapture() == this, wxT("attempt to release mouse, but this window hasn't captured it") ); + wxASSERT_MSG( GetCapture() == this, + "attempt to release mouse, but this window hasn't captured it" ); + wxASSERT_MSG( ms_winCaptureCurrent == this, + "attempt to release mouse, but this window hasn't captured it" ); ms_winCaptureChanging = true; @@ -2732,8 +2747,8 @@ bool wxWindowBase::TryValidator(wxEvent& wxVALIDATOR_PARAM(event)) // is receiving the event if ( event.GetEventObject() == this ) { - wxValidator *validator = GetValidator(); - if ( validator && validator->ProcessEvent(event) ) + wxValidator * const validator = GetValidator(); + if ( validator && validator->ProcessEventHere(event) ) { return true; }