handle child destruction notifications in wxTLW itself and reset both normal and temporary default item pointers when the default window is destroyed
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@45275 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -295,6 +295,11 @@ protected:
|
|||||||
static int WidthDefault(int w) { return w == wxDefaultCoord ? GetDefaultSize().x : w; }
|
static int WidthDefault(int w) { return w == wxDefaultCoord ? GetDefaultSize().x : w; }
|
||||||
static int HeightDefault(int h) { return h == wxDefaultCoord ? GetDefaultSize().y : h; }
|
static int HeightDefault(int h) { return h == wxDefaultCoord ? GetDefaultSize().y : h; }
|
||||||
|
|
||||||
|
// reset m_winDefault and m_winTmpDefault if they point to the window being
|
||||||
|
// destroyed
|
||||||
|
void OnChildDestroy(wxWindowDestroyEvent& event);
|
||||||
|
|
||||||
|
|
||||||
// the frame icon
|
// the frame icon
|
||||||
wxIconBundle m_icons;
|
wxIconBundle m_icons;
|
||||||
|
|
||||||
|
@@ -39,6 +39,7 @@
|
|||||||
BEGIN_EVENT_TABLE(wxTopLevelWindowBase, wxWindow)
|
BEGIN_EVENT_TABLE(wxTopLevelWindowBase, wxWindow)
|
||||||
EVT_CLOSE(wxTopLevelWindowBase::OnCloseWindow)
|
EVT_CLOSE(wxTopLevelWindowBase::OnCloseWindow)
|
||||||
EVT_SIZE(wxTopLevelWindowBase::OnSize)
|
EVT_SIZE(wxTopLevelWindowBase::OnSize)
|
||||||
|
EVT_WINDOW_DESTROY(wxTopLevelWindowBase::OnChildDestroy)
|
||||||
END_EVENT_TABLE()
|
END_EVENT_TABLE()
|
||||||
|
|
||||||
// ============================================================================
|
// ============================================================================
|
||||||
@@ -369,6 +370,17 @@ void wxTopLevelWindowBase::OnCloseWindow(wxCloseEvent& WXUNUSED(event))
|
|||||||
Destroy();
|
Destroy();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void wxTopLevelWindowBase::OnChildDestroy(wxWindowDestroyEvent& event)
|
||||||
|
{
|
||||||
|
event.Skip();
|
||||||
|
|
||||||
|
wxWindow * const win = event.GetWindow();
|
||||||
|
if ( win == m_winDefault )
|
||||||
|
m_winDefault = NULL;
|
||||||
|
if ( win == m_winTmpDefault )
|
||||||
|
m_winTmpDefault = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
bool wxTopLevelWindowBase::SendIconizeEvent(bool iconized)
|
bool wxTopLevelWindowBase::SendIconizeEvent(bool iconized)
|
||||||
{
|
{
|
||||||
wxIconizeEvent event(GetId(), iconized);
|
wxIconizeEvent event(GetId(), iconized);
|
||||||
|
@@ -318,23 +318,9 @@ wxWindowBase::~wxWindowBase()
|
|||||||
|
|
||||||
wxASSERT_MSG( GetChildren().GetCount() == 0, wxT("children not destroyed") );
|
wxASSERT_MSG( GetChildren().GetCount() == 0, wxT("children not destroyed") );
|
||||||
|
|
||||||
// reset the top-level parent's default item if it is this widget
|
// notify the parent about this window destruction
|
||||||
if ( m_parent )
|
if ( m_parent )
|
||||||
{
|
|
||||||
wxTopLevelWindow *tlw = wxDynamicCast(wxGetTopLevelParent((wxWindow*)this),
|
|
||||||
wxTopLevelWindow);
|
|
||||||
|
|
||||||
if ( tlw && tlw->GetDefaultItem() == this )
|
|
||||||
tlw->SetDefaultItem(NULL);
|
|
||||||
if ( tlw && tlw->GetTmpDefaultItem() == this )
|
|
||||||
tlw->SetTmpDefaultItem(NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
// reset the dangling pointer our parent window may keep to us
|
|
||||||
if ( m_parent )
|
|
||||||
{
|
|
||||||
m_parent->RemoveChild(this);
|
m_parent->RemoveChild(this);
|
||||||
}
|
|
||||||
|
|
||||||
#if wxUSE_CARET
|
#if wxUSE_CARET
|
||||||
delete m_caret;
|
delete m_caret;
|
||||||
|
Reference in New Issue
Block a user