From 9ec927f89b0e907c45143bb3de0548b97361b6b2 Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Mon, 4 Dec 2006 11:05:59 +0000 Subject: [PATCH] ensure that scroll position is always in scrolling range, otherwise we could have a window without scrollbars at all but with non zero scroll offset which was really strange git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@43795 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- include/wx/gtk/scrolwin.h | 21 +++++++++++++++++++++ src/gtk/scrolwin.cpp | 35 ++++++++++++++++++----------------- 2 files changed, 39 insertions(+), 17 deletions(-) diff --git a/include/wx/gtk/scrolwin.h b/include/wx/gtk/scrolwin.h index 246e8269f7..909b616097 100644 --- a/include/wx/gtk/scrolwin.h +++ b/include/wx/gtk/scrolwin.h @@ -35,9 +35,30 @@ protected: int pixelsPerLine, int winSize, int virtSize, + int *pos, int *lines, int *linesPerPage); + void DoAdjustHScrollbar(int winSize, int virtSize) + { + DoAdjustScrollbar + ( + m_win->m_scrollBar[wxWindow::ScrollDir_Horz], + m_xScrollPixelsPerLine, winSize, virtSize, + &m_xScrollPosition, &m_xScrollLines, &m_xScrollLinesPerPage + ); + } + + void DoAdjustVScrollbar(int winSize, int virtSize) + { + DoAdjustScrollbar + ( + m_win->m_scrollBar[wxWindow::ScrollDir_Vert], + m_yScrollPixelsPerLine, winSize, virtSize, + &m_yScrollPosition, &m_yScrollLines, &m_yScrollLinesPerPage + ); + } + // and this does the same for Scroll() void DoScroll(int orient, int pos, diff --git a/src/gtk/scrolwin.cpp b/src/gtk/scrolwin.cpp index 72e831f69d..2f0bea636a 100644 --- a/src/gtk/scrolwin.cpp +++ b/src/gtk/scrolwin.cpp @@ -85,6 +85,7 @@ void wxScrollHelperNative::DoAdjustScrollbar(GtkRange* range, int pixelsPerLine, int winSize, int virtSize, + int *pos, int *lines, int *linesPerPage) { @@ -106,6 +107,11 @@ void wxScrollHelperNative::DoAdjustScrollbar(GtkRange* range, *lines = 0; *linesPerPage = 0; } + + // ensure that the scroll position is always in valid range + if ( *pos > *lines ) + *pos = *lines; + GtkAdjustment* adj = range->adjustment; adj->step_increment = 1; adj->page_increment = @@ -115,26 +121,24 @@ void wxScrollHelperNative::DoAdjustScrollbar(GtkRange* range, void wxScrollHelperNative::AdjustScrollbars() { - int w, h; - int vw, vh; - // this flag indicates which window has the scrollbars - m_win->m_hasScrolling = m_xScrollPixelsPerLine != 0 || m_yScrollPixelsPerLine != 0; + m_win->m_hasScrolling = m_xScrollPixelsPerLine != 0 || + m_yScrollPixelsPerLine != 0; + int vw, vh; m_targetWindow->GetVirtualSize( &vw, &vh ); + int w; m_targetWindow->GetClientSize(&w, NULL); - DoAdjustScrollbar( - m_win->m_scrollBar[wxWindow::ScrollDir_Horz], m_xScrollPixelsPerLine, - w, vw, &m_xScrollLines, &m_xScrollLinesPerPage); + DoAdjustHScrollbar(w, vw); + + int h; m_targetWindow->GetClientSize(NULL, &h); - DoAdjustScrollbar( - m_win->m_scrollBar[wxWindow::ScrollDir_Vert], m_yScrollPixelsPerLine, - h, vh, &m_yScrollLines, &m_yScrollLinesPerPage); + DoAdjustVScrollbar(h, vh); const int w_old = w; m_targetWindow->GetClientSize(&w, NULL); - if (w != w_old) + if ( w != w_old ) { // It is necessary to repeat the calculations in this case to avoid an // observed infinite series of size events, involving alternating @@ -143,13 +147,10 @@ void wxScrollHelperNative::AdjustScrollbars() // AdjustScrollbars() to be called again. If the scrollbar visibility // is not correct before then, yet another resize will occur, possibly // leading to an unending series if the sizes are just right. - DoAdjustScrollbar( - m_win->m_scrollBar[wxWindow::ScrollDir_Horz], m_xScrollPixelsPerLine, - w, vw, &m_xScrollLines, &m_xScrollLinesPerPage); + DoAdjustHScrollbar(w, vw); + m_targetWindow->GetClientSize(NULL, &h); - DoAdjustScrollbar( - m_win->m_scrollBar[wxWindow::ScrollDir_Vert], m_yScrollPixelsPerLine, - h, vh, &m_yScrollLines, &m_yScrollLinesPerPage); + DoAdjustVScrollbar(h, vh); } } -- 2.45.2