summaryrefslogtreecommitdiff
path: root/sw
diff options
context:
space:
mode:
authorJan-Marek Glogowski <glogow@fbihome.de>2018-08-17 23:10:00 +0200
committerChristian Lohmaier <lohmaier+LibreOffice@googlemail.com>2018-10-03 15:47:55 +0200
commitcc360c414d9c9e16ca039300c57fd941d68d66ad (patch)
tree8b97ce423f621aec61a68f09a5c7e9dbbb901678 /sw
parent6f1fb474694876bc4ffeb552dcc7bed8f32cd221 (diff)
tdf#116370 cleanup Writer idle job handing
This prevents the start of the idle job, while processing itself, so the fixed WinSalInstance::AnyInput of commit 3bf6c97029d2 ("tdf#112975 WIN correctly handle VclInputFlags::OTHER") won't report the timer events of the re-started idle job to process. Fixes the early abort of the background job, which resulted in the busy loop of the reported bug and this strange printing behaviour. P.S. I'm not sure, why this was just broken on Windows. Change-Id: I6503dcd925c9a0ed843e794a31eea32a4a4b2889 Reviewed-on: https://gerrit.libreoffice.org/59279 Tested-by: Jenkins Reviewed-by: Jan-Marek Glogowski <glogow@fbihome.de> (cherry picked from commit 401cba4c20fbc930f034168872642428d7459218) Reviewed-on: https://gerrit.libreoffice.org/60723 Reviewed-by: Christian Lohmaier <lohmaier+LibreOffice@googlemail.com>
Diffstat (limited to 'sw')
-rw-r--r--sw/inc/IDocumentTimerAccess.hxx40
-rw-r--r--sw/source/core/doc/DocumentTimerManager.cxx24
-rw-r--r--sw/source/core/inc/DocumentTimerManager.hxx2
-rw-r--r--sw/source/core/inc/docfld.hxx2
-rw-r--r--sw/source/core/inc/rootfrm.hxx4
5 files changed, 37 insertions, 35 deletions
diff --git a/sw/inc/IDocumentTimerAccess.hxx b/sw/inc/IDocumentTimerAccess.hxx
index 6efe1a114963..1ed8679c00ac 100644
--- a/sw/inc/IDocumentTimerAccess.hxx
+++ b/sw/inc/IDocumentTimerAccess.hxx
@@ -20,42 +20,44 @@
#ifndef INCLUDED_SW_INC_IDOCUMENTTIMERACCESS_HXX
#define INCLUDED_SW_INC_IDOCUMENTTIMERACCESS_HXX
-/** Manipulate background jobs of the document. It starts with a mode of
- 'started' and a block count of 0.
+/**
+ * Handle the background job of the Writer document.
+ *
+ * Initially it's disabled and unblocked.
+ *
+ * Jobs include:
+ * * grammar checking
+ * * field updating
+ * * document layouting
*/
class IDocumentTimerAccess
{
public:
/**
- Set mode to 'start'.
- */
+ * Start the idle job depending on the block count.
+ */
virtual void StartIdling() = 0;
/**
- Set mode to 'stopped'.
- */
+ * Stop idle processing.
+ */
virtual void StopIdling() = 0;
/**
- Increment block count.
- */
+ * Increment block count.
+ *
+ * Prevents further background idle processing.
+ */
virtual void BlockIdling() = 0;
/**
- Decrement block count.
- */
+ * Decrement block count.
+ *
+ * May start the idle job.
+ */
virtual void UnblockIdling() = 0;
/**
- Do these jobs asynchronously: do grammar checking,
- do layout, and update fields.
- They will be delayed until mode is start AND block count == 0.
- The implementation might delay them further, for example
- it might wait until the application is idle.
- */
- virtual void StartBackgroundJobs() = 0;
-
- /**
* Is the document ready to be processed?
*/
virtual bool IsDocIdle() const = 0;
diff --git a/sw/source/core/doc/DocumentTimerManager.cxx b/sw/source/core/doc/DocumentTimerManager.cxx
index 5429c6edbda6..35f2eb94dcbd 100644
--- a/sw/source/core/doc/DocumentTimerManager.cxx
+++ b/sw/source/core/doc/DocumentTimerManager.cxx
@@ -49,9 +49,13 @@ DocumentTimerManager::DocumentTimerManager( SwDoc& i_rSwdoc ) : m_rDoc( i_rSwdoc
void DocumentTimerManager::StartIdling()
{
- mbStartIdleTimer = true;
- if( !mIdleBlockCount )
+ if( !mIdleBlockCount && !maDocIdle.IsActive() )
+ {
+ mbStartIdleTimer = false;
maDocIdle.Start();
+ }
+ else
+ mbStartIdleTimer = true;
}
void DocumentTimerManager::StopIdling()
@@ -70,14 +74,10 @@ void DocumentTimerManager::UnblockIdling()
{
--mIdleBlockCount;
if( !mIdleBlockCount && mbStartIdleTimer && !maDocIdle.IsActive() )
+ {
+ mbStartIdleTimer = false;
maDocIdle.Start();
-}
-
-void DocumentTimerManager::StartBackgroundJobs()
-{
- // Trigger DoIdleJobs(), asynchronously.
- if (!maDocIdle.IsActive()) //fdo#73165 if the timer is already running don't restart from 0
- maDocIdle.Start();
+ }
}
DocumentTimerManager::IdleJob DocumentTimerManager::GetNextIdleJob() const
@@ -123,13 +123,14 @@ DocumentTimerManager::IdleJob DocumentTimerManager::GetNextIdleJob() const
return IdleJob::None;
}
-IMPL_LINK( DocumentTimerManager, DoIdleJobs, Timer*, pIdle, void )
+IMPL_LINK_NOARG( DocumentTimerManager, DoIdleJobs, Timer*, void )
{
#ifdef TIMELOG
static ::rtl::Logfile* pModLogFile = 0;
if( !pModLogFile )
pModLogFile = new ::rtl::Logfile( "First DoIdleJobs" );
#endif
+ BlockIdling();
IdleJob eJob = GetNextIdleJob();
@@ -183,7 +184,8 @@ IMPL_LINK( DocumentTimerManager, DoIdleJobs, Timer*, pIdle, void )
}
if ( IdleJob::None != eJob )
- pIdle->Start();
+ StartIdling();
+ UnblockIdling();
#ifdef TIMELOG
if( pModLogFile && 1 != (long)pModLogFile )
diff --git a/sw/source/core/inc/DocumentTimerManager.hxx b/sw/source/core/inc/DocumentTimerManager.hxx
index d8c1a76b2a14..214c0f626a75 100644
--- a/sw/source/core/inc/DocumentTimerManager.hxx
+++ b/sw/source/core/inc/DocumentTimerManager.hxx
@@ -54,8 +54,6 @@ public:
void UnblockIdling() override;
- void StartBackgroundJobs() override;
-
bool IsDocIdle() const override;
private:
diff --git a/sw/source/core/inc/docfld.hxx b/sw/source/core/inc/docfld.hxx
index 9979d557a8ee..fea8face62de 100644
--- a/sw/source/core/inc/docfld.hxx
+++ b/sw/source/core/inc/docfld.hxx
@@ -169,7 +169,7 @@ public:
if (b)
{
- pDocument->getIDocumentTimerAccess().StartBackgroundJobs();
+ pDocument->getIDocumentTimerAccess().StartIdling();
}
}
diff --git a/sw/source/core/inc/rootfrm.hxx b/sw/source/core/inc/rootfrm.hxx
index 8dfc3452dd94..ae32cc4e6278 100644
--- a/sw/source/core/inc/rootfrm.hxx
+++ b/sw/source/core/inc/rootfrm.hxx
@@ -244,7 +244,7 @@ public:
// May be NULL if called from SfxBaseModel::dispose
// (this happens in the build test 'rtfexport').
if (pCurrShell != nullptr)
- pCurrShell->GetDoc()->getIDocumentTimerAccess().StartBackgroundJobs();
+ pCurrShell->GetDoc()->getIDocumentTimerAccess().StartIdling();
}
bool IsIdleFormat() const { return mbIdleFormat; }
void ResetIdleFormat() { mbIdleFormat = false; }
@@ -260,7 +260,7 @@ public:
// May be NULL if called from SfxBaseModel::dispose
// (this happens in the build test 'rtfexport').
if (pCurrShell != nullptr)
- pCurrShell->GetDoc()->getIDocumentTimerAccess().StartBackgroundJobs();
+ pCurrShell->GetDoc()->getIDocumentTimerAccess().StartIdling();
}
}