X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/ff1865910312d960737474a75a77737d5ce94864..497b78dfacb5e739fe7da7869f3a92a2e2747dbc:/src/generic/scrlwing.cpp diff --git a/src/generic/scrlwing.cpp b/src/generic/scrlwing.cpp index 18a963a16e..cf4792b5fc 100644 --- a/src/generic/scrlwing.cpp +++ b/src/generic/scrlwing.cpp @@ -384,15 +384,22 @@ void wxScrollHelper::SetScrollbars(int pixelsPerUnitX, } // ---------------------------------------------------------------------------- -// target window handling +// [target] window handling // ---------------------------------------------------------------------------- void wxScrollHelper::DeleteEvtHandler() { - // FIXME: we should search for m_handler in the handler list - if ( m_targetWindow ) + // search for m_handler in the handler list + if ( m_win && m_handler ) { - m_targetWindow->PopEventHandler(TRUE /* Delete old event handler*/); + if ( m_win->RemoveEventHandler(m_handler) ) + { + delete m_handler; + } + //else: something is very wrong, so better [maybe] leak memory than + // risk a crash because of double deletion + + m_handler = NULL; } } @@ -402,6 +409,7 @@ void wxScrollHelper::SetWindow(wxWindow *win) m_win = win; + // by default, the associated window is also the target window DoSetTargetWindow(win); } @@ -410,20 +418,25 @@ void wxScrollHelper::DoSetTargetWindow(wxWindow *target) m_targetWindow = target; // install the event handler which will intercept the events we're - // interested in - m_handler = new wxScrollHelperEvtHandler(this); - m_targetWindow->PushEventHandler(m_handler); + // interested in (but only do it for our real window, not the target window + // 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); + } } -void wxScrollHelper::SetTargetWindow( wxWindow *target ) +void wxScrollHelper::SetTargetWindow(wxWindow *target) { wxCHECK_RET( target, wxT("target window must not be NULL") ); if ( target == m_targetWindow ) return; - DeleteEvtHandler(); - DoSetTargetWindow(target); } @@ -451,12 +464,12 @@ void wxScrollHelper::HandleOnScroll(wxScrollWinEvent& event) if (orient == wxHORIZONTAL) { m_xScrollPosition += nScrollInc; - m_targetWindow->SetScrollPos(wxHORIZONTAL, m_xScrollPosition); + m_win->SetScrollPos(wxHORIZONTAL, m_xScrollPosition); } else { m_yScrollPosition += nScrollInc; - m_targetWindow->SetScrollPos(wxVERTICAL, m_yScrollPosition); + m_win->SetScrollPos(wxVERTICAL, m_yScrollPosition); } bool needsRefresh = FALSE; @@ -621,14 +634,14 @@ void wxScrollHelper::AdjustScrollbars() m_xScrollPosition = wxMin( m_xScrollLines-noPagePositions, m_xScrollPosition); m_xScrollPosition = wxMax( 0, m_xScrollPosition ); - m_targetWindow->SetScrollbar(wxHORIZONTAL, m_xScrollPosition, noPagePositions, m_xScrollLines); + m_win->SetScrollbar(wxHORIZONTAL, m_xScrollPosition, noPagePositions, m_xScrollLines); // The amount by which we scroll when paging SetScrollPageSize(wxHORIZONTAL, noPagePositions); } else { m_xScrollPosition = 0; - m_targetWindow->SetScrollbar (wxHORIZONTAL, 0, 0, 0, FALSE); + m_win->SetScrollbar (wxHORIZONTAL, 0, 0, 0, FALSE); } if (m_yScrollLines > 0) @@ -645,14 +658,14 @@ void wxScrollHelper::AdjustScrollbars() m_yScrollPosition = wxMin( m_yScrollLines-noPagePositions, m_yScrollPosition ); m_yScrollPosition = wxMax( 0, m_yScrollPosition ); - m_targetWindow->SetScrollbar(wxVERTICAL, m_yScrollPosition, noPagePositions, m_yScrollLines); + m_win->SetScrollbar(wxVERTICAL, m_yScrollPosition, noPagePositions, m_yScrollLines); // The amount by which we scroll when paging SetScrollPageSize(wxVERTICAL, noPagePositions); } else { m_yScrollPosition = 0; - m_targetWindow->SetScrollbar (wxVERTICAL, 0, 0, 0, FALSE); + m_win->SetScrollbar (wxVERTICAL, 0, 0, 0, FALSE); } if (oldXScroll != m_xScrollPosition) @@ -744,7 +757,7 @@ void wxScrollHelper::Scroll( int x_pos, int y_pos ) m_xScrollPosition = wxMax( 0, m_xScrollPosition ); if (old_x != m_xScrollPosition) { - m_targetWindow->SetScrollPos( wxHORIZONTAL, m_xScrollPosition ); + m_win->SetScrollPos( wxHORIZONTAL, m_xScrollPosition ); m_targetWindow->ScrollWindow( (old_x-m_xScrollPosition)*m_xScrollPixelsPerLine, 0, GetRect() ); } @@ -765,7 +778,7 @@ void wxScrollHelper::Scroll( int x_pos, int y_pos ) m_yScrollPosition = wxMax( 0, m_yScrollPosition ); if (old_y != m_yScrollPosition) { - m_targetWindow->SetScrollPos( wxVERTICAL, m_yScrollPosition ); + m_win->SetScrollPos( wxVERTICAL, m_yScrollPosition ); m_targetWindow->ScrollWindow( 0, (old_y-m_yScrollPosition)*m_yScrollPixelsPerLine, GetRect() ); } @@ -824,8 +837,8 @@ void wxScrollHelper::CalcUnscrolledPosition(int x, int y, int *xx, int *yy) cons void wxScrollHelper::HandleOnSize(wxSizeEvent& WXUNUSED(event)) { #if wxUSE_CONSTRAINTS - if ( m_targetWindow->GetAutoLayout() ) - m_targetWindow->Layout(); + if ( m_win->GetAutoLayout() ) + m_win->Layout(); #endif AdjustScrollbars(); @@ -835,7 +848,8 @@ void wxScrollHelper::HandleOnSize(wxSizeEvent& WXUNUSED(event)) // scroll position void wxScrollHelper::HandleOnPaint(wxPaintEvent& WXUNUSED(event)) { - wxPaintDC dc(m_targetWindow); + // don't use m_targetWindow here, this is always called for ourselves + wxPaintDC dc(m_win); DoPrepareDC(dc); OnDraw(dc);