diff options
-rw-r--r-- | desktop/inc/lib/init.hxx | 9 | ||||
-rw-r--r-- | desktop/source/lib/init.cxx | 23 |
2 files changed, 30 insertions, 2 deletions
diff --git a/desktop/inc/lib/init.hxx b/desktop/inc/lib/init.hxx index 580a8e47d9a5..ef8494ed7b0d 100644 --- a/desktop/inc/lib/init.hxx +++ b/desktop/inc/lib/init.hxx @@ -144,6 +144,15 @@ namespace desktop { int m_nDisableCallbacks; bool m_bEventLatch; std::mutex m_mutex; + class TimeoutIdle : public Timer + { + public: + TimeoutIdle( CallbackFlushHandler* handler ); + virtual void Invoke() override; + private: + CallbackFlushHandler* mHandler; + }; + TimeoutIdle m_TimeoutIdle; }; struct DESKTOP_DLLPUBLIC LibLODocument_Impl : public _LibreOfficeKitDocument diff --git a/desktop/source/lib/init.cxx b/desktop/source/lib/init.cxx index 71098de551cb..9edc10d013e4 100644 --- a/desktop/source/lib/init.cxx +++ b/desktop/source/lib/init.cxx @@ -1405,13 +1405,29 @@ static OUString getGenerator() extern "C" { +CallbackFlushHandler::TimeoutIdle::TimeoutIdle( CallbackFlushHandler* handler ) + : Timer( "lokit timer callback" ) + , mHandler( handler ) +{ + // A second timer with higher priority, it'll ensure we flush in reasonable time if we get too busy + // to get POST_PAINT priority processing. Otherwise it could take a long time to flush. + SetPriority(TaskPriority::DEFAULT); + SetTimeout( 100 ); // 100 ms +} + +void CallbackFlushHandler::TimeoutIdle::Invoke() +{ + mHandler->Invoke(); +} + CallbackFlushHandler::CallbackFlushHandler(LibreOfficeKitDocument* pDocument, LibreOfficeKitCallback pCallback, void* pData) - : Idle( "lokit timer callback" ), + : Idle( "lokit idle callback" ), m_pDocument(pDocument), m_pCallback(pCallback), m_pData(pData), m_nDisableCallbacks(0), - m_bEventLatch(false) + m_bEventLatch(false), + m_TimeoutIdle( this ) { SetPriority(TaskPriority::POST_PAINT); @@ -1708,6 +1724,8 @@ void CallbackFlushHandler::queue(const int type, const char* data) { Start(); } + if (!m_TimeoutIdle.IsActive()) + m_TimeoutIdle.Start(); } bool CallbackFlushHandler::processInvalidateTilesEvent(int type, CallbackData& aCallbackData) @@ -2094,6 +2112,7 @@ void CallbackFlushHandler::Invoke() m_queue1.clear(); m_queue2.clear(); + m_TimeoutIdle.Stop(); } } |