From 886583645cf8d977f11f527691515c2a4d7c33e8 Mon Sep 17 00:00:00 2001 From: Caolán McNamara Date: Wed, 13 Nov 2019 12:31:01 +0000 Subject: Resolves: tdf#128758 scrollbars added during scrolledwindow layout MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Change-Id: I1eee32278f6b46ff4f0447eb39543836c3d687f0 Reviewed-on: https://gerrit.libreoffice.org/82589 Tested-by: Jenkins Reviewed-by: Caolán McNamara Tested-by: Caolán McNamara --- vcl/source/window/layout.cxx | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) (limited to 'vcl') diff --git a/vcl/source/window/layout.cxx b/vcl/source/window/layout.cxx index 26981992bc04..981ac621aa60 100644 --- a/vcl/source/window/layout.cxx +++ b/vcl/source/window/layout.cxx @@ -1757,7 +1757,7 @@ void VclScrolledWindow::InitScrollBars(const Size &rRequest) m_pHScroll->Scroll(); } -void VclScrolledWindow::setAllocation(const Size &rAllocation) +void VclScrolledWindow::doSetAllocation(const Size &rAllocation, bool bRetryOnFailure) { Size aChildReq; @@ -1835,13 +1835,33 @@ void VclScrolledWindow::setAllocation(const Size &rAllocation) if (pChild && pChild->IsVisible()) { assert(dynamic_cast(pChild) && "scrolledwindow child should be a Viewport"); + + WinBits nOldBits = (GetStyle() & (WB_AUTOVSCROLL | WB_VSCROLL | WB_AUTOHSCROLL | WB_HSCROLL)); + setLayoutAllocation(*pChild, Point(1, 1), aInnerSize); + + // tdf#128758 if the layout allocation triggered some callback that + // immediately invalidates the layout by adding scrollbars then + // normally this would simply retrigger layout and another toplevel + // attempt is made later. But the initial layout attempt blocks + // relayouts, so just make another single effort here. + WinBits nNewBits = (GetStyle() & (WB_AUTOVSCROLL | WB_VSCROLL | WB_AUTOHSCROLL | WB_HSCROLL)); + if (nOldBits != nNewBits && bRetryOnFailure) + { + doSetAllocation(rAllocation, false); + return; + } } if (!m_bUserManagedScrolling) InitScrollBars(aChildReq); } +void VclScrolledWindow::setAllocation(const Size &rAllocation) +{ + doSetAllocation(rAllocation, true); +} + Size VclScrolledWindow::getVisibleChildSize() const { Size aRet(GetSizePixel()); -- cgit