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

tdf#93482 vcl rendercontext: add Window::RequestDoubleBuffering()

This allows applications to request enabling/disabling of
double-buffering of their VCL frame and all its children. It works
after-the-fact, too: so in case the start center creates the frame and
later that frame is reused for Writer, then Writer can turn on
double-buffering, still.

From a user's point of view, this means that next to
VCL_DOUBLEBUFFERING_FORCE_ENABLE, there is now also a
VCL_DOUBLEBUFFERING_ENABLE environment variable that enables a safe
subset that is not supposed to draw directly at all. Enable this for
Writer only, for now.

Change-Id: Ie2cbf7d467eae2cee37fb58a1efc0a8984204408
üst a19e2064
......@@ -913,6 +913,8 @@ public:
/// Can the widget derived from this Window do the double-buffering via RenderContext properly?
bool SupportsDoubleBuffering() const;
/// Enable/disable double-buffering of the frame window and all its children.
void RequestDoubleBuffering(bool bRequest);
void EnableAllResize( bool bEnable = true );
......
......@@ -719,6 +719,10 @@ SwView::SwView( SfxViewFrame *_pFrame, SfxViewShell* pOldSh )
m_bIsPreviewDoubleClick(false),
m_bAnnotationMode(false)
{
static bool bRequestDoubleBuffering = getenv("VCL_DOUBLEBUFFERING_ENABLE");
if (bRequestDoubleBuffering)
m_pEditWin->RequestDoubleBuffering(true);
// According to discussion with MBA and further
// investigations, no old SfxViewShell will be set as parameter <pOldSh>,
// if function "New Window" is performed to open an additional view beside
......@@ -1056,7 +1060,13 @@ SwView::~SwView()
m_pTogglePageBtn.disposeAndClear();
delete m_pGlosHdl;
delete m_pViewImpl;
// If this was enabled in the ctor for the frame, then disable it here.
static bool bRequestDoubleBuffering = getenv("VCL_DOUBLEBUFFERING_ENABLE");
if (bRequestDoubleBuffering)
m_pEditWin->RequestDoubleBuffering(false);
m_pEditWin.disposeAndClear();
delete m_pFormatClipboard;
}
......
......@@ -1075,7 +1075,7 @@ void Window::ImplInit( vcl::Window* pParent, WinBits nStyle, SystemParentData* p
mpWindowImpl->mpFrameData->maResizeIdle.SetDebugName( "vcl::Window maResizeIdle" );
mpWindowImpl->mpFrameData->mbInternalDragGestureRecognizer = false;
if (!(nStyle & WB_DEFAULTWIN) && mpWindowImpl->mbDoubleBufferingRequested)
mpWindowImpl->mpFrameData->mpBuffer = VclPtrInstance<VirtualDevice>();
RequestDoubleBuffering(true);
mpWindowImpl->mpFrameData->mbInBufferedPaint = false;
if ( pRealParent && IsTopWindow() )
......@@ -3908,6 +3908,18 @@ bool Window::SupportsDoubleBuffering() const
return mpWindowImpl->mpFrameData->mpBuffer;
}
void Window::RequestDoubleBuffering(bool bRequest)
{
if (bRequest)
{
mpWindowImpl->mpFrameData->mpBuffer = VclPtrInstance<VirtualDevice>();
// Make sure that the buffer size matches the frame size.
mpWindowImpl->mpFrameData->mpBuffer->SetOutputSizePixel(mpWindowImpl->mpFrameWindow->GetOutputSizePixel());
}
else
mpWindowImpl->mpFrameData->mpBuffer.reset();
}
/*
* The rational here is that we moved destructors to
* dispose and this altered a lot of code paths, that
......
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