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:
parent
f7b301fa5b
commit
248d771ce4
@ -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);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user