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:
Vadim Zeitlin 2001-12-24 14:14:11 +00:00
parent f7b301fa5b
commit 248d771ce4

View File

@ -389,10 +389,37 @@ void wxScrollHelper::SetScrollbars(int pixelsPerUnitX,
void wxScrollHelper::DeleteEvtHandler()
{
// FIXME: we should search for m_handler in the handler list
if ( m_win )
// search for m_handler in the handler list
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)
if ( m_targetWindow == m_win )
{
// if we already have a handler, delete it first
DeleteEvtHandler();
m_handler = new wxScrollHelperEvtHandler(this);
m_targetWindow->PushEventHandler(m_handler);
}