desktop/source/lib/init.cxx |  128 ++++++++++++++++++--------------------------
 1 file changed, 55 insertions(+), 73 deletions(-)

New commits:
commit afb09d65d223aeecba9a9f343e71f6ce1f1535f0
Author:     Gökay Şatır <gokaysa...@collabora.com>
AuthorDate: Tue Nov 12 12:15:31 2024 +0300
Commit:     Miklos Vajna <vmik...@collabora.com>
CommitDate: Mon Jan 20 12:58:43 2025 +0100

    Make checking alternative views more strict.
    
    Remove unnecessary -1 checks.
    Remove nLastNonEditorView, we don't use a view if it is in edit mode. We 
are more picky now.
    Don't check for alternative views when the render state is empty. It 
shouldn't be empty but when switching to/from other modes, it is empty.
    
    Change-Id: I2df4442d77bdddc4ce219a423f70527716245720
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/180498
    Reviewed-by: Miklos Vajna <vmik...@collabora.com>
    Tested-by: Jenkins

diff --git a/desktop/source/lib/init.cxx b/desktop/source/lib/init.cxx
index 109b5e9698d0..ae1cb9672967 100644
--- a/desktop/source/lib/init.cxx
+++ b/desktop/source/lib/init.cxx
@@ -4522,6 +4522,35 @@ inline static void 
enableViewCallbacks(LibLODocument_Impl* pDocument, const int
         handlerIt->second->enableCallbacks();
 }
 
+inline static int getAlternativeViewForPaint(LibreOfficeKitDocument* pThis, 
ITiledRenderable* pDoc, SfxViewShell* pCurrentViewShell,
+    const std::string_view &sCurrentViewRenderState, const int nPart, const 
int nMode)
+{
+    SfxViewShell* pViewShell = SfxViewShell::GetFirst();
+    while (pViewShell)
+    {
+        bool bIsInEdit = pViewShell->GetDrawView() && 
pViewShell->GetDrawView()->GetTextEditOutliner();
+
+        if (!bIsInEdit && pViewShell != pCurrentViewShell)
+        {
+            if (pViewShell->getPart() == nPart && pViewShell->getEditMode() == 
nMode)
+            {
+                OString sNewRenderState = pDoc->getViewRenderState(pViewShell);
+
+                if (sCurrentViewRenderState == sNewRenderState)
+                {
+                    const int nViewId = pViewShell->GetViewShellId().get();
+                    doc_setView(pThis, nViewId);
+                    return nViewId;
+                }
+            }
+        }
+
+        pViewShell = SfxViewShell::GetNext(*pViewShell);
+    }
+
+    return -1;
+}
+
 static void doc_paintPartTile(LibreOfficeKitDocument* pThis,
                               unsigned char* pBuffer,
                               const int nPart,
@@ -4562,82 +4591,38 @@ static void doc_paintPartTile(LibreOfficeKitDocument* 
pThis,
         int nOrigPart = 0;
         const int aType = doc_getDocumentType(pThis);
         const bool isText = (aType == LOK_DOCTYPE_TEXT);
-        const bool isCalc = (aType == LOK_DOCTYPE_SPREADSHEET);
         int nOrigEditMode = 0;
         bool bPaintTextEdit = true;
         int nViewId = nOrigViewId;
-        int nLastNonEditorView = -1;
-        int nViewMatchingMode = -1;
         SfxViewShell* pCurrentViewShell = SfxViewShell::Current();
         const OString sCurrentViewRenderState = 
pDoc->getViewRenderState(pCurrentViewShell);
 
         if (!isText)
         {
-            // Check if just switching to another view is enough, that has
-            // less side-effects.
-            if (nPart != doc_getPart(pThis) || nMode != pDoc->getEditMode())
+            // Check if just switching to another view is enough, that has 
less side-effects.
+            // Render state is sometimes empty, don't risk it.
+            if ((nPart != doc_getPart(pThis) || nMode != pDoc->getEditMode()) 
&& !sCurrentViewRenderState.isEmpty())
             {
-                SfxViewShell* pViewShell = SfxViewShell::GetFirst();
-                while (pViewShell)
-                {
-                    bool bIsInEdit = pViewShell->GetDrawView() &&
-                        pViewShell->GetDrawView()->GetTextEditOutliner();
+                nViewId = getAlternativeViewForPaint(pThis, pDoc, 
pCurrentViewShell, sCurrentViewRenderState, nPart, nMode);
 
-                    OString sNewRenderState = 
pDoc->getViewRenderState(pViewShell);
-
-                    if (sCurrentViewRenderState == sNewRenderState && 
!bIsInEdit)
-                        nLastNonEditorView = 
pViewShell->GetViewShellId().get();
-
-                    if (pViewShell->getPart() == nPart &&
-                        pViewShell->getEditMode() == nMode &&
-                        sCurrentViewRenderState == sNewRenderState &&
-                        !bIsInEdit)
-                    {
-                        nViewId = pViewShell->GetViewShellId().get();
-                        nViewMatchingMode = nViewId;
-                        nLastNonEditorView = nViewId;
-                        doc_setView(pThis, nViewId);
-                        break;
-                    }
-                    else if (pViewShell->getEditMode() == nMode && 
sCurrentViewRenderState == sNewRenderState && !bIsInEdit)
-                    {
-                        nViewMatchingMode = pViewShell->GetViewShellId().get();
-                    }
-
-                    pViewShell = SfxViewShell::GetNext(*pViewShell);
-                }
-            }
-
-            // if not found view with correct part
-            // - at least avoid rendering active textbox, This is for Impress.
-            // - prefer view with the same mode
-            if (nViewMatchingMode >= 0 && nViewMatchingMode != nViewId)
-            {
-                nViewId = nViewMatchingMode;
-                doc_setView(pThis, nViewId);
-            }
-            else if (!isCalc && nLastNonEditorView >= 0 && nLastNonEditorView 
!= nViewId &&
-                pCurrentViewShell && pCurrentViewShell->GetDrawView() &&
-                pCurrentViewShell->GetDrawView()->GetTextEditOutliner())
-            {
-                nViewId = nLastNonEditorView;
-                doc_setView(pThis, nViewId);
+                if (nViewId == -1)
+                    nViewId = nOrigViewId; // Couldn't find an alternative 
view.
+                // else -> We found an alternative view and already switched 
to that.
             }
 
             // Disable callbacks while we are painting - after setting the view
-            if (nViewId != nOrigViewId && nViewId >= 0)
+            if (nViewId != nOrigViewId)
                 disableViewCallbacks(pDocument, nViewId);
-
-            nOrigPart = doc_getPart(pThis);
-            if (nPart != nOrigPart)
-            {
-                doc_setPartImpl(pThis, nPart, false);
-            }
-
-            nOrigEditMode = pDoc->getEditMode();
-            if (nOrigEditMode != nMode)
+            else
             {
-                SfxLokHelper::setEditMode(nMode, pDoc);
+                // If we are here, we couldn't find an alternative view. We 
need to check the part and mode.
+                nOrigPart = doc_getPart(pThis);
+                if (nPart != nOrigPart)
+                    doc_setPartImpl(pThis, nPart, false);
+
+                nOrigEditMode = pDoc->getEditMode();
+                if (nOrigEditMode != nMode)
+                    SfxLokHelper::setEditMode(nMode, pDoc);
             }
 
             bPaintTextEdit = (nPart == nOrigPart && nMode == nOrigEditMode);
@@ -4650,18 +4635,18 @@ static void doc_paintPartTile(LibreOfficeKitDocument* 
pThis,
         {
             pDoc->setPaintTextEdit(true);
 
-            if (nMode != nOrigEditMode)
+            if (nViewId == nOrigViewId)
             {
-                SfxLokHelper::setEditMode(nOrigEditMode, pDoc);
-            }
+                // We didn't find an alternative view, set the part and mode 
back to their initial values if needed.
+                if (nMode != nOrigEditMode)
+                    SfxLokHelper::setEditMode(nOrigEditMode, pDoc);
 
-            if (nPart != nOrigPart)
-            {
-                doc_setPartImpl(pThis, nOrigPart, false);
+                if (nPart != nOrigPart)
+                    doc_setPartImpl(pThis, nOrigPart, false);
             }
-
-            if (nViewId != nOrigViewId)
+            else
             {
+                // We found an alternative view and used it. Enable its 
callbacks again and turn back to our original view.
                 enableViewCallbacks(pDocument, nViewId);
                 doc_setView(pThis, nOrigViewId);
             }
@@ -4672,10 +4657,7 @@ static void doc_paintPartTile(LibreOfficeKitDocument* 
pThis,
         // Nothing to do but restore the PartTilePainting flag.
     }
 
-    if (nOrigViewId >= 0)
-    {
-        enableViewCallbacks(pDocument, nOrigViewId);
-    }
+    enableViewCallbacks(pDocument, nOrigViewId);
 }
 
 static int doc_getTileMode(SAL_UNUSED_PARAMETER LibreOfficeKitDocument* 
/*pThis*/)

Reply via email to