X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/bf6c0db6243368ee239563a1151156beb5b848fa..5b05d3ee52cb31caa856c9982eaeb2fcf5b5f78e:/src/gtk/scrolwin.cpp?ds=inline diff --git a/src/gtk/scrolwin.cpp b/src/gtk/scrolwin.cpp index 72e831f69d..2f9bc568fa 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,35 +107,47 @@ void wxScrollHelperNative::DoAdjustScrollbar(GtkRange* range, *lines = 0; *linesPerPage = 0; } + 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; int vw, vh; + m_targetWindow->GetVirtualSize(&vw, &vh); - // this flag indicates which window has the scrollbars - m_win->m_hasScrolling = m_xScrollPixelsPerLine != 0 || m_yScrollPixelsPerLine != 0; + int w, h; + const wxSize availSize = GetSizeAvailableForScrollTarget( + m_win->GetSize() - m_win->GetWindowBorderSize()); + if ( availSize.x >= vw && availSize.y >= vh ) + { + w = availSize.x; + h = availSize.y; - m_targetWindow->GetVirtualSize( &vw, &vh ); + // we know that the scrollbars will be removed + DoAdjustHScrollbar(w, vw); + DoAdjustVScrollbar(h, vh); + + return; + } m_targetWindow->GetClientSize(&w, NULL); - 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); 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 +156,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); } }