include/svx/sdr/overlay/overlaymanager.hxx        |    3 +++
 sc/source/ui/view/tabview3.cxx                    |   12 ++++++++++++
 svx/inc/sdr/overlay/overlaymanagerbuffered.hxx    |    3 +++
 svx/source/sdr/overlay/overlaymanager.cxx         |    5 +++++
 svx/source/sdr/overlay/overlaymanagerbuffered.cxx |    6 ++++++
 5 files changed, 29 insertions(+)

New commits:
commit f007d20a0a4224cab3e6ebb4a3083c0a579efa65
Author:     Armin Le Grand (allotropia) <armin.le.grand.ext...@allotropia.de>
AuthorDate: Wed Mar 12 16:10:18 2025 +0100
Commit:     Armin Le Grand <armin.le.gr...@me.com>
CommitDate: Thu Mar 13 15:01:19 2025 +0100

    tdf#165621 fix Calc repaint on TextEdit activation
    
    Found a simple way to do that (after some experimenting),
    needed to trigger the Overlay update, and that can just be
    done with a Reschedule. Other places that used
    flushOverlayManager() checked, but work on their own, so
    we do not need to bring that OverlayManager flush back.
    
    Unfortunately this triggers CppunitTest_desktop_lib
    "DesktopLOKTest::testRedlineCalc", probably due to not
    only the timer triggering but 'other' stuff that better
    runs later (...?). Not doing it - as long as we need
    to do it - is safer, but forces to keep that flush just
    for this single usage.
    
    Change-Id: Iacf18d688597129baba6e893252487d73a1fdfff
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/182834
    Tested-by: Jenkins
    Reviewed-by: Armin Le Grand <armin.le.gr...@me.com>

diff --git a/include/svx/sdr/overlay/overlaymanager.hxx 
b/include/svx/sdr/overlay/overlaymanager.hxx
index 3ce37976a99d..350aca310ff1 100644
--- a/include/svx/sdr/overlay/overlaymanager.hxx
+++ b/include/svx/sdr/overlay/overlaymanager.hxx
@@ -90,6 +90,9 @@ namespace sdr::overlay
             // complete redraw
             virtual void completeRedraw(const vcl::Region& rRegion, 
OutputDevice* pPreRenderDevice = nullptr) const;
 
+            // flush. Do buffered updates.
+            virtual void flush();
+
             // get the OutputDevice
             OutputDevice& getOutputDevice() const { return mrOutputDevice; }
 
diff --git a/sc/source/ui/view/tabview3.cxx b/sc/source/ui/view/tabview3.cxx
index c725ea4c8f4e..dbb3f7d9ac7c 100644
--- a/sc/source/ui/view/tabview3.cxx
+++ b/sc/source/ui/view/tabview3.cxx
@@ -2225,6 +2225,18 @@ void ScTabView::MakeEditView( ScEditEngineDefaulter* 
pEngine, SCCOL nCol, SCROW
                 pGridWin[i]->DeleteAutoFillOverlay();
                 pGridWin[i]->DeleteCopySourceOverlay();
 
+                // tdf#165621 allow the Overlay to quickly update, necessary
+                // for clean graphical refreshes
+                // NOTE: This also works using Application::Reschedule(true), 
but
+                // triggers CppunitTest_desktop_lib 
"DesktopLOKTest::testRedlineCalc",
+                // probably due to not only the timer triggering but 'other' 
stuff
+                // that better runs later (...?). Not doing it - as long as we 
need
+                // to do it - is safer, but forces to keep that flush just for 
this
+                // single usage
+                rtl::Reference<sdr::overlay::OverlayManager> xOverlayManager = 
pGridWin[i]->getOverlayManager();
+                if (xOverlayManager.is())
+                    xOverlayManager->flush();
+
                 // MapMode must be set after HideCursor
                 pGridWin[i]->SetMapMode(aViewData.GetLogicMode());
 
diff --git a/svx/inc/sdr/overlay/overlaymanagerbuffered.hxx 
b/svx/inc/sdr/overlay/overlaymanagerbuffered.hxx
index cc2a1fe5c217..a5acd6abc3ee 100644
--- a/svx/inc/sdr/overlay/overlaymanagerbuffered.hxx
+++ b/svx/inc/sdr/overlay/overlaymanagerbuffered.hxx
@@ -62,6 +62,9 @@ namespace sdr::overlay
             // complete redraw
             virtual void completeRedraw(const vcl::Region& rRegion, 
OutputDevice* pPreRenderDevice = nullptr) const override;
 
+            // flush. Do buffered updates.
+            virtual void flush() override;
+
             // invalidate the given range at local OutputDevice
             virtual void invalidateRange(const basegfx::B2DRange& rRange) 
override;
         };
diff --git a/svx/source/sdr/overlay/overlaymanager.cxx 
b/svx/source/sdr/overlay/overlaymanager.cxx
index b31197ab59ac..3e0098eb26cf 100644
--- a/svx/source/sdr/overlay/overlaymanager.cxx
+++ b/svx/source/sdr/overlay/overlaymanager.cxx
@@ -255,6 +255,11 @@ namespace sdr::overlay
             ImpDrawMembers(aRegionRange, rTarget);
         }
 
+        void OverlayManager::flush()
+        {
+            // default has nothing to do
+        }
+
         void OverlayManager::add(OverlayObject& rOverlayObject)
         {
             OSL_ENSURE(nullptr == rOverlayObject.mpOverlayManager, 
"OverlayObject is added twice to an OverlayManager (!)");
diff --git a/svx/source/sdr/overlay/overlaymanagerbuffered.cxx 
b/svx/source/sdr/overlay/overlaymanagerbuffered.cxx
index 754f9ea5deb2..a58ec8192004 100644
--- a/svx/source/sdr/overlay/overlaymanagerbuffered.cxx
+++ b/svx/source/sdr/overlay/overlaymanagerbuffered.cxx
@@ -388,6 +388,12 @@ namespace sdr::overlay
             OverlayManager::completeRedraw(rRegion, pPreRenderDevice);
         }
 
+        void OverlayManagerBuffered::flush()
+        {
+            // call timer handler direct
+            ImpBufferTimerHandler(nullptr);
+        }
+
         void OverlayManagerBuffered::invalidateRange(const basegfx::B2DRange& 
rRange)
         {
             if(rRange.isEmpty())

Reply via email to