diff options
author | Szymon Kłos <szymon.klos@collabora.com> | 2022-08-29 09:07:33 +0200 |
---|---|---|
committer | Szymon Kłos <szymon.klos@collabora.com> | 2022-11-10 10:15:46 +0100 |
commit | 3f4e11bd40f60510272df7a285d8a78181af0ccb (patch) | |
tree | d3f2ad594143dad546a12d6b5d4e18a360157115 /desktop/source/lib | |
parent | 652df8c733f381cac4e22286acd12a2ec72d41ae (diff) |
lok: masterpage: use EditMode as parameter in invalidation callback
Change-Id: I3905fc9e6376ca1cef3e438e7a5f229d3720b1f5
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/138961
Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoffice@gmail.com>
Reviewed-by: Henry Castro <hcastro@collabora.com>
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/142501
Tested-by: Jenkins
Reviewed-by: Szymon Kłos <szymon.klos@collabora.com>
Diffstat (limited to 'desktop/source/lib')
-rw-r--r-- | desktop/source/lib/init.cxx | 51 |
1 files changed, 40 insertions, 11 deletions
diff --git a/desktop/source/lib/init.cxx b/desktop/source/lib/init.cxx index 6008820da1bb..d4332d5c2926 100644 --- a/desktop/source/lib/init.cxx +++ b/desktop/source/lib/init.cxx @@ -64,6 +64,7 @@ #include <comphelper/propertyvalue.hxx> #include <comphelper/scopeguard.hxx> #include <comphelper/threadpool.hxx> +#include <comphelper/servicehelper.hxx> #include <comphelper/sequenceashashmap.hxx> #include <com/sun/star/document/MacroExecMode.hpp> @@ -422,12 +423,26 @@ RectangleAndPart RectangleAndPart::Create(const std::string& rPayload) { aRet.m_aRectangle = tools::Rectangle(0, 0, SfxLokHelper::MaxTwips, SfxLokHelper::MaxTwips); if (comphelper::LibreOfficeKit::isPartInInvalidation()) - aRet.m_nPart = std::stol(rPayload.substr(6)); + { + int nSeparatorPos = rPayload.find(',', 6); + bool bHasMode = nSeparatorPos > 0; + if (bHasMode) + { + aRet.m_nPart = std::stol(rPayload.substr(6, nSeparatorPos - 6)); + assert(rPayload.length() > o3tl::make_unsigned(nSeparatorPos)); + aRet.m_nMode = std::stol(rPayload.substr(nSeparatorPos + 1)); + } + else + { + aRet.m_nPart = std::stol(rPayload.substr(6)); + aRet.m_nMode = 0; + } + } return aRet; } - // Read '<left>, <top>, <width>, <height>[, <part>]'. C++ streams are simpler but slower. + // Read '<left>, <top>, <width>, <height>[, <part>, <mode>]'. C++ streams are simpler but slower. const char* pos = rPayload.c_str(); const char* end = rPayload.c_str() + rPayload.size(); tools::Long nLeft = rtl_str_toInt64_WithLength(pos, 10, end - pos); @@ -447,6 +462,7 @@ RectangleAndPart RectangleAndPart::Create(const std::string& rPayload) assert(pos < end); tools::Long nHeight = rtl_str_toInt64_WithLength(pos, 10, end - pos); tools::Long nPart = INT_MIN; + tools::Long nMode = 0; if (comphelper::LibreOfficeKit::isPartInInvalidation()) { while( *pos != ',' ) @@ -454,10 +470,20 @@ RectangleAndPart RectangleAndPart::Create(const std::string& rPayload) ++pos; assert(pos < end); nPart = rtl_str_toInt64_WithLength(pos, 10, end - pos); + + while( *pos && *pos != ',' ) + ++pos; + if (*pos) + { + ++pos; + assert(pos < end); + nMode = rtl_str_toInt64_WithLength(pos, 10, end - pos); + } } aRet.m_aRectangle = SanitizedRectangle(nLeft, nTop, nWidth, nHeight); aRet.m_nPart = nPart; + aRet.m_nMode = nMode; return aRet; } @@ -1460,9 +1486,9 @@ void CallbackFlushHandler::libreOfficeKitViewCallbackWithViewId(int nType, const queue(nType, callbackData); } -void CallbackFlushHandler::libreOfficeKitViewInvalidateTilesCallback(const tools::Rectangle* pRect, int nPart) +void CallbackFlushHandler::libreOfficeKitViewInvalidateTilesCallback(const tools::Rectangle* pRect, int nPart, int nMode) { - CallbackData callbackData(pRect, nPart); + CallbackData callbackData(pRect, nPart, nMode); queue(LOK_CALLBACK_INVALIDATE_TILES, callbackData); } @@ -1799,14 +1825,15 @@ bool CallbackFlushHandler::processInvalidateTilesEvent(int type, CallbackData& a { auto pos2 = toQueue2(pos); const RectangleAndPart& rcOld = pos2->getRectangleAndPart(); - if (rcOld.isInfinite() && (rcOld.m_nPart == -1 || rcOld.m_nPart == rcNew.m_nPart)) + if (rcOld.isInfinite() && (rcOld.m_nPart == -1 || rcOld.m_nPart == rcNew.m_nPart) && + (rcOld.m_nMode == rcNew.m_nMode)) { SAL_INFO("lok", "Skipping queue [" << type << "]: [" << aCallbackData.getPayload() << "] since all tiles need to be invalidated."); return true; } - if (rcOld.m_nPart == -1 || rcOld.m_nPart == rcNew.m_nPart) + if ((rcOld.m_nPart == -1 || rcOld.m_nPart == rcNew.m_nPart) && (rcOld.m_nMode == rcNew.m_nMode)) { // If fully overlapping. if (rcOld.m_aRectangle.Contains(rcNew.m_aRectangle)) @@ -1824,7 +1851,8 @@ bool CallbackFlushHandler::processInvalidateTilesEvent(int type, CallbackData& a << "] so removing all with part " << rcNew.m_nPart << "."); removeAll(LOK_CALLBACK_INVALIDATE_TILES, [&rcNew](const CallbackData& elemData) { // Remove exiting if new is all-encompassing, or if of the same part. - return (rcNew.m_nPart == -1 || rcNew.m_nPart == elemData.getRectangleAndPart().m_nPart); + return ((rcNew.m_nPart == -1 || rcNew.m_nPart == elemData.getRectangleAndPart().m_nPart) + && (rcNew.m_nMode == elemData.getRectangleAndPart().m_nMode)); }); } else @@ -1834,7 +1862,8 @@ bool CallbackFlushHandler::processInvalidateTilesEvent(int type, CallbackData& a SAL_INFO("lok", "Have [" << type << "]: [" << aCallbackData.getPayload() << "] so merging overlapping."); removeAll(LOK_CALLBACK_INVALIDATE_TILES,[&rcNew](const CallbackData& elemData) { const RectangleAndPart& rcOld = elemData.getRectangleAndPart(); - if (rcNew.m_nPart != -1 && rcOld.m_nPart != -1 && rcOld.m_nPart != rcNew.m_nPart) + if (rcNew.m_nPart != -1 && rcOld.m_nPart != -1 && + (rcOld.m_nPart != rcNew.m_nPart || rcOld.m_nMode != rcNew.m_nMode)) { SAL_INFO("lok", "Nothing to merge between new: " << rcNew.toString() << ", and old: " << rcOld.toString()); @@ -1846,7 +1875,7 @@ bool CallbackFlushHandler::processInvalidateTilesEvent(int type, CallbackData& a // Don't merge unless fully overlapped. SAL_INFO("lok", "New " << rcNew.toString() << " has " << rcOld.toString() << "?"); - if (rcNew.m_aRectangle.Contains(rcOld.m_aRectangle)) + if (rcNew.m_aRectangle.Contains(rcOld.m_aRectangle) && rcOld.m_nMode == rcNew.m_nMode) { SAL_INFO("lok", "New " << rcNew.toString() << " engulfs old " << rcOld.toString() << "."); @@ -1858,7 +1887,7 @@ bool CallbackFlushHandler::processInvalidateTilesEvent(int type, CallbackData& a // Don't merge unless fully overlapped. SAL_INFO("lok", "Old " << rcOld.toString() << " has " << rcNew.toString() << "?"); - if (rcOld.m_aRectangle.Contains(rcNew.m_aRectangle)) + if (rcOld.m_aRectangle.Contains(rcNew.m_aRectangle) && rcOld.m_nMode == rcNew.m_nMode) { SAL_INFO("lok", "New " << rcNew.toString() << " engulfs old " << rcOld.toString() << "."); @@ -1869,7 +1898,7 @@ bool CallbackFlushHandler::processInvalidateTilesEvent(int type, CallbackData& a { const tools::Rectangle rcOverlap = rcNew.m_aRectangle.GetIntersection(rcOld.m_aRectangle); - const bool bOverlap = !rcOverlap.IsEmpty(); + const bool bOverlap = !rcOverlap.IsEmpty() && rcOld.m_nMode == rcNew.m_nMode; SAL_INFO("lok", "Merging " << rcNew.toString() << " & " << rcOld.toString() << " => " << rcOverlap.toString() << " Overlap: " << bOverlap); |