summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sfx2/source/appl/workwin.cxx23
-rw-r--r--sfx2/source/inc/workwin.hxx2
2 files changed, 24 insertions, 1 deletions
diff --git a/sfx2/source/appl/workwin.cxx b/sfx2/source/appl/workwin.cxx
index 8d0970ed5d81..3a09ab31aa5a 100644
--- a/sfx2/source/appl/workwin.cxx
+++ b/sfx2/source/appl/workwin.cxx
@@ -696,6 +696,20 @@ void SfxWorkWindow::ArrangeChildren_Impl( bool bForce )
ArrangeAutoHideWindows( nullptr );
}
+void SfxWorkWindow::FlushPendingChildSizes()
+{
+ // tdf#116865, if any windows are being resized, i.e. their
+ // resize timer is active, then calling GetSizePixel on
+ // them forces the timer to fire and sets the final
+ // size to which they are getting resized towards.
+ for (size_t i = 0; i < aChildren.size(); ++i)
+ {
+ SfxChild_Impl *pCli = aChildren[i];
+ if (!pCli || !pCli->pWin)
+ continue;
+ (void)pCli->pWin->GetSizePixel();
+ }
+}
SvBorder SfxWorkWindow::Arrange_Impl()
@@ -707,7 +721,14 @@ SvBorder SfxWorkWindow::Arrange_Impl()
ClientArea, it is set to "not visible".
*/
{
-
+ //tdf#116865 trigger pending sizing timers now so we arrange
+ //with the final size of the client area.
+ //
+ //Otherwise calling GetSizePixel in the following loop will trigger the
+ //timers, causing reentry into Arrange_Impl again where the inner
+ //Arrange_Impl arranges with the final size, and then returns to this outer
+ //Arrange_Impl which would rearrange with the old client area size
+ FlushPendingChildSizes();
aClientArea = GetTopRect_Impl();
aUpperClientArea = aClientArea;
diff --git a/sfx2/source/inc/workwin.hxx b/sfx2/source/inc/workwin.hxx
index 6a80892900eb..0c714c479446 100644
--- a/sfx2/source/inc/workwin.hxx
+++ b/sfx2/source/inc/workwin.hxx
@@ -226,6 +226,8 @@ class SfxWorkWindow final
void SaveStatus_Impl(SfxChildWindow*, const SfxChildWinInfo&);
static bool IsPluginMode( SfxObjectShell const * pObjShell );
+ void FlushPendingChildSizes();
+
public:
SfxWorkWindow( vcl::Window* pWin, SfxFrame* pFrm, SfxFrame* pMaster );
~SfxWorkWindow();