summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--comphelper/source/misc/lok.cxx12
-rw-r--r--include/comphelper/lok.hxx5
-rw-r--r--include/sfx2/viewsh.hxx4
-rw-r--r--sfx2/source/view/viewsh.cxx13
-rw-r--r--sw/qa/extras/tiledrendering/tiledrendering.cxx37
-rw-r--r--sw/source/core/view/viewsh.cxx4
-rw-r--r--sw/source/uibase/docvw/PostItMgr.cxx6
-rw-r--r--sw/source/uibase/docvw/SidebarWin.cxx6
8 files changed, 62 insertions, 25 deletions
diff --git a/comphelper/source/misc/lok.cxx b/comphelper/source/misc/lok.cxx
index e1a099d04ea6..cf776f00c35f 100644
--- a/comphelper/source/misc/lok.cxx
+++ b/comphelper/source/misc/lok.cxx
@@ -19,6 +19,8 @@ static bool g_bActive(false);
static bool g_bPartInInvalidation(false);
+static bool g_bTiledPainting(false);
+
void setActive(bool bActive)
{
g_bActive = bActive;
@@ -39,6 +41,16 @@ bool isPartInInvalidation()
return g_bPartInInvalidation;
}
+void setTiledPainting(bool bTiledPainting)
+{
+ g_bTiledPainting = bTiledPainting;
+}
+
+bool isTiledPainting()
+{
+ return g_bTiledPainting;
+}
+
static bool g_bLocalRendering(false);
void setLocalRendering(bool bLocalRendering)
diff --git a/include/comphelper/lok.hxx b/include/comphelper/lok.hxx
index 529694ce0acc..ca9f87f495dd 100644
--- a/include/comphelper/lok.hxx
+++ b/include/comphelper/lok.hxx
@@ -48,6 +48,11 @@ COMPHELPER_DLLPUBLIC bool isPartInInvalidation();
/// Set whether clients want a part number in an invalidation payload.
COMPHELPER_DLLPUBLIC void setPartInInvalidation(bool bPartInInvalidation);
+/// Check if we are doing tiled painting.
+COMPHELPER_DLLPUBLIC bool isTiledPainting();
+/// Set if we are doing tiled painting.
+COMPHELPER_DLLPUBLIC void setTiledPainting(bool bTiledPainting);
+
// Status indicator handling. Even if in theory there could be several status indicators active at
// the same time, in practice there is only one at a time, so we don't handle any identification of
// status indicator in this API.
diff --git a/include/sfx2/viewsh.hxx b/include/sfx2/viewsh.hxx
index 6583801e0bbb..253c77c1f36c 100644
--- a/include/sfx2/viewsh.hxx
+++ b/include/sfx2/viewsh.hxx
@@ -329,10 +329,6 @@ public:
void libreOfficeKitViewCallback(int nType, const char* pPayload) const override;
/// Set if we are doing tiled searching.
void setTiledSearching(bool bTiledSearching);
- /// Set if we are doing tiled painting.
- void setTiledPainting(bool bTiledPainting);
- /// Get if we are doing tiled painting.
- bool getTiledPainting() const;
/// See lok::Document::getPart().
virtual int getPart() const;
virtual void dumpAsXml(struct _xmlTextWriter* pWriter) const;
diff --git a/sfx2/source/view/viewsh.cxx b/sfx2/source/view/viewsh.cxx
index dacd2363ff13..d03878c8b39c 100644
--- a/sfx2/source/view/viewsh.cxx
+++ b/sfx2/source/view/viewsh.cxx
@@ -255,7 +255,6 @@ SfxViewShell_Impl::SfxViewShell_Impl(SfxViewShellFlags const nFlags)
, m_pLibreOfficeKitViewCallback(nullptr)
, m_pLibreOfficeKitViewData(nullptr)
, m_bTiledSearching(false)
-, m_bTiledPainting(false)
, m_nViewShellId(SfxViewShell_Impl::m_nLastViewShellId++)
{}
@@ -1473,7 +1472,7 @@ void SfxViewShell::registerLibreOfficeKitViewCallback(LibreOfficeKitCallback pCa
void SfxViewShell::libreOfficeKitViewCallback(int nType, const char* pPayload) const
{
- if (pImpl->m_bTiledPainting)
+ if (comphelper::LibreOfficeKit::isTiledPainting())
return;
if (pImpl->m_bTiledSearching)
@@ -1503,16 +1502,6 @@ void SfxViewShell::setTiledSearching(bool bTiledSearching)
pImpl->m_bTiledSearching = bTiledSearching;
}
-void SfxViewShell::setTiledPainting(bool bTiledPainting)
-{
- pImpl->m_bTiledPainting = bTiledPainting;
-}
-
-bool SfxViewShell::getTiledPainting() const
-{
- return pImpl->m_bTiledPainting;
-}
-
int SfxViewShell::getPart() const
{
return 0;
diff --git a/sw/qa/extras/tiledrendering/tiledrendering.cxx b/sw/qa/extras/tiledrendering/tiledrendering.cxx
index 82f5b11d139e..7b441d67648a 100644
--- a/sw/qa/extras/tiledrendering/tiledrendering.cxx
+++ b/sw/qa/extras/tiledrendering/tiledrendering.cxx
@@ -77,6 +77,7 @@ public:
void testRedlineColors();
void testCommentEndTextEdit();
void testCursorPosition();
+ void testPaintCallbacks();
CPPUNIT_TEST_SUITE(SwTiledRenderingTest);
CPPUNIT_TEST(testRegisterCallback);
@@ -118,6 +119,7 @@ public:
CPPUNIT_TEST(testRedlineColors);
CPPUNIT_TEST(testCommentEndTextEdit);
CPPUNIT_TEST(testCursorPosition);
+ CPPUNIT_TEST(testPaintCallbacks);
CPPUNIT_TEST_SUITE_END();
private:
@@ -640,6 +642,8 @@ public:
bool m_bGraphicViewSelection;
bool m_bGraphicSelection;
bool m_bViewLock;
+ /// Set if any callback was invoked.
+ bool m_bCalled;
ViewCallback()
: m_bOwnCursorInvalidated(false),
@@ -651,7 +655,8 @@ public:
m_bViewCursorVisible(false),
m_bGraphicViewSelection(false),
m_bGraphicSelection(false),
- m_bViewLock(false)
+ m_bViewLock(false),
+ m_bCalled(false)
{
}
@@ -663,6 +668,7 @@ public:
void callbackImpl(int nType, const char* pPayload)
{
OString aPayload(pPayload);
+ m_bCalled = true;
switch (nType)
{
case LOK_CALLBACK_INVALIDATE_TILES:
@@ -1529,6 +1535,35 @@ void SwTiledRenderingTest::testCursorPosition()
comphelper::LibreOfficeKit::setActive(false);
}
+void SwTiledRenderingTest::testPaintCallbacks()
+{
+ // Test that paintTile() never results in callbacks, which can cause a
+ // paint <-> invalidate loop.
+
+ // Load a document and register a callback for the first view.
+ comphelper::LibreOfficeKit::setActive();
+ SwXTextDocument* pXTextDocument = createDoc();
+ ViewCallback aView1;
+ SfxViewShell::Current()->registerLibreOfficeKitViewCallback(&ViewCallback::callback, &aView1);
+
+ // Create a second view and paint a tile on that second view.
+ SfxLokHelper::createView();
+ int nCanvasWidth = 256;
+ int nCanvasHeight = 256;
+ std::vector<unsigned char> aBuffer(nCanvasWidth * nCanvasHeight * 4);
+ ScopedVclPtrInstance<VirtualDevice> pDevice(nullptr, Size(1, 1), DeviceFormat::DEFAULT);
+ pDevice->SetOutputSizePixelScaleOffsetAndBuffer(Size(nCanvasWidth, nCanvasHeight), Fraction(1.0), Point(), aBuffer.data());
+ // Make sure that painting a tile in the second view doesn't invoke
+ // callbacks on the first view.
+ aView1.m_bCalled = false;
+ pXTextDocument->paintTile(*pDevice.get(), nCanvasWidth, nCanvasHeight, /*nTilePosX=*/0, /*nTilePosY=*/0, /*nTileWidth=*/3840, /*nTileHeight=*/3840);
+ CPPUNIT_ASSERT(!aView1.m_bCalled);
+
+ mxComponent->dispose();
+ mxComponent.clear();
+ comphelper::LibreOfficeKit::setActive(false);
+}
+
CPPUNIT_TEST_SUITE_REGISTRATION(SwTiledRenderingTest);
CPPUNIT_PLUGIN_IMPLEMENT();
diff --git a/sw/source/core/view/viewsh.cxx b/sw/source/core/view/viewsh.cxx
index 64b6f7b6b979..3f62822018b0 100644
--- a/sw/source/core/view/viewsh.cxx
+++ b/sw/source/core/view/viewsh.cxx
@@ -1842,7 +1842,7 @@ void SwViewShell::PaintTile(VirtualDevice &rDevice, int contextWidth, int contex
// TODO clean up SwViewShell's approach to output devices (the many of
// them - mpBufferedOut, mpOut, mpWin, ...)
OutputDevice *pSaveOut = mpOut;
- GetSfxViewShell()->setTiledPainting(true);
+ comphelper::LibreOfficeKit::setTiledPainting(true);
mpOut = &rDevice;
// resizes the virtual device so to contain the entries context
@@ -1895,7 +1895,7 @@ void SwViewShell::PaintTile(VirtualDevice &rDevice, int contextWidth, int contex
// SwViewShell's output device tear down
mpOut = pSaveOut;
- GetSfxViewShell()->setTiledPainting(false);
+ comphelper::LibreOfficeKit::setTiledPainting(false);
}
void SwViewShell::SetBrowseBorder( const Size& rNew )
diff --git a/sw/source/uibase/docvw/PostItMgr.cxx b/sw/source/uibase/docvw/PostItMgr.cxx
index 2b8f5eeae3b7..962755d3ea51 100644
--- a/sw/source/uibase/docvw/PostItMgr.cxx
+++ b/sw/source/uibase/docvw/PostItMgr.cxx
@@ -735,13 +735,13 @@ void SwPostItMgr::LayoutPostIts()
// view that has the comment focus emits callbacks,
// so the editing view jumps to the comment, but
// not the others.
- bool bTiledPainting = mpView->getTiledPainting();
+ bool bTiledPainting = comphelper::LibreOfficeKit::isTiledPainting();
if (!bTiledPainting)
// No focus -> disable callbacks.
- mpView->setTiledPainting(!(*i)->HasChildPathFocus());
+ comphelper::LibreOfficeKit::setTiledPainting(!(*i)->HasChildPathFocus());
(*i)->ShowNote();
if (!bTiledPainting)
- mpView->setTiledPainting(bTiledPainting);
+ comphelper::LibreOfficeKit::setTiledPainting(bTiledPainting);
}
else
{
diff --git a/sw/source/uibase/docvw/SidebarWin.cxx b/sw/source/uibase/docvw/SidebarWin.cxx
index 0b144e9e1ab8..c1560832a43d 100644
--- a/sw/source/uibase/docvw/SidebarWin.cxx
+++ b/sw/source/uibase/docvw/SidebarWin.cxx
@@ -1263,11 +1263,11 @@ void SwSidebarWin::DeactivatePostIt()
// Make sure this view doesn't emit LOK callbacks during the update, as the
// sidebar window's SidebarTextControl doesn't have a valid twip offset
// (map mode origin) during that operation.
- bool bTiledPainting = mrView.getTiledPainting();
- mrView.setTiledPainting(true);
+ bool bTiledPainting = comphelper::LibreOfficeKit::isTiledPainting();
+ comphelper::LibreOfficeKit::setTiledPainting(true);
// write the visible text back into the SwField
UpdateData();
- mrView.setTiledPainting(bTiledPainting);
+ comphelper::LibreOfficeKit::setTiledPainting(bTiledPainting);
if ( !Application::GetSettings().GetStyleSettings().GetHighContrastMode() )
GetOutlinerView()->SetBackgroundColor(COL_TRANSPARENT);