From c04169c586ef1d55b1d0ac469bb4fbd4f50bd08a Mon Sep 17 00:00:00 2001 From: Miklos Vajna Date: Tue, 21 May 2019 17:45:05 +0200 Subject: tdf#125415 vcl menu floating window: avoid flicker This is similar to e8d5b8beb5958147235ff955ed38c47b51d860ff (tdf#113714 vcl menu bar window: avoid flicker, 2019-05-20), except that was for the menu bar window, and this is for the floating window opening from that one. Change-Id: Ib24f4999ad3e8cbbecc058368e9d112e106e9178 Reviewed-on: https://gerrit.libreoffice.org/72688 Reviewed-by: Miklos Vajna Tested-by: Jenkins --- vcl/source/window/menufloatingwindow.cxx | 36 ++++++++++++++++++++------------ 1 file changed, 23 insertions(+), 13 deletions(-) (limited to 'vcl/source/window/menufloatingwindow.cxx') diff --git a/vcl/source/window/menufloatingwindow.cxx b/vcl/source/window/menufloatingwindow.cxx index 7986679f8af1..631d275e8656 100644 --- a/vcl/source/window/menufloatingwindow.cxx +++ b/vcl/source/window/menufloatingwindow.cxx @@ -27,6 +27,7 @@ #include #include #include +#include #include MenuFloatingWindow::MenuFloatingWindow( Menu* pMen, vcl::Window* pParent, WinBits nStyle ) : @@ -1206,32 +1207,41 @@ void MenuFloatingWindow::Paint(vcl::RenderContext& rRenderContext, const tools:: if (!pMenu) return; - rRenderContext.Push( PushFlags::CLIPREGION ); - rRenderContext.SetClipRegion(vcl::Region(rPaintRect)); + // Make sure that all actual rendering happens in one go to avoid flicker. + ScopedVclPtrInstance pBuffer; + pBuffer->SetOutputSizePixel(GetOutputSizePixel(), false); + pBuffer->DrawOutDev(Point(0, 0), GetOutputSizePixel(), Point(0, 0), GetOutputSizePixel(), + rRenderContext); + + pBuffer->Push(PushFlags::CLIPREGION); + pBuffer->SetClipRegion(vcl::Region(rPaintRect)); if (rRenderContext.IsNativeControlSupported(ControlType::MenuPopup, ControlPart::Entire)) { - rRenderContext.SetClipRegion(); + pBuffer->SetClipRegion(); long nX = 0; Size aPxSize(GetOutputSizePixel()); aPxSize.AdjustWidth( -nX ); ImplControlValue aVal(pMenu->nTextPos - GUTTERBORDER); - rRenderContext.DrawNativeControl(ControlType::MenuPopup, ControlPart::Entire, - tools::Rectangle(Point(nX, 0), aPxSize), - ControlState::ENABLED, aVal, OUString()); - InitMenuClipRegion(rRenderContext); + pBuffer->DrawNativeControl(ControlType::MenuPopup, ControlPart::Entire, + tools::Rectangle(Point(nX, 0), aPxSize), ControlState::ENABLED, + aVal, OUString()); + InitMenuClipRegion(*pBuffer); } if (IsScrollMenu()) { - ImplDrawScroller(rRenderContext, true); - ImplDrawScroller(rRenderContext, false); + ImplDrawScroller(*pBuffer, true); + ImplDrawScroller(*pBuffer, false); } - rRenderContext.SetFillColor(rRenderContext.GetSettings().GetStyleSettings().GetMenuColor()); - pMenu->ImplPaint(rRenderContext, GetOutputSizePixel(), nScrollerHeight, ImplGetStartY()); + pBuffer->SetFillColor(rRenderContext.GetSettings().GetStyleSettings().GetMenuColor()); + pMenu->ImplPaint(*pBuffer, GetOutputSizePixel(), nScrollerHeight, ImplGetStartY()); if (nHighlightedItem != ITEMPOS_INVALID) - RenderHighlightItem(rRenderContext, nHighlightedItem); + RenderHighlightItem(*pBuffer, nHighlightedItem); + + pBuffer->Pop(); - rRenderContext.Pop(); + rRenderContext.DrawOutDev(Point(0, 0), GetOutputSizePixel(), Point(0, 0), GetOutputSizePixel(), + *pBuffer); } void MenuFloatingWindow::ImplDrawScroller(vcl::RenderContext& rRenderContext, bool bUp) -- cgit v1.2.3