fixed memory leak when SetTargetWindow() was called more than once and made DeleteEvtHandler() more robust
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@13184 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -389,10 +389,37 @@ void wxScrollHelper::SetScrollbars(int pixelsPerUnitX,
|
|||||||
|
|
||||||
void wxScrollHelper::DeleteEvtHandler()
|
void wxScrollHelper::DeleteEvtHandler()
|
||||||
{
|
{
|
||||||
// FIXME: we should search for m_handler in the handler list
|
// search for m_handler in the handler list
|
||||||
if ( m_win )
|
if ( m_win && m_handler )
|
||||||
{
|
{
|
||||||
m_win->PopEventHandler(TRUE /* Delete old event handler*/);
|
wxEvtHandler *handlerPrev = NULL,
|
||||||
|
*handler = m_win->GetEventHandler();
|
||||||
|
while ( handler )
|
||||||
|
{
|
||||||
|
if ( handler == m_handler )
|
||||||
|
{
|
||||||
|
wxEvtHandler *handlerNext = handler->GetNextHandler();
|
||||||
|
if ( handlerPrev )
|
||||||
|
{
|
||||||
|
handlerPrev->SetNextHandler(handlerNext);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
m_win->SetEventHandler(handlerNext);
|
||||||
|
}
|
||||||
|
|
||||||
|
handler->SetNextHandler(NULL);
|
||||||
|
delete handler;
|
||||||
|
m_handler = NULL;
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
handlerPrev = handler;
|
||||||
|
handler = handler->GetNextHandler();
|
||||||
|
}
|
||||||
|
|
||||||
|
wxFAIL_MSG( _T("where has our event handler gone?") );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -415,6 +442,9 @@ void wxScrollHelper::DoSetTargetWindow(wxWindow *target)
|
|||||||
// which we scroll - we don't need to hijack its events)
|
// which we scroll - we don't need to hijack its events)
|
||||||
if ( m_targetWindow == m_win )
|
if ( m_targetWindow == m_win )
|
||||||
{
|
{
|
||||||
|
// if we already have a handler, delete it first
|
||||||
|
DeleteEvtHandler();
|
||||||
|
|
||||||
m_handler = new wxScrollHelperEvtHandler(this);
|
m_handler = new wxScrollHelperEvtHandler(this);
|
||||||
m_targetWindow->PushEventHandler(m_handler);
|
m_targetWindow->PushEventHandler(m_handler);
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user