summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Meeks <michael.meeks@collabora.com>2019-04-26 20:04:00 +0100
committerAndras Timar <andras.timar@collabora.com>2019-05-19 21:16:08 +0200
commit390559b613cd613db5cca8bc6990a8ddcf5da48f (patch)
tree79bb561c828f314c7537ad932bd3c25ceb9ce1fe
parentdf683b82cd9b68cb3e60bc6f5e3e826236e7a330 (diff)
lok: disable VCL painting and whole window invalidation.
The reasoning is somewhat complex: void Window::ImplInvalidateFrameRegion( const vcl::Region* pRegion, InvalidateFlags nFlags ) sets the mnPaintFlags on the mpWindowImpl - and then queues an idle paint. This paint in LOK mode does ~nothing - since all rendering is tiled, although amazingly it does emit eg. selection callbacks. However the paint flag - changes the behavior of Window::Update() to force a complete window invalidate. This happens, but only rarely - when a key-event manages to get into the mainloop before the idle paint handler arrives and does nothing (except clear the paint flags). So - don't do these big invalidations we don't need to in lok mode, unless it is for dialogs - which presumably Pranav wanted fixed by 625087b58f3b7. Change-Id: I88dda34b8d8bba9c89296d883ad9169fe49a7c5e Reviewed-on: https://gerrit.libreoffice.org/71396 Reviewed-by: Michael Meeks <michael.meeks@collabora.com> Reviewed-by: Ashod Nakashian <ashnakash@gmail.com> Tested-by: Jan Holesovsky <kendy@collabora.com> (cherry picked from commit d36f089b2898ed4d066fc656f36543c9e13c0f48) Reviewed-on: https://gerrit.libreoffice.org/71662 Reviewed-by: Andras Timar <andras.timar@collabora.com> Tested-by: Andras Timar <andras.timar@collabora.com>
-rw-r--r--vcl/source/window/paint.cxx11
1 files changed, 10 insertions, 1 deletions
diff --git a/vcl/source/window/paint.cxx b/vcl/source/window/paint.cxx
index d88e04823ed8..fa72408c2608 100644
--- a/vcl/source/window/paint.cxx
+++ b/vcl/source/window/paint.cxx
@@ -32,6 +32,7 @@
#include <salframe.hxx>
#include <svdata.hxx>
#include <comphelper/lok.hxx>
+#include <comphelper/profilezone.hxx>
#if HAVE_FEATURE_OPENGL
#include <vcl/opengl/OpenGLHelper.hxx>
#endif
@@ -640,6 +641,8 @@ void Window::ImplCallOverlapPaint()
IMPL_LINK_NOARG(Window, ImplHandlePaintHdl, Idle *, void)
{
+ comphelper::ProfileZone aZone("VCL idle re-paint");
+
// save paint events until layout is done
if (IsSystemWindow() && static_cast<const SystemWindow*>(this)->hasPendingLayout())
{
@@ -661,6 +664,8 @@ IMPL_LINK_NOARG(Window, ImplHandlePaintHdl, Idle *, void)
IMPL_LINK_NOARG(Window, ImplHandleResizeTimerHdl, Idle *, void)
{
+ comphelper::ProfileZone aZone("VCL idle resize");
+
if( mpWindowImpl->mbReallyVisible )
{
ImplCallResize();
@@ -726,6 +731,7 @@ void Window::ImplInvalidateFrameRegion( const vcl::Region* pRegion, InvalidateFl
pParent->ImplInvalidateFrameRegion( pChildRegion, nFlags );
}
}
+
if ( !mpWindowImpl->mpFrameData->maPaintIdle.IsActive() )
mpWindowImpl->mpFrameData->maPaintIdle.Start();
}
@@ -1330,10 +1336,13 @@ void Window::Update()
}
pUpdateWindow->ImplCallPaint(nullptr, pUpdateWindow->mpWindowImpl->mnPaintFlags);
- pUpdateWindow->LogicInvalidate(nullptr);
+
+ if (comphelper::LibreOfficeKit::isActive() && pUpdateWindow->GetParentDialog())
+ pUpdateWindow->LogicInvalidate(nullptr);
if (xWindow->IsDisposed())
return;
+
bFlush = true;
}