X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/add7cadd99d1b40dc012db655643f9c8c7080029..9d5507f7a2701395e1d5c121bd877bb9066ee6ea:/src/gtk/scrolwin.cpp diff --git a/src/gtk/scrolwin.cpp b/src/gtk/scrolwin.cpp index 3d257acc26..2808986822 100644 --- a/src/gtk/scrolwin.cpp +++ b/src/gtk/scrolwin.cpp @@ -50,9 +50,9 @@ void wxScrollHelperNative::SetScrollbars(int pixelsPerUnitX, int pixelsPerUnitY, m_xScrollPixelsPerLine = pixelsPerUnitX; m_yScrollPixelsPerLine = pixelsPerUnitY; - m_win->m_scrollBar[0]->adjustment->value = + m_win->m_scrollBar[wxWindow::ScrollDir_Horz]->adjustment->value = m_xScrollPosition = xPos; - m_win->m_scrollBar[1]->adjustment->value = + m_win->m_scrollBar[wxWindow::ScrollDir_Vert]->adjustment->value = m_yScrollPosition = yPos; // Setting hints here should arguably be deprecated, but without it @@ -85,43 +85,73 @@ void wxScrollHelperNative::DoAdjustScrollbar(GtkRange* range, int pixelsPerLine, int winSize, int virtSize, + int *pos, int *lines, int *linesPerPage) { - // GtkRange won't allow upper == lower, so for disabled state use [0,1] - // with a page size of 1. This will also clamp position to 0. - int upper = 1; - int page_size = 1; - if (pixelsPerLine > 0 && winSize < virtSize) + int upper; + int page_size; + if (pixelsPerLine > 0 && winSize > 0 && winSize < virtSize) { upper = (virtSize + pixelsPerLine - 1) / pixelsPerLine; page_size = winSize / pixelsPerLine; + *lines = upper; + *linesPerPage = page_size; + } + else + { + // GtkRange won't allow upper == lower, so for disabled state use [0,1] + // with a page size of 1. This will also clamp position to 0. + upper = 1; + page_size = 1; + *lines = 0; + *linesPerPage = 0; } - - *lines = upper; - *linesPerPage = page_size; GtkAdjustment* adj = range->adjustment; adj->step_increment = 1; adj->page_increment = adj->page_size = page_size; gtk_range_set_range(range, 0, upper); + + // ensure that the scroll position is always in valid range + if (*pos > *lines) + *pos = *lines; } void wxScrollHelperNative::AdjustScrollbars() { - int w, h; + // this flag indicates which window has the scrollbars + m_win->m_hasScrolling = m_xScrollPixelsPerLine != 0 || + m_yScrollPixelsPerLine != 0; + int vw, vh; + m_targetWindow->GetVirtualSize( &vw, &vh ); - m_targetWindow->m_hasScrolling = m_xScrollPixelsPerLine != 0 || m_yScrollPixelsPerLine != 0; + int w; + m_targetWindow->GetClientSize(&w, NULL); + DoAdjustHScrollbar(w, vw); - m_targetWindow->GetClientSize( &w, &h ); - m_targetWindow->GetVirtualSize( &vw, &vh ); + int h; + m_targetWindow->GetClientSize(NULL, &h); + DoAdjustVScrollbar(h, vh); - DoAdjustScrollbar(m_win->m_scrollBar[0], m_xScrollPixelsPerLine, w, vw, - &m_xScrollLines, &m_xScrollLinesPerPage); - DoAdjustScrollbar(m_win->m_scrollBar[1], m_yScrollPixelsPerLine, h, vh, - &m_yScrollLines, &m_yScrollLinesPerPage); + const int w_old = w; + m_targetWindow->GetClientSize(&w, NULL); + 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 + // changes in visibility of the scrollbars. + // At this point, GTK+ has already queued a resize, which will cause + // 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. + DoAdjustHScrollbar(w, vw); + + m_targetWindow->GetClientSize(NULL, &h); + DoAdjustVScrollbar(h, vh); + } } void wxScrollHelperNative::DoScroll(int orient,