bundled/include/LibreOfficeKit/LibreOfficeKitEnums.h | 8 +++++- kit/Kit.cpp | 24 ++++++++++++++++--- loleaflet/src/layer/tile/TileLayer.js | 11 +++++--- test/httpwstest.cpp | 8 +++++- 4 files changed, 42 insertions(+), 9 deletions(-)
New commits: commit ffd7151443ee360c7764aaa77f9e7fe5f5d64eee Author: Tamás Zolnai <tamas.zol...@collabora.com> Date: Sun Apr 8 00:00:53 2018 +0200 Writer: View jumps to cursor position even if it is moved by an other view. Need to get the viewid which moved our visible cursor, so we can check whether it positioned changed by the owner of the cursor or not. Change-Id: Ie7b1fafc8d8f11fba0c0b0d5f02d755e15284514 Reviewed-on: https://gerrit.libreoffice.org/52571 Reviewed-by: Jan Holesovsky <ke...@collabora.com> Tested-by: Jan Holesovsky <ke...@collabora.com> diff --git a/bundled/include/LibreOfficeKit/LibreOfficeKitEnums.h b/bundled/include/LibreOfficeKit/LibreOfficeKitEnums.h index 300d91e1c..74d49fa15 100644 --- a/bundled/include/LibreOfficeKit/LibreOfficeKitEnums.h +++ b/bundled/include/LibreOfficeKit/LibreOfficeKitEnums.h @@ -84,7 +84,13 @@ typedef enum /** * Enable range based header data */ - LOK_FEATURE_RANGE_HEADERS = (1ULL << 4) + LOK_FEATURE_RANGE_HEADERS = (1ULL << 4), + + /** + * Request to have the active view's Id as the 1st value in the + * LOK_CALLBACK_INVALIDATE_VISIBLE_CURSOR payload. + */ + LOK_FEATURE_VIEWID_IN_VISCURSOR_INVALIDATION_CALLBACK = (1ULL << 5) } LibreOfficeKitOptionalFeatures; diff --git a/kit/Kit.cpp b/kit/Kit.cpp index ffed796fb..1451778b3 100644 --- a/kit/Kit.cpp +++ b/kit/Kit.cpp @@ -1184,8 +1184,7 @@ public: // when we examine the content of the JSON std::string targetViewId; - if (type == LOK_CALLBACK_INVALIDATE_VISIBLE_CURSOR || - type == LOK_CALLBACK_CELL_CURSOR) + if (type == LOK_CALLBACK_CELL_CURSOR) { Poco::StringTokenizer tokens(payload, ",", Poco::StringTokenizer::TOK_IGNORE_EMPTY | Poco::StringTokenizer::TOK_TRIM); // Payload may be 'EMPTY'. @@ -1199,6 +1198,24 @@ public: tileQueue->updateCursorPosition(0, 0, cursorX, cursorY, cursorWidth, cursorHeight); } } + else if (type == LOK_CALLBACK_INVALIDATE_VISIBLE_CURSOR) + { + Poco::JSON::Parser parser; + const Poco::Dynamic::Var result = parser.parse(payload); + const auto& command = result.extract<Poco::JSON::Object::Ptr>(); + std::string rectangle = command->get("rectangle").toString(); + Poco::StringTokenizer tokens(rectangle, ",", Poco::StringTokenizer::TOK_IGNORE_EMPTY | Poco::StringTokenizer::TOK_TRIM); + // Payload may be 'EMPTY'. + if (tokens.count() == 4) + { + int cursorX = std::stoi(tokens[0]); + int cursorY = std::stoi(tokens[1]); + int cursorWidth = std::stoi(tokens[2]); + int cursorHeight = std::stoi(tokens[3]); + + tileQueue->updateCursorPosition(0, 0, cursorX, cursorY, cursorWidth, cursorHeight); + } + } else if (type == LOK_CALLBACK_INVALIDATE_VIEW_CURSOR || type == LOK_CALLBACK_CELL_VIEW_CURSOR) { @@ -1545,7 +1562,8 @@ private: | LOK_FEATURE_DOCUMENT_PASSWORD_TO_MODIFY | LOK_FEATURE_PART_IN_INVALIDATION_CALLBACK | LOK_FEATURE_NO_TILED_ANNOTATIONS - | LOK_FEATURE_RANGE_HEADERS; + | LOK_FEATURE_RANGE_HEADERS + | LOK_FEATURE_VIEWID_IN_VISCURSOR_INVALIDATION_CALLBACK; _loKit->setOptionalFeatures(flags); // Save the provided password with us and the jailed url diff --git a/loleaflet/src/layer/tile/TileLayer.js b/loleaflet/src/layer/tile/TileLayer.js index cc8fe0071..22c3bc634 100644 --- a/loleaflet/src/layer/tile/TileLayer.js +++ b/loleaflet/src/layer/tile/TileLayer.js @@ -761,7 +761,10 @@ L.TileLayer = L.GridLayer.extend({ _onInvalidateCursorMsg: function (textMsg) { var docLayer = this._map._docLayer; - var strTwips = textMsg.match(/\d+/g); + textMsg = textMsg.substring('invalidatecursor:'.length + 1); + var obj = JSON.parse(textMsg); + var modifierViewId = parseInt(obj.viewId); + var strTwips = obj.rectangle.match(/\d+/g); var topLeftTwips = new L.Point(parseInt(strTwips[0]), parseInt(strTwips[1])); var offset = new L.Point(parseInt(strTwips[2]), parseInt(strTwips[3])); var bottomRightTwips = topLeftTwips.add(offset); @@ -774,7 +777,7 @@ L.TileLayer = L.GridLayer.extend({ this._map.fire('setFollowOff'); } this._map.lastActionByUser = false; - this._onUpdateCursor(); + this._onUpdateCursor(this._viewId === modifierViewId); }, _updateEditor: function(textMsg) { @@ -1511,11 +1514,11 @@ L.TileLayer = L.GridLayer.extend({ }, // Update cursor layer (blinking cursor). - _onUpdateCursor: function (e) { + _onUpdateCursor: function (scroll) { var cursorPos = this._visibleCursor.getNorthWest(); var docLayer = this._map._docLayer; - if (!e && !this._map.getBounds().contains(this._visibleCursor) && this._isCursorVisible) { + if ((scroll !== false) && !this._map.getBounds().contains(this._visibleCursor) && this._isCursorVisible) { var center = this._map.project(cursorPos); center = center.subtract(this._map.getSize().divideBy(2)); center.x = Math.round(center.x < 0 ? 0 : center.x); diff --git a/test/httpwstest.cpp b/test/httpwstest.cpp index 7cb643a9a..45a424956 100644 --- a/test/httpwstest.cpp +++ b/test/httpwstest.cpp @@ -2518,7 +2518,13 @@ void HTTPWSTest::testCursorPosition() // receive cursor position response = getResponseString(socket0, "invalidatecursor:", testname); - Poco::StringTokenizer cursorTokens(response.substr(17), ",", Poco::StringTokenizer::TOK_IGNORE_EMPTY | Poco::StringTokenizer::TOK_TRIM); + + Poco::JSON::Parser parser0; + const Poco::Dynamic::Var result0 = parser0.parse(response.substr(17)); + const auto& command0 = result0.extract<Poco::JSON::Object::Ptr>(); + CPPUNIT_ASSERT_MESSAGE("missing property rectangle", command0->has("rectangle")); + + Poco::StringTokenizer cursorTokens(command0->get("rectangle").toString(), ",", Poco::StringTokenizer::TOK_IGNORE_EMPTY | Poco::StringTokenizer::TOK_TRIM); CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(4), cursorTokens.count()); // Create second view _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits