Merge branch 'aui-auto-uninit'
Call wxAuiManager::UnInit() automatically. Closes #14145.
This commit is contained in:
@@ -555,6 +555,7 @@ public:
|
|||||||
protected:
|
protected:
|
||||||
|
|
||||||
// protected events
|
// protected events
|
||||||
|
void OnDestroy(wxWindowDestroyEvent& evt);
|
||||||
void OnPaint(wxPaintEvent& evt);
|
void OnPaint(wxPaintEvent& evt);
|
||||||
void OnEraseBackground(wxEraseEvent& evt);
|
void OnEraseBackground(wxEraseEvent& evt);
|
||||||
void OnSize(wxSizeEvent& evt);
|
void OnSize(wxSizeEvent& evt);
|
||||||
|
@@ -484,11 +484,12 @@ public:
|
|||||||
void StartPaneDrag(wxWindow* paneWindow, const wxPoint& offset);
|
void StartPaneDrag(wxWindow* paneWindow, const wxPoint& offset);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Uninitializes the framework and should be called before a managed frame or
|
Dissociate the managed window from the manager.
|
||||||
window is destroyed. UnInit() is usually called in the managed wxFrame's
|
|
||||||
destructor. It is necessary to call this function before the managed frame
|
This function may be called before the managed frame or window is
|
||||||
or window is destroyed, otherwise the manager cannot remove its custom event
|
destroyed, but, since wxWidgets 3.1.4, it's unnecessary to call it
|
||||||
handlers from a window.
|
explicitly, as it will be called automatically when this window is
|
||||||
|
destroyed, as well as when the manager itself is.
|
||||||
*/
|
*/
|
||||||
void UnInit();
|
void UnInit();
|
||||||
|
|
||||||
|
@@ -116,8 +116,6 @@ public:
|
|||||||
const wxSize& size = wxDefaultSize,
|
const wxSize& size = wxDefaultSize,
|
||||||
long style = wxDEFAULT_FRAME_STYLE | wxSUNKEN_BORDER);
|
long style = wxDEFAULT_FRAME_STYLE | wxSUNKEN_BORDER);
|
||||||
|
|
||||||
~MyFrame();
|
|
||||||
|
|
||||||
wxAuiDockArt* GetDockArt();
|
wxAuiDockArt* GetDockArt();
|
||||||
void DoUpdate();
|
void DoUpdate();
|
||||||
|
|
||||||
@@ -1016,11 +1014,6 @@ MyFrame::MyFrame(wxWindow* parent,
|
|||||||
m_mgr.Update();
|
m_mgr.Update();
|
||||||
}
|
}
|
||||||
|
|
||||||
MyFrame::~MyFrame()
|
|
||||||
{
|
|
||||||
m_mgr.UnInit();
|
|
||||||
}
|
|
||||||
|
|
||||||
wxAuiDockArt* MyFrame::GetDockArt()
|
wxAuiDockArt* MyFrame::GetDockArt()
|
||||||
{
|
{
|
||||||
return m_mgr.GetArtProvider();
|
return m_mgr.GetArtProvider();
|
||||||
|
@@ -593,6 +593,7 @@ bool wxAuiPaneInfo::IsValid() const
|
|||||||
wxBEGIN_EVENT_TABLE(wxAuiManager, wxEvtHandler)
|
wxBEGIN_EVENT_TABLE(wxAuiManager, wxEvtHandler)
|
||||||
EVT_AUI_PANE_BUTTON(wxAuiManager::OnPaneButton)
|
EVT_AUI_PANE_BUTTON(wxAuiManager::OnPaneButton)
|
||||||
EVT_AUI_RENDER(wxAuiManager::OnRender)
|
EVT_AUI_RENDER(wxAuiManager::OnRender)
|
||||||
|
EVT_WINDOW_DESTROY(wxAuiManager::OnDestroy)
|
||||||
EVT_PAINT(wxAuiManager::OnPaint)
|
EVT_PAINT(wxAuiManager::OnPaint)
|
||||||
EVT_ERASE_BACKGROUND(wxAuiManager::OnEraseBackground)
|
EVT_ERASE_BACKGROUND(wxAuiManager::OnEraseBackground)
|
||||||
EVT_SIZE(wxAuiManager::OnSize)
|
EVT_SIZE(wxAuiManager::OnSize)
|
||||||
@@ -632,6 +633,8 @@ wxAuiManager::wxAuiManager(wxWindow* managed_wnd, unsigned int flags)
|
|||||||
|
|
||||||
wxAuiManager::~wxAuiManager()
|
wxAuiManager::~wxAuiManager()
|
||||||
{
|
{
|
||||||
|
UnInit();
|
||||||
|
|
||||||
// NOTE: It's possible that the windows have already been destroyed by the
|
// NOTE: It's possible that the windows have already been destroyed by the
|
||||||
// time this dtor is called, so this loop can result in memory access via
|
// time this dtor is called, so this loop can result in memory access via
|
||||||
// invalid pointers, resulting in a crash. So it will be disabled while
|
// invalid pointers, resulting in a crash. So it will be disabled while
|
||||||
@@ -914,6 +917,8 @@ void wxAuiManager::SetManagedWindow(wxWindow* wnd)
|
|||||||
{
|
{
|
||||||
wxASSERT_MSG(wnd, wxT("specified window must be non-NULL"));
|
wxASSERT_MSG(wnd, wxT("specified window must be non-NULL"));
|
||||||
|
|
||||||
|
UnInit();
|
||||||
|
|
||||||
m_frame = wnd;
|
m_frame = wnd;
|
||||||
m_frame->PushEventHandler(this);
|
m_frame->PushEventHandler(this);
|
||||||
|
|
||||||
@@ -950,14 +955,16 @@ void wxAuiManager::SetManagedWindow(wxWindow* wnd)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// UnInit() must be called, usually in the destructor
|
// UnInit() is called automatically by wxAuiManager itself when either the
|
||||||
// of the frame class. If it is not called, usually this
|
// manager itself or its associated frame is destroyed, but can also be called
|
||||||
// will result in a crash upon program exit
|
// explicitly, so make it safe to call it multiple times and just do nothing
|
||||||
|
// during any calls but the first one.
|
||||||
void wxAuiManager::UnInit()
|
void wxAuiManager::UnInit()
|
||||||
{
|
{
|
||||||
if (m_frame)
|
if (m_frame)
|
||||||
{
|
{
|
||||||
m_frame->RemoveEventHandler(this);
|
m_frame->RemoveEventHandler(this);
|
||||||
|
m_frame = NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -3951,6 +3958,12 @@ void wxAuiManager::Repaint(wxDC* dc)
|
|||||||
delete client_dc;
|
delete client_dc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void wxAuiManager::OnDestroy(wxWindowDestroyEvent& event)
|
||||||
|
{
|
||||||
|
if ( event.GetEventObject() == m_frame )
|
||||||
|
UnInit();
|
||||||
|
}
|
||||||
|
|
||||||
void wxAuiManager::OnPaint(wxPaintEvent& WXUNUSED(event))
|
void wxAuiManager::OnPaint(wxPaintEvent& WXUNUSED(event))
|
||||||
{
|
{
|
||||||
wxPaintDC dc(m_frame);
|
wxPaintDC dc(m_frame);
|
||||||
|
Reference in New Issue
Block a user