diff options
author | Miklos Vajna <vmiklos@collabora.com> | 2019-05-21 17:45:05 +0200 |
---|---|---|
committer | Miklos Vajna <vmiklos@collabora.com> | 2019-05-21 23:59:28 +0200 |
commit | c04169c586ef1d55b1d0ac469bb4fbd4f50bd08a (patch) | |
tree | 6899ace1ac064621ddad4496dae05bb042619554 | |
parent | 845ebb4dd45ad4f93a6344d010f383be339ad488 (diff) |
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 <vmiklos@collabora.com>
Tested-by: Jenkins
-rw-r--r-- | vcl/source/window/menufloatingwindow.cxx | 36 |
1 files changed, 23 insertions, 13 deletions
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 <svdata.hxx> #include <vcl/decoview.hxx> #include <vcl/settings.hxx> +#include <vcl/virdev.hxx> #include <window.h> 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<VirtualDevice> 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) |