diff options
-rw-r--r-- | desktop/inc/lib/init.hxx | 3 | ||||
-rw-r--r-- | desktop/source/lib/init.cxx | 204 |
2 files changed, 114 insertions, 93 deletions
diff --git a/desktop/inc/lib/init.hxx b/desktop/inc/lib/init.hxx index e6b4f00a5427..2693e67eb718 100644 --- a/desktop/inc/lib/init.hxx +++ b/desktop/inc/lib/init.hxx @@ -128,9 +128,12 @@ namespace desktop { typedef std::vector<CallbackData> queue_type2; private: + bool removeAll(int type); + bool removeAll(int type, const std::function<bool (const CallbackData&)>& rTestFunc); bool removeAll(const std::function<bool (int, const CallbackData&)>& rTestFunc); bool processInvalidateTilesEvent(int type, CallbackData& aCallbackData); bool processWindowEvent(int type, CallbackData& aCallbackData); + queue_type2::iterator toQueue2(queue_type1::iterator); queue_type2::reverse_iterator toQueue2(queue_type1::reverse_iterator); /** we frequently want to scan the queue, and mostly when we do so, we only care about the element type diff --git a/desktop/source/lib/init.cxx b/desktop/source/lib/init.cxx index 26ba3016b99c..267d54492d14 100644 --- a/desktop/source/lib/init.cxx +++ b/desktop/source/lib/init.cxx @@ -1426,6 +1426,12 @@ void CallbackFlushHandler::callback(const int type, const char* payload, void* d } } +CallbackFlushHandler::queue_type2::iterator CallbackFlushHandler::toQueue2(CallbackFlushHandler::queue_type1::iterator pos) +{ + int delta = std::distance(m_queue1.begin(), pos); + return m_queue2.begin() + delta; +} + CallbackFlushHandler::queue_type2::reverse_iterator CallbackFlushHandler::toQueue2(CallbackFlushHandler::queue_type1::reverse_iterator pos) { int delta = std::distance(m_queue1.rbegin(), pos); @@ -1555,8 +1561,7 @@ void CallbackFlushHandler::queue(const int type, const char* data) case LOK_CALLBACK_GRAPHIC_SELECTION: case LOK_CALLBACK_INVALIDATE_VISIBLE_CURSOR: case LOK_CALLBACK_INVALIDATE_TILES: - if (removeAll( - [type](int elemType, const CallbackData&) { return (elemType == type); })) + if (removeAll(type)) SAL_INFO("lok", "Removed dups of [" << type << "]: [" << payload << "]."); break; } @@ -1579,8 +1584,7 @@ void CallbackFlushHandler::queue(const int type, const char* data) case LOK_CALLBACK_STATUS_INDICATOR_SET_VALUE: case LOK_CALLBACK_RULER_UPDATE: { - if (removeAll( - [type](int elemType, const CallbackData&) { return (elemType == type); })) + if (removeAll(type)) SAL_INFO("lok", "Removed dups of [" << type << "]: [" << payload << "]."); } break; @@ -1603,9 +1607,8 @@ void CallbackFlushHandler::queue(const int type, const char* data) payload.find("\"hyperlink\":\"\"") == std::string::npos && payload.find("\"hyperlink\": {}") == std::string::npos; const int nViewId = lcl_getViewId(payload); - removeAll( - [type, nViewId, hyperLinkException] (int elemType, const CallbackData& elemData) { - return (elemType == type && nViewId == lcl_getViewId(elemData) && !hyperLinkException); + removeAll(type, [nViewId, hyperLinkException] (const CallbackData& elemData) { + return (nViewId == lcl_getViewId(elemData) && !hyperLinkException); } ); } @@ -1629,9 +1632,8 @@ void CallbackFlushHandler::queue(const int type, const char* data) // a save occurs while a cell is still edited in Calc. if (name != ".uno:ModifiedStatus=") { - removeAll( - [type, &name] (int elemType, const CallbackData& elemData) { - return (elemType == type) && (elemData.PayloadString.compare(0, name.size(), name) == 0); + removeAll(type, [&name] (const CallbackData& elemData) { + return (elemData.PayloadString.compare(0, name.size(), name) == 0); } ); } @@ -1648,8 +1650,8 @@ void CallbackFlushHandler::queue(const int type, const char* data) { // remove only selection ranges and 'EMPTY' messages // always send 'INPLACE' and 'INPLACE EXIT' messages - removeAll([type, payload] (int elemType, const CallbackData& elemData) - { return (elemType == type && elemData.PayloadString[0] != 'I'); }); + removeAll(type, [payload] (const CallbackData& elemData) + { return (elemData.PayloadString[0] != 'I'); }); } break; } @@ -1734,16 +1736,9 @@ bool CallbackFlushHandler::processInvalidateTilesEvent(int type, CallbackData& a { SAL_INFO("lok", "Have Empty [" << type << "]: [" << payload << "] so removing all with part " << rcNew.m_nPart << "."); - removeAll([&rcNew](int elemType, const CallbackData& elemData) { - if (elemType == LOK_CALLBACK_INVALIDATE_TILES) - { - // Remove exiting if new is all-encompassing, or if of the same part. - const RectangleAndPart rcOld = RectangleAndPart::Create(elemData.PayloadString); - return (rcNew.m_nPart == -1 || rcOld.m_nPart == rcNew.m_nPart); - } - - // Keep others. - return false; + 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); }); } else @@ -1751,55 +1746,52 @@ bool CallbackFlushHandler::processInvalidateTilesEvent(int type, CallbackData& a const auto rcOrig = rcNew; SAL_INFO("lok", "Have [" << type << "]: [" << payload << "] so merging overlapping."); - removeAll([&rcNew](int elemType, const CallbackData& elemData) { - if (elemType == LOK_CALLBACK_INVALIDATE_TILES) + 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) { - const RectangleAndPart& rcOld = elemData.getRectangleAndPart(); - if (rcNew.m_nPart != -1 && rcOld.m_nPart != -1 && rcOld.m_nPart != rcNew.m_nPart) - { - SAL_INFO("lok", "Nothing to merge between new: " - << rcNew.toString() << ", and old: " << rcOld.toString()); - return false; - } + SAL_INFO("lok", "Nothing to merge between new: " + << rcNew.toString() << ", and old: " << rcOld.toString()); + return false; + } - if (rcNew.m_nPart == -1) + if (rcNew.m_nPart == -1) + { + // Don't merge unless fully overlapped. + SAL_INFO("lok", "New " << rcNew.toString() << " has " << rcOld.toString() + << "?"); + if (rcNew.m_aRectangle.Contains(rcOld.m_aRectangle)) { - // Don't merge unless fully overlapped. - SAL_INFO("lok", "New " << rcNew.toString() << " has " << rcOld.toString() - << "?"); - if (rcNew.m_aRectangle.Contains(rcOld.m_aRectangle)) - { - SAL_INFO("lok", "New " << rcNew.toString() << " engulfs old " - << rcOld.toString() << "."); - return true; - } + SAL_INFO("lok", "New " << rcNew.toString() << " engulfs old " + << rcOld.toString() << "."); + return true; } - else if (rcOld.m_nPart == -1) + } + else if (rcOld.m_nPart == -1) + { + // Don't merge unless fully overlapped. + SAL_INFO("lok", "Old " << rcOld.toString() << " has " << rcNew.toString() + << "?"); + if (rcOld.m_aRectangle.Contains(rcNew.m_aRectangle)) { - // Don't merge unless fully overlapped. - SAL_INFO("lok", "Old " << rcOld.toString() << " has " << rcNew.toString() - << "?"); - if (rcOld.m_aRectangle.Contains(rcNew.m_aRectangle)) - { - SAL_INFO("lok", "New " << rcNew.toString() << " engulfs old " - << rcOld.toString() << "."); - return true; - } + SAL_INFO("lok", "New " << rcNew.toString() << " engulfs old " + << rcOld.toString() << "."); + return true; } - else + } + else + { + const tools::Rectangle rcOverlap + = rcNew.m_aRectangle.GetIntersection(rcOld.m_aRectangle); + const bool bOverlap = !rcOverlap.IsEmpty(); + SAL_INFO("lok", "Merging " << rcNew.toString() << " & " << rcOld.toString() + << " => " << rcOverlap.toString() + << " Overlap: " << bOverlap); + if (bOverlap) { - const tools::Rectangle rcOverlap - = rcNew.m_aRectangle.GetIntersection(rcOld.m_aRectangle); - const bool bOverlap = !rcOverlap.IsEmpty(); - SAL_INFO("lok", "Merging " << rcNew.toString() << " & " << rcOld.toString() - << " => " << rcOverlap.toString() - << " Overlap: " << bOverlap); - if (bOverlap) - { - rcNew.m_aRectangle.Union(rcOld.m_aRectangle); - SAL_INFO("lok", "Merged: " << rcNew.toString()); - return true; - } + rcNew.m_aRectangle.Union(rcOld.m_aRectangle); + SAL_INFO("lok", "Merged: " << rcNew.toString()); + return true; } } @@ -1837,15 +1829,12 @@ bool CallbackFlushHandler::processWindowEvent(int type, CallbackData& aCallbackD // remove all previous window part invalidations if (aRectStr.empty()) { - removeAll([&nLOKWindowId](int elemType, const CallbackData& elemData) { - if (elemType == LOK_CALLBACK_WINDOW) + removeAll(LOK_CALLBACK_WINDOW,[&nLOKWindowId](const CallbackData& elemData) { + const boost::property_tree::ptree& aOldTree = elemData.getJson(); + if (nLOKWindowId == aOldTree.get<unsigned>("id", 0) + && aOldTree.get<std::string>("action", "") == "invalidate") { - const boost::property_tree::ptree& aOldTree = elemData.getJson(); - if (nLOKWindowId == aOldTree.get<unsigned>("id", 0) - && aOldTree.get<std::string>("action", "") == "invalidate") - { - return true; - } + return true; } return false; }); @@ -1886,11 +1875,8 @@ bool CallbackFlushHandler::processWindowEvent(int type, CallbackData& aCallbackD aRectStream >> nLeft >> nComma >> nTop >> nComma >> nWidth >> nComma >> nHeight; tools::Rectangle aNewRect(nLeft, nTop, nLeft + nWidth, nTop + nHeight); bool currentIsRedundant = false; - removeAll([&aNewRect, &nLOKWindowId, - ¤tIsRedundant](int elemType, const CallbackData& elemData) { - if (elemType != LOK_CALLBACK_WINDOW) - return false; - + removeAll(LOK_CALLBACK_WINDOW, [&aNewRect, &nLOKWindowId, + ¤tIsRedundant](const CallbackData& elemData) { const boost::property_tree::ptree& aOldTree = elemData.getJson(); if (aOldTree.get<std::string>("action", "") == "invalidate") { @@ -1962,13 +1948,10 @@ bool CallbackFlushHandler::processWindowEvent(int type, CallbackData& aCallbackD else if (aAction == "created") { // Remove all previous actions on same dialog, if we are creating it anew. - removeAll([&nLOKWindowId](int elemType, const CallbackData& elemData) { - if (elemType == LOK_CALLBACK_WINDOW) - { - const boost::property_tree::ptree& aOldTree = elemData.getJson(); - if (nLOKWindowId == aOldTree.get<unsigned>("id", 0)) - return true; - } + removeAll(LOK_CALLBACK_WINDOW,[&nLOKWindowId](const CallbackData& elemData) { + const boost::property_tree::ptree& aOldTree = elemData.getJson(); + if (nLOKWindowId == aOldTree.get<unsigned>("id", 0)) + return true; return false; }); @@ -1990,16 +1973,13 @@ bool CallbackFlushHandler::processWindowEvent(int type, CallbackData& aCallbackD { // A size change is practically re-creation of the window. // But at a minimum it's a full invalidation. - removeAll([&nLOKWindowId](int elemType, const CallbackData& elemData) { - if (elemType == LOK_CALLBACK_WINDOW) + removeAll(LOK_CALLBACK_WINDOW, [&nLOKWindowId](const CallbackData& elemData) { + const boost::property_tree::ptree& aOldTree = elemData.getJson(); + if (nLOKWindowId == aOldTree.get<unsigned>("id", 0)) { - const boost::property_tree::ptree& aOldTree = elemData.getJson(); - if (nLOKWindowId == aOldTree.get<unsigned>("id", 0)) - { - const std::string aOldAction = aOldTree.get<std::string>("action", ""); - if (aOldAction == "invalidate") - return true; - } + const std::string aOldAction = aOldTree.get<std::string>("action", ""); + if (aOldAction == "invalidate") + return true; } return false; }); @@ -2077,6 +2057,44 @@ void CallbackFlushHandler::Invoke() m_queue2.clear(); } +bool CallbackFlushHandler::removeAll(int type) +{ + bool bErased = false; + auto it1 = m_queue1.begin(); + for(;;) + { + it1 = std::find(it1, m_queue1.end(), type); + if(it1 == m_queue1.end()) + break; + m_queue2.erase(toQueue2(it1)); + it1 = m_queue1.erase(it1); + bErased = true; + } + return bErased; +} + +bool CallbackFlushHandler::removeAll(int type, const std::function<bool (const CallbackData&)>& rTestFunc) +{ + bool bErased = false; + auto it1 = m_queue1.begin(); + for(;;) + { + it1 = std::find(it1, m_queue1.end(), type); + if(it1 == m_queue1.end()) + break; + auto it2 = toQueue2(it1); + if (rTestFunc(*it2)) + { + m_queue2.erase(it2); + it1 = m_queue1.erase(it1); + bErased = true; + } + else + ++it1; + } + return bErased; +} + bool CallbackFlushHandler::removeAll(const std::function<bool (int, const CallbackData&)>& rTestFunc) { bool bErased = false; |