framework/source/services/autorecovery.cxx |   31 ++++-------------------------
 1 file changed, 5 insertions(+), 26 deletions(-)

New commits:
commit 90b23d0b4528a12ababa3c2897ab3f1a3719b2f1
Author:     Justin Luth <jl...@mail.com>
AuthorDate: Tue Aug 8 09:41:48 2023 -0400
Commit:     Mike Kaganski <mike.kagan...@collabora.com>
CommitDate: Wed Aug 9 12:13:44 2023 +0200

    tdf#144512 autorecovery: always wait for user idle with timed save
    
    Only the "active" document was waiting for a user idle.
    But that doesn't make sense because the background apps
    still lock the foreground app during file save.
    
    So all timed backups should wait for a user idle period
    before starting their recovery / autosave.
    
    Once an idle loop is triggered, no autosave will ever run again
    until an idle timeout occurs! So a busy user who switches from
    one doc to another without ever pausing still wouldn't ever
    get a backup - even from the background docs!
    
    Without this patch, only the first modified documents
    (if backgrounded within 10 minutes) would ever
    get a recovery save. So in pretty much every case
    this patch makes sense AFAICS.
    
    Change-Id: I6e9e04aa2e50895e53826b427cb52c129da43701
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/155459
    Reviewed-by: Justin Luth <jl...@mail.com>
    Tested-by: Jenkins

diff --git a/framework/source/services/autorecovery.cxx 
b/framework/source/services/autorecovery.cxx
index b4e898952aad..48c8978c9ab1 100644
--- a/framework/source/services/autorecovery.cxx
+++ b/framework/source/services/autorecovery.cxx
@@ -2840,17 +2840,8 @@ AutoRecovery::ETimerType AutoRecovery::implts_saveDocs(  
     bool        bAllow
     if (pParams)
         xExternalProgress = pParams->m_xProgress;
 
-    css::uno::Reference< css::frame::XDesktop2 > xDesktop = 
css::frame::Desktop::create(m_xContext);
     OUString                              
sBackupPath(SvtPathOptions().GetBackupPath());
 
-    css::uno::Reference< css::frame::XController > xActiveController;
-    css::uno::Reference< css::frame::XModel >      xActiveModel;
-    css::uno::Reference< css::frame::XFrame >      xActiveFrame     = 
xDesktop->getActiveFrame();
-    if (xActiveFrame.is())
-        xActiveController = xActiveFrame->getController();
-    if (xActiveController.is())
-        xActiveModel = xActiveController->getModel();
-
     // Set the default timer action for our call.
     // Default = NORMAL_AUTOSAVE
     // We return a suggestion for an active timer only.
@@ -2967,37 +2958,27 @@ AutoRecovery::ETimerType AutoRecovery::implts_saveDocs( 
      bool        bAllow
             }
         }
 
-        // a) Document was not postponed - and is     active now. => postpone 
it (restart timer, restart loop)
-        // b) Document was not postponed - and is not active now. => save it
-        // c) Document was     postponed - and is not active now. => save it
-        // d) Document was     postponed - and is     active now. => save it 
(because user idle was checked already)
-        bool bActive       = (xActiveModel == aInfo.Document);
-        bool bWasPostponed = ((aInfo.DocumentState & DocState::Postponed) == 
DocState::Postponed);
-
-        if (
-            ! bWasPostponed &&
-              bActive
-           )
+        // a) Document was not postponed => wait for user idle if not urgent
+        // b) Document was postponed => save it (because user idle/call_back 
was checked already)
+        if (!(aInfo.DocumentState & DocState::Postponed))
         {
             aInfo.DocumentState |= DocState::Postponed;
             *pIt = aInfo;
             // postponed documents will be saved if this method is called 
again!
             // That can be done by an outside started timer           => 
E_POLL_FOR_USER_IDLE (if normal AutoSave is active)
             // or it must be done directly without starting any timer => 
E_CALL_ME_BACK       (if Emergency- or SessionSave is active and must be 
finished ASAP!)
-            eTimer = AutoRecovery::E_POLL_FOR_USER_IDLE;
             if (!bAllowUserIdleLoop)
                 eTimer = AutoRecovery::E_CALL_ME_BACK;
+            else
+                eTimer = AutoRecovery::E_POLL_FOR_USER_IDLE;
             continue;
         }
 
-        // b, c, d)
-        // } /* SAFE */
         g.clear();
         // changing of aInfo and flushing it is done inside implts_saveOneDoc!
         implts_saveOneDoc(sBackupPath, aInfo, xExternalProgress);
         implts_informListener(eJob, 
AutoRecovery::implst_createFeatureStateEvent(eJob, OPERATION_UPDATE, &aInfo));
         g.reset();
-        // /* SAFE */ {
 
         *pIt = aInfo;
     }
@@ -3009,13 +2990,11 @@ AutoRecovery::ETimerType AutoRecovery::implts_saveDocs( 
      bool        bAllow
         pIt = dangerousDoc;
         AutoRecovery::TDocumentInfo aInfo = *pIt;
 
-        // } /* SAFE */
         g.clear();
         // changing of aInfo and flushing it is done inside implts_saveOneDoc!
         implts_saveOneDoc(sBackupPath, aInfo, xExternalProgress);
         implts_informListener(eJob, 
AutoRecovery::implst_createFeatureStateEvent(eJob, OPERATION_UPDATE, &aInfo));
         g.reset();
-        // /* SAFE */ {
 
         *pIt = aInfo;
     }

Reply via email to