[Libreoffice-commits] core.git: Branch 'distro/collabora/cp-5.1' - desktop/qa desktop/source include/LibreOfficeKit libreofficekit/source

Marco Cecchetti marco.cecchetti at collabora.com
Fri Sep 9 20:50:59 UTC 2016


 desktop/qa/desktop_lib/test_desktop_lib.cxx |   22 +++++++++++-----------
 desktop/source/lib/init.cxx                 |   24 +++++++++++++++++++++---
 include/LibreOfficeKit/LibreOfficeKit.h     |    7 ++++++-
 include/LibreOfficeKit/LibreOfficeKit.hxx   |   16 ++++++++++++++--
 libreofficekit/source/gtk/lokdocview.cxx    |    4 ++--
 5 files changed, 54 insertions(+), 19 deletions(-)

New commits:
commit 404feac7e9212c57124a1e6219b6d6125c2bbd14
Author: Marco Cecchetti <marco.cecchetti at collabora.com>
Date:   Fri Sep 9 22:21:07 2016 +0200

    LOK: we use callbacks latch for not missing messages sent very early
    
    - lok::Document::setCallbackLatch: used by a child session for
    set/unset the latch
    
    - lok::Document::registerCallback has a new boolean parameter used for
    setting the latch state just before the callback is actually
    registered for a (new) view
    
    - now cell cursors of other views are correctly notified to the new
    view
    
    Change-Id: I80ae5556f61b1a41e703688491cca1faa8621a43
    Reviewed-on: https://gerrit.libreoffice.org/28789
    Reviewed-by: Marco Cecchetti <mrcekets at gmail.com>
    Tested-by: Marco Cecchetti <mrcekets at gmail.com>

diff --git a/desktop/qa/desktop_lib/test_desktop_lib.cxx b/desktop/qa/desktop_lib/test_desktop_lib.cxx
index 5485da3..9080f4a 100644
--- a/desktop/qa/desktop_lib/test_desktop_lib.cxx
+++ b/desktop/qa/desktop_lib/test_desktop_lib.cxx
@@ -365,7 +365,7 @@ void DesktopLOKTest::testSearchCalc()
     comphelper::LibreOfficeKit::setActive();
     LibLODocument_Impl* pDocument = loadDoc("search.ods");
     pDocument->pClass->initializeForRendering(pDocument, nullptr);
-    pDocument->pClass->registerCallback(pDocument, &DesktopLOKTest::callback, this);
+    pDocument->pClass->registerCallback(pDocument, &DesktopLOKTest::callback, this, /*callback latch*/ false);
 
     uno::Sequence<beans::PropertyValue> aPropertyValues(comphelper::InitPropertySequence(
     {
@@ -400,7 +400,7 @@ void DesktopLOKTest::testSearchAllNotificationsCalc()
     comphelper::LibreOfficeKit::setActive();
     LibLODocument_Impl* pDocument = loadDoc("search.ods");
     pDocument->pClass->initializeForRendering(pDocument, nullptr);
-    pDocument->pClass->registerCallback(pDocument, &DesktopLOKTest::callback, this);
+    pDocument->pClass->registerCallback(pDocument, &DesktopLOKTest::callback, this, /*callback latch*/ false);
 
     uno::Sequence<beans::PropertyValue> aPropertyValues(comphelper::InitPropertySequence(
     {
@@ -684,7 +684,7 @@ void DesktopLOKTest::testCommandResult()
     CPPUNIT_ASSERT(m_aCommandResult.isEmpty());
 
     // but we get some real values when the callback is set up
-    pDocument->pClass->registerCallback(pDocument, &DesktopLOKTest::callback, this);
+    pDocument->pClass->registerCallback(pDocument, &DesktopLOKTest::callback, this, /*callback latch*/ false);
 
     m_aCommandResultCondition.reset();
     pDocument->pClass->postUnoCommand(pDocument, ".uno:Bold", nullptr, true);
@@ -703,7 +703,7 @@ void DesktopLOKTest::testWriterComments()
 {
     comphelper::LibreOfficeKit::setActive();
     LibLODocument_Impl* pDocument = loadDoc("blank_text.odt");
-    pDocument->pClass->registerCallback(pDocument, &DesktopLOKTest::callback, this);
+    pDocument->pClass->registerCallback(pDocument, &DesktopLOKTest::callback, this, /*callback latch*/ false);
     uno::Reference<awt::XReschedule> xToolkit(com::sun::star::awt::Toolkit::create(comphelper::getProcessComponentContext()), uno::UNO_QUERY);
 
     // Insert a comment at the beginning of the document and wait till the main
@@ -747,7 +747,7 @@ void DesktopLOKTest::testModifiedStatus()
     comphelper::LibreOfficeKit::setActive();
     LibLODocument_Impl* pDocument = loadDoc("blank_text.odt");
     pDocument->pClass->initializeForRendering(pDocument, nullptr);
-    pDocument->pClass->registerCallback(pDocument, &DesktopLOKTest::callback, this);
+    pDocument->pClass->registerCallback(pDocument, &DesktopLOKTest::callback, this, /*callback latch*/ false);
 
     // Type "t" and check that the document was set as modified
     m_bModified = false;
@@ -811,10 +811,10 @@ void DesktopLOKTest::testTrackChanges()
     comphelper::LibreOfficeKit::setActive();
     LibLODocument_Impl* pDocument = loadDoc("blank_text.odt");
     pDocument->pClass->initializeForRendering(pDocument, nullptr);
-    pDocument->pClass->registerCallback(pDocument, &DesktopLOKTest::callback, this);
+    pDocument->pClass->registerCallback(pDocument, &DesktopLOKTest::callback, this, /*callback latch*/ false);
     pDocument->pClass->createView(pDocument);
     pDocument->pClass->initializeForRendering(pDocument, nullptr);
-    pDocument->pClass->registerCallback(pDocument, &DesktopLOKTest::callback, this);
+    pDocument->pClass->registerCallback(pDocument, &DesktopLOKTest::callback, this, /*callback latch*/ false);
     Scheduler::ProcessEventsToIdle();
 
     // Enable trak changes and assert that both views get notified.
@@ -864,7 +864,7 @@ void DesktopLOKTest::testSheetSelections()
     comphelper::LibreOfficeKit::setActive();
     LibLODocument_Impl* pDocument = loadDoc("sheets.ods", LOK_DOCTYPE_SPREADSHEET);
     pDocument->pClass->initializeForRendering(pDocument, nullptr);
-    pDocument->pClass->registerCallback(pDocument, &DesktopLOKTest::callback, this);
+    pDocument->pClass->registerCallback(pDocument, &DesktopLOKTest::callback, this, /*callback latch*/ false);
 
     /*
      * Check if selection data is correct
@@ -1025,7 +1025,7 @@ void DesktopLOKTest::testContextMenuCalc()
     comphelper::LibreOfficeKit::setActive();
     LibLODocument_Impl* pDocument = loadDoc("sheets.ods", LOK_DOCTYPE_SPREADSHEET);
     pDocument->pClass->initializeForRendering(pDocument, nullptr);
-    pDocument->pClass->registerCallback(pDocument, &DesktopLOKTest::callback, this);
+    pDocument->pClass->registerCallback(pDocument, &DesktopLOKTest::callback, this, /*callback latch*/ false);
 
     // Values in twips
     int row5 = 1150;
@@ -1053,7 +1053,7 @@ void DesktopLOKTest::testContextMenuWriter()
     comphelper::LibreOfficeKit::setActive();
     LibLODocument_Impl* pDocument = loadDoc("blank_text.odt", LOK_DOCTYPE_TEXT);
     pDocument->pClass->initializeForRendering(pDocument, nullptr);
-    pDocument->pClass->registerCallback(pDocument, &DesktopLOKTest::callback, this);
+    pDocument->pClass->registerCallback(pDocument, &DesktopLOKTest::callback, this, /*callback latch*/ false);
 
     Point aRandomPoint(1150, 1100);
     pDocument->pClass->postMouseEvent(pDocument,
@@ -1078,7 +1078,7 @@ void DesktopLOKTest::testContextMenuImpress()
     comphelper::LibreOfficeKit::setActive();
     LibLODocument_Impl* pDocument = loadDoc("blank_presentation.odp", LOK_DOCTYPE_PRESENTATION);
     pDocument->pClass->initializeForRendering(pDocument, nullptr);
-    pDocument->pClass->registerCallback(pDocument, &DesktopLOKTest::callback, this);
+    pDocument->pClass->registerCallback(pDocument, &DesktopLOKTest::callback, this, /*callback latch*/ false);
 
     Point aRandomPoint(1150, 1100);
     pDocument->pClass->postMouseEvent(pDocument,
diff --git a/desktop/source/lib/init.cxx b/desktop/source/lib/init.cxx
index cb86a63..93d7c5d 100644
--- a/desktop/source/lib/init.cxx
+++ b/desktop/source/lib/init.cxx
@@ -392,10 +392,12 @@ static void doc_getDocumentSize(LibreOfficeKitDocument* pThis,
                                 long* pHeight);
 static void doc_initializeForRendering(LibreOfficeKitDocument* pThis,
                                        const char* pArguments);
-
+static void doc_setCallbackLatch(LibreOfficeKitDocument* pThis,
+                                 bool bCallbackLatch);
 static void doc_registerCallback(LibreOfficeKitDocument* pThis,
                                 LibreOfficeKitCallback pCallback,
-                                void* pData);
+                                void* pData,
+                                bool bCallbackLatch = false);
 static void doc_postKeyEvent(LibreOfficeKitDocument* pThis,
                              int nType,
                              int nCharCode,
@@ -468,6 +470,7 @@ LibLODocument_Impl::LibLODocument_Impl(const uno::Reference <css::lang::XCompone
         m_pDocumentClass->getTileMode = doc_getTileMode;
         m_pDocumentClass->getDocumentSize = doc_getDocumentSize;
         m_pDocumentClass->initializeForRendering = doc_initializeForRendering;
+        m_pDocumentClass->setCallbackLatch = doc_setCallbackLatch;
         m_pDocumentClass->registerCallback = doc_registerCallback;
         m_pDocumentClass->postKeyEvent = doc_postKeyEvent;
         m_pDocumentClass->postMouseEvent = doc_postMouseEvent;
@@ -1558,9 +1561,22 @@ static void doc_initializeForRendering(LibreOfficeKitDocument* pThis,
     }
 }
 
+static void doc_setCallbackLatch(LibreOfficeKitDocument* pThis, bool bCallbackLatch)
+{
+    SolarMutexGuard aGuard;
+    LibLODocument_Impl* pDocument = static_cast<LibLODocument_Impl*>(pThis);
+
+    int nView = SfxLokHelper::getView();
+    if (nView < 0)
+        return;
+
+    if (pDocument->mpCallbackFlushHandlers[nView])
+        pDocument->mpCallbackFlushHandlers[nView]->setEventLatch(bCallbackLatch);
+}
+
 static void doc_registerCallback(LibreOfficeKitDocument* pThis,
                                  LibreOfficeKitCallback pCallback,
-                                 void* pData)
+                                 void* pData, bool bCallbackLatch)
 {
     SolarMutexGuard aGuard;
     LibLODocument_Impl* pDocument = static_cast<LibLODocument_Impl*>(pThis);
@@ -1596,6 +1612,8 @@ static void doc_registerCallback(LibreOfficeKitDocument* pThis,
 
     if (pCallback != nullptr)
     {
+        pDocument->mpCallbackFlushHandlers[nView]->setEventLatch(bCallbackLatch);
+
         size_t nId = nView;
         for (const auto& pair : pDocument->mpCallbackFlushHandlers)
         {
diff --git a/include/LibreOfficeKit/LibreOfficeKit.h b/include/LibreOfficeKit/LibreOfficeKit.h
index 81d65c1..e03163f 100644
--- a/include/LibreOfficeKit/LibreOfficeKit.h
+++ b/include/LibreOfficeKit/LibreOfficeKit.h
@@ -147,10 +147,15 @@ struct _LibreOfficeKitDocumentClass
     void (*initializeForRendering) (LibreOfficeKitDocument* pThis,
                                     const char* pArguments);
 
+    /// @see lok::Document::setCallbackLatch().
+    void (*setCallbackLatch) (LibreOfficeKitDocument* pThis,
+                              bool bCallbackLatch);
+
     /// @see lok::Document::registerCallback().
     void (*registerCallback) (LibreOfficeKitDocument* pThis,
                               LibreOfficeKitCallback pCallback,
-                              void* pData);
+                              void* pData,
+                              bool bCallbackLatch);
 
     /// @see lok::Document::postKeyEvent
     void (*postKeyEvent) (LibreOfficeKitDocument* pThis,
diff --git a/include/LibreOfficeKit/LibreOfficeKit.hxx b/include/LibreOfficeKit/LibreOfficeKit.hxx
index aae5f38..346671d 100644
--- a/include/LibreOfficeKit/LibreOfficeKit.hxx
+++ b/include/LibreOfficeKit/LibreOfficeKit.hxx
@@ -196,15 +196,27 @@ public:
     }
 
     /**
+     * Enable/disable callbacks latch. LOK will set the latch when it wants to
+     * queue new callbacks but not flush them.
+     *
+     * @param bCallbackLatch: true enables the latch, false disables it.
+     */
+    inline void setCallbackLatch(bool bCallbackLatch)
+    {
+        mpDoc->pClass->setCallbackLatch(mpDoc, bCallbackLatch);
+    }
+
+    /**
      * Registers a callback. LOK will invoke this function when it wants to
      * inform the client about events.
      *
      * @param pCallback the callback to invoke
      * @param pData the user data, will be passed to the callback on invocation
+     * @param bCallbackLatch the event latch status to be set before the callback is registered
      */
-    inline void registerCallback(LibreOfficeKitCallback pCallback, void* pData)
+    inline void registerCallback(LibreOfficeKitCallback pCallback, void* pData, bool bCallbackLatch = false)
     {
-        mpDoc->pClass->registerCallback(mpDoc, pCallback, pData);
+        mpDoc->pClass->registerCallback(mpDoc, pCallback, pData, bCallbackLatch);
     }
 
     /**
diff --git a/libreofficekit/source/gtk/lokdocview.cxx b/libreofficekit/source/gtk/lokdocview.cxx
index 1f7d330..5e43e5e 100644
--- a/libreofficekit/source/gtk/lokdocview.cxx
+++ b/libreofficekit/source/gtk/lokdocview.cxx
@@ -913,7 +913,7 @@ static gboolean postDocumentLoad(gpointer pData)
     std::unique_lock<std::mutex> aGuard(g_aLOKMutex);
     priv->m_pDocument->pClass->initializeForRendering(priv->m_pDocument, priv->m_aRenderingArguments.c_str());
     priv->m_nViewId = priv->m_pDocument->pClass->getView(priv->m_pDocument);
-    priv->m_pDocument->pClass->registerCallback(priv->m_pDocument, callbackWorker, pLOKDocView);
+    priv->m_pDocument->pClass->registerCallback(priv->m_pDocument, callbackWorker, pLOKDocView, /*callback latch*/ false);
     priv->m_pDocument->pClass->getDocumentSize(priv->m_pDocument, &priv->m_nDocumentWidthTwips, &priv->m_nDocumentHeightTwips);
     priv->m_nParts = priv->m_pDocument->pClass->getParts(priv->m_pDocument);
     aGuard.unlock();
@@ -2510,7 +2510,7 @@ static void lok_doc_view_finalize (GObject* object)
     ss << "lok::Document::setView(" << priv->m_nViewId << ")";
     g_info("%s", ss.str().c_str());
     priv->m_pDocument->pClass->setView(priv->m_pDocument, priv->m_nViewId);
-    priv->m_pDocument->pClass->registerCallback(priv->m_pDocument, nullptr, nullptr);
+    priv->m_pDocument->pClass->registerCallback(priv->m_pDocument, nullptr, nullptr, /*callback latch*/ false);
     aGuard.unlock();
 
     if (priv->m_pDocument && priv->m_pDocument->pClass->getViews(priv->m_pDocument) > 1)


More information about the Libreoffice-commits mailing list