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())