Kaydet (Commit) e8d5b8be authored tarafından Miklos Vajna's avatar Miklos Vajna

tdf#113714 vcl menu bar window: avoid flicker

Regression from commit 458a827e (further
refactor Menu to use RenderContext, 2015-05-15), if we do full paint
instead of incremental paint, then need to ensure that an intermediate
state is not painted.

Paint happens at idle time by default on Windows (OpenGL) and also on
Linux (gtk3), but some other backends like Windows GDI had flicker, this
fixes the problem.

Change-Id: I530166cea93513aec4648dd0a385359f4b998b6f
Reviewed-on: https://gerrit.libreoffice.org/72610Reviewed-by: 's avatarMiklos Vajna <vmiklos@collabora.com>
Tested-by: Jenkins
üst 115ab48f
......@@ -24,6 +24,7 @@
#include <vcl/dockingarea.hxx>
#include <vcl/settings.hxx>
#include <vcl/taskpanelist.hxx>
#include <vcl/virdev.hxx>
#include <sal/log.hxx>
#include <salframe.hxx>
......@@ -912,47 +913,54 @@ void MenuBarWindow::Paint(vcl::RenderContext& rRenderContext, const tools::Recta
return;
}
// Make sure that all actual rendering happens in one go to avoid flicker.
ScopedVclPtrInstance<VirtualDevice> pBuffer;
pBuffer->SetOutputSizePixel(aOutputSize, false);
if (rRenderContext.IsNativeControlSupported(ControlType::Menubar, ControlPart::Entire))
{
MenubarValue aMenubarValue;
aMenubarValue.maTopDockingAreaHeight = ImplGetTopDockingAreaHeight(this);
if (!rStyleSettings.GetPersonaHeader().IsEmpty())
Erase(rRenderContext);
Erase(*pBuffer);
else
{
tools::Rectangle aCtrlRegion( Point(), aOutputSize );
rRenderContext.DrawNativeControl(ControlType::Menubar, ControlPart::Entire, aCtrlRegion,
ControlState::ENABLED, aMenubarValue, OUString());
pBuffer->DrawNativeControl(ControlType::Menubar, ControlPart::Entire, aCtrlRegion,
ControlState::ENABLED, aMenubarValue, OUString());
}
ImplAddNWFSeparator(rRenderContext, aOutputSize, aMenubarValue);
ImplAddNWFSeparator(*pBuffer, aOutputSize, aMenubarValue);
}
// shrink the area of the buttons
aOutputSize.AdjustWidth( -(aCloseBtn->GetSizePixel().Width()) );
rRenderContext.SetFillColor(rStyleSettings.GetMenuColor());
pMenu->ImplPaint(rRenderContext, aOutputSize, 0);
pBuffer->SetFillColor(rStyleSettings.GetMenuColor());
pMenu->ImplPaint(*pBuffer, aOutputSize, 0);
if (nHighlightedItem != ITEMPOS_INVALID && pMenu && !pMenu->GetItemList()->GetDataFromPos(nHighlightedItem)->bHiddenOnGUI)
HighlightItem(rRenderContext, nHighlightedItem);
HighlightItem(*pBuffer, nHighlightedItem);
else if (ImplGetSVData()->maNWFData.mbRolloverMenubar && nRolloveredItem != ITEMPOS_INVALID)
HighlightItem(rRenderContext, nRolloveredItem);
HighlightItem(*pBuffer, nRolloveredItem);
// in high contrast mode draw a separating line on the lower edge
if (!rRenderContext.IsNativeControlSupported( ControlType::Menubar, ControlPart::Entire) &&
rStyleSettings.GetHighContrastMode())
{
rRenderContext.Push(PushFlags::LINECOLOR | PushFlags::MAPMODE);
rRenderContext.SetLineColor(COL_WHITE);
rRenderContext.SetMapMode(MapMode(MapUnit::MapPixel));
pBuffer->Push(PushFlags::LINECOLOR | PushFlags::MAPMODE);
pBuffer->SetLineColor(COL_WHITE);
pBuffer->SetMapMode(MapMode(MapUnit::MapPixel));
Size aSize = GetSizePixel();
rRenderContext.DrawLine(Point(0, aSize.Height() - 1),
Point(aSize.Width() - 1, aSize.Height() - 1));
rRenderContext.Pop();
pBuffer->DrawLine(Point(0, aSize.Height() - 1),
Point(aSize.Width() - 1, aSize.Height() - 1));
pBuffer->Pop();
}
rRenderContext.DrawOutDev(Point(0, 0), GetOutputSizePixel(), Point(0, 0), GetOutputSizePixel(),
*pBuffer);
}
void MenuBarWindow::Resize()
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment