diff --git a/include/sfx2/lokhelper.hxx b/include/sfx2/lokhelper.hxx index 43c01892e98b..ec68ed6e313a 100644 --- a/include/sfx2/lokhelper.hxx +++ b/include/sfx2/lokhelper.hxx @@ -26,7 +26,7 @@ public: /// Set a view shell as current one. static void setView(std::uintptr_t nId); /// Get the currently active view. - static std::uintptr_t getView(SfxViewShell *pViewShell = nullptr); + static std::uintptr_t getView(SfxViewShell* pViewShell = nullptr); /// Get the number of views of the current object shell. static std::size_t getViews(); }; diff --git a/sfx2/source/view/lokhelper.cxx b/sfx2/source/view/lokhelper.cxx index ba42188c178b..c994877e9540 100644 --- a/sfx2/source/view/lokhelper.cxx +++ b/sfx2/source/view/lokhelper.cxx @@ -60,7 +60,7 @@ void SfxLokHelper::setView(std::uintptr_t nId) } -std::uintptr_t SfxLokHelper::getView(SfxViewShell *pViewShell) +std::uintptr_t SfxLokHelper::getView(SfxViewShell* pViewShell) { if (!pViewShell) pViewShell = SfxViewShell::Current(); diff --git a/sfx2/source/view/viewsh.cxx b/sfx2/source/view/viewsh.cxx index 635ba12c0afc..f787d00538ef 100644 --- a/sfx2/source/view/viewsh.cxx +++ b/sfx2/source/view/viewsh.cxx @@ -1456,6 +1456,15 @@ void SfxViewShell::registerLibreOfficeKitViewCallback(LibreOfficeKitCallback pCa { pImpl->m_pLibreOfficeKitViewCallback = pCallback; pImpl->m_pLibreOfficeKitViewData = pData; + + // Ask other views to send their cursor position to the new view. + SfxViewShell* pViewShell = SfxViewShell::GetFirst(); + while (pViewShell) + { + pViewShell->ShowCursor(false); + pViewShell->ShowCursor(); + pViewShell = SfxViewShell::GetNext(*pViewShell); + } } void SfxViewShell::libreOfficeKitViewCallback(int nType, const char* pPayload) const diff --git a/sw/qa/extras/tiledrendering/tiledrendering.cxx b/sw/qa/extras/tiledrendering/tiledrendering.cxx index 5eed6d174683..b2446350cdd3 100644 --- a/sw/qa/extras/tiledrendering/tiledrendering.cxx +++ b/sw/qa/extras/tiledrendering/tiledrendering.cxx @@ -26,6 +26,7 @@ #include #include #include +#include static const char* DATA_DIRECTORY = "/sw/qa/extras/tiledrendering/data/"; @@ -50,6 +51,7 @@ public: void testSearchAllNotifications(); void testPageDownInvalidation(); void testPartHash(); + void testViewCursors(); CPPUNIT_TEST_SUITE(SwTiledRenderingTest); CPPUNIT_TEST(testRegisterCallback); @@ -68,6 +70,7 @@ public: CPPUNIT_TEST(testSearchAllNotifications); CPPUNIT_TEST(testPageDownInvalidation); CPPUNIT_TEST(testPartHash); + CPPUNIT_TEST(testViewCursors); CPPUNIT_TEST_SUITE_END(); private: @@ -487,6 +490,8 @@ void SwTiledRenderingTest::testSearchAllNotifications() SwXTextDocument* pXTextDocument = createDoc("search.odt"); SwWrtShell* pWrtShell = pXTextDocument->GetDocShell()->GetWrtShell(); pWrtShell->GetSfxViewShell()->registerLibreOfficeKitViewCallback(&SwTiledRenderingTest::callback, this); + // Reset notification counter before search. + m_nSelectionBeforeSearchResult = 0; uno::Sequence aPropertyValues(comphelper::InitPropertySequence( { {"SearchItem.SearchString", uno::makeAny(OUString("shape"))}, @@ -538,6 +543,61 @@ void SwTiledRenderingTest::testPartHash() comphelper::LibreOfficeKit::setActive(false); } +class ViewCallback +{ +public: + bool m_bOwnCursorInvalidated; + bool m_bViewCursorInvalidated; + + ViewCallback() + : m_bOwnCursorInvalidated(false), + m_bViewCursorInvalidated(false) + { + } + + static void callback(int nType, const char* pPayload, void* pData) + { + static_cast(pData)->callbackImpl(nType, pPayload); + } + + void callbackImpl(int nType, const char* /*pPayload*/) + { + switch (nType) + { + case LOK_CALLBACK_INVALIDATE_VISIBLE_CURSOR: + { + m_bOwnCursorInvalidated = true; + } + break; + case LOK_CALLBACK_INVALIDATE_VIEW_CURSOR: + { + m_bViewCursorInvalidated = true; + } + break; + } + } +}; + +void SwTiledRenderingTest::testViewCursors() +{ + comphelper::LibreOfficeKit::setActive(); + + createDoc("dummy.fodt"); + ViewCallback aView1; + SfxViewShell::Current()->registerLibreOfficeKitViewCallback(&ViewCallback::callback, &aView1); + SfxLokHelper::createView(); + ViewCallback aView2; + SfxViewShell::Current()->registerLibreOfficeKitViewCallback(&ViewCallback::callback, &aView2); + CPPUNIT_ASSERT(aView1.m_bOwnCursorInvalidated); + CPPUNIT_ASSERT(aView1.m_bViewCursorInvalidated); + CPPUNIT_ASSERT(aView2.m_bOwnCursorInvalidated); + // This failed: the cursor position of view1 was only known to view2 once + // it changed. + CPPUNIT_ASSERT(aView2.m_bViewCursorInvalidated); + + comphelper::LibreOfficeKit::setActive(false); +} + CPPUNIT_TEST_SUITE_REGISTRATION(SwTiledRenderingTest); CPPUNIT_PLUGIN_IMPLEMENT();