[Libreoffice-commits] core.git: include/vcl vcl/source

Caolán McNamara (via logerrit) logerrit at kemper.freedesktop.org
Wed Nov 13 15:12:04 UTC 2019


 include/vcl/layout.hxx       |    1 +
 vcl/source/window/layout.cxx |   22 +++++++++++++++++++++-
 2 files changed, 22 insertions(+), 1 deletion(-)

New commits:
commit 886583645cf8d977f11f527691515c2a4d7c33e8
Author:     Caolán McNamara <caolanm at redhat.com>
AuthorDate: Wed Nov 13 12:31:01 2019 +0000
Commit:     Caolán McNamara <caolanm at redhat.com>
CommitDate: Wed Nov 13 16:11:07 2019 +0100

    Resolves: tdf#128758 scrollbars added during scrolledwindow layout
    
    Change-Id: I1eee32278f6b46ff4f0447eb39543836c3d687f0
    Reviewed-on: https://gerrit.libreoffice.org/82589
    Tested-by: Jenkins
    Reviewed-by: Caolán McNamara <caolanm at redhat.com>
    Tested-by: Caolán McNamara <caolanm at redhat.com>

diff --git a/include/vcl/layout.hxx b/include/vcl/layout.hxx
index b339ef4d4869..57ca15260f05 100644
--- a/include/vcl/layout.hxx
+++ b/include/vcl/layout.hxx
@@ -513,6 +513,7 @@ public:
     //set to true to disable the built-in scrolling callbacks to allow the user
     //to override it
     void setUserManagedScrolling(bool bUserManagedScrolling) { m_bUserManagedScrolling = bUserManagedScrolling;}
+    void doSetAllocation(const Size &rAllocation, bool bRetryOnFailure);
 private:
     virtual Size calculateRequisition() const override;
     virtual void setAllocation(const Size &rAllocation) override;
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<VclViewport*>(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());


More information about the Libreoffice-commits mailing list