diff options
author | Miklos Vajna <vmiklos@collabora.co.uk> | 2015-08-17 17:10:30 +0200 |
---|---|---|
committer | Miklos Vajna <vmiklos@collabora.co.uk> | 2015-08-17 17:11:44 +0200 |
commit | 3c2b80066bf2fba4e7222fb7d30ac7d412539818 (patch) | |
tree | 004305da3f0d24c9b358f58504c67e3056ec1a12 | |
parent | a19e2064c09275e9b053cc6c13d319c1a5c1c992 (diff) |
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
-rw-r--r-- | include/vcl/window.hxx | 2 | ||||
-rw-r--r-- | sw/source/uibase/uiview/view.cxx | 10 | ||||
-rw-r--r-- | vcl/source/window/window.cxx | 14 |
3 files changed, 25 insertions, 1 deletions
diff --git a/include/vcl/window.hxx b/include/vcl/window.hxx index a105bddcdc44..57ac3197aaaa 100644 --- a/include/vcl/window.hxx +++ b/include/vcl/window.hxx @@ -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 ); diff --git a/sw/source/uibase/uiview/view.cxx b/sw/source/uibase/uiview/view.cxx index 4125a91ce739..9fd8dd788e4b 100644 --- a/sw/source/uibase/uiview/view.cxx +++ b/sw/source/uibase/uiview/view.cxx @@ -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; } diff --git a/vcl/source/window/window.cxx b/vcl/source/window/window.cxx index 35b4f06ff738..8a0d521976c4 100644 --- a/vcl/source/window/window.cxx +++ b/vcl/source/window/window.cxx @@ -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 |