From 5a695a1d1fce56dbf31516fdcfb27d1969b35da6 Mon Sep 17 00:00:00 2001 From: Michael Meeks Date: Fri, 26 Apr 2019 20:04:00 +0100 Subject: 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 Reviewed-by: Ashod Nakashian Tested-by: Jan Holesovsky (cherry picked from commit d36f089b2898ed4d066fc656f36543c9e13c0f48) --- vcl/source/window/paint.cxx | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) (limited to 'vcl') diff --git a/vcl/source/window/paint.cxx b/vcl/source/window/paint.cxx index 4baaf3e8bf10..6fd447cbce70 100644 --- a/vcl/source/window/paint.cxx +++ b/vcl/source/window/paint.cxx @@ -32,6 +32,7 @@ #include #include #include +#include #if HAVE_FEATURE_OPENGL #include #endif @@ -633,6 +634,8 @@ void Window::ImplCallOverlapPaint() IMPL_LINK_NOARG(Window, ImplHandlePaintHdl, Timer *, void) { + comphelper::ProfileZone aZone("VCL idle re-paint"); + // save paint events until layout is done if (IsSystemWindow() && static_cast(this)->hasPendingLayout()) { @@ -654,6 +657,8 @@ IMPL_LINK_NOARG(Window, ImplHandlePaintHdl, Timer *, void) IMPL_LINK_NOARG(Window, ImplHandleResizeTimerHdl, Timer *, void) { + comphelper::ProfileZone aZone("VCL idle resize"); + if( mpWindowImpl->mbReallyVisible ) { ImplCallResize(); @@ -721,6 +726,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; } -- cgit