diff -ruN abi.orig/src/af/util/unix/ut_unixTimer.cpp abi/src/af/util/unix/ut_unixTimer.cpp --- abi.orig/src/af/util/unix/ut_unixTimer.cpp Tue Mar 27 10:35:45 2001 +++ abi/src/af/util/unix/ut_unixTimer.cpp Wed Aug 29 12:13:27 2001 @@ -75,6 +75,7 @@ */ stop(); + m_bDoAsFastAsPossible = false; m_iGtkTimerId = gtk_timeout_add(iMilliseconds, _Timer_Proc, this); if (getIdentifier() == 0) @@ -87,6 +88,31 @@ return 0; } +UT_sint32 UT_UNIXTimer::setAsFastAsPossible() +{ + /* + The goal here is to put a function in an idle queue. This method + should not block. It should call some OS routine which provides + idle facilities, or use another timing mechanism. It is assumed + that this routine requires a C callback. That callback, when it + is called, must look up the UT_Timer object which corresponds to + it, and call its fire() method. See ut_unixTimer.cpp for an + example of how it's done with GTK. We're hoping that something + similar will work for other platforms. + */ + stop(); + + m_bDoAsFastAsPossible = true; + m_iGtkTimerId = gtk_idle_add(_Timer_Proc, this); + + if (getIdentifier() == 0) + setIdentifier(m_iGtkTimerId); + + m_iMilliseconds = 0; + + return 0; +} + void UT_UNIXTimer::stop() { // stop the delivery of timer events. @@ -94,15 +120,24 @@ if (m_iGtkTimerId != 0) { // UT_DEBUGMSG(("ut_unixTimer.cpp: timer [%d] (with id [%d]) stopped\n", getIdentifier(), m_iGtkTimerId)); - gtk_timeout_remove(m_iGtkTimerId); + if (m_bDoAsFastAsPossible) + gtk_idle_remove(m_iGtkTimerId); + else + gtk_timeout_remove(m_iGtkTimerId); m_iGtkTimerId = 0; } } void UT_UNIXTimer::start() { - // resume the delivery of events. - UT_ASSERT(m_iMilliseconds > 0); - set(m_iMilliseconds); + if (m_bDoAsFastAsPossible) + { + setAsFastAsPossible(); + } + else + { + UT_ASSERT(m_iMilliseconds > 0); + set(m_iMilliseconds); + } } diff -ruN abi.orig/src/af/util/unix/ut_unixTimer.h abi/src/af/util/unix/ut_unixTimer.h --- abi.orig/src/af/util/unix/ut_unixTimer.h Fri Jul 27 15:47:11 2001 +++ abi/src/af/util/unix/ut_unixTimer.h Wed Aug 29 11:42:09 2001 @@ -31,12 +31,14 @@ virtual ~UT_UNIXTimer(); virtual UT_sint32 set(UT_uint32 iMilliseconds); + virtual UT_sint32 setAsFastAsPossible(); virtual void stop(); virtual void start(); private: UT_sint32 m_iMilliseconds; UT_uint32 m_iGtkTimerId; + bool m_bDoAsFastAsPossible; }; #endif /* UT_UNIXTIMER_H */ diff -ruN abi.orig/src/af/util/win/ut_Win32Timer.cpp abi/src/af/util/win/ut_Win32Timer.cpp --- abi.orig/src/af/util/win/ut_Win32Timer.cpp Fri Jul 27 23:34:02 2001 +++ abi/src/af/util/win/ut_Win32Timer.cpp Wed Aug 29 11:42:09 2001 @@ -24,6 +24,8 @@ #include "ut_assert.h" #include "gr_Win32Graphics.h" +#define DEFAULT_MSECS 100 + /*****************************************************************/ UT_Timer* UT_Timer::static_constructor(UT_TimerCallback pCallback, void* pData, GR_Graphics * pG) @@ -90,6 +92,16 @@ m_bStarted = true; setIdentifier(idTimer); return 0; +} + +UT_sint32 UT_Win32Timer::setAsFastAsPossible() +{ + // Just a placeholder until someone implements an idle-queue + // mechanism. See ut_unixTimer.cpp for more information. + m_iMilliseconds = DEFAULT_MSECS; + + if (!m_bStarted) + set(m_iMilliseconds); } void UT_Win32Timer::stop(void) diff -ruN abi.orig/src/af/util/win/ut_Win32Timer.h abi/src/af/util/win/ut_Win32Timer.h --- abi.orig/src/af/util/win/ut_Win32Timer.h Tue Feb 6 23:54:10 2001 +++ abi/src/af/util/win/ut_Win32Timer.h Wed Aug 29 11:42:09 2001 @@ -31,6 +31,7 @@ ~UT_Win32Timer(); virtual UT_sint32 set(UT_uint32 iMilliseconds); + virtual UT_sint32 setAsFastAsPossible(); virtual void stop(void); virtual void start(void); diff -ruN abi.orig/src/af/util/xp/ut_timer.h abi/src/af/util/xp/ut_timer.h --- abi.orig/src/af/util/xp/ut_timer.h Thu Jul 26 22:59:27 2001 +++ abi/src/af/util/xp/ut_timer.h Wed Aug 29 11:42:09 2001 @@ -46,6 +46,7 @@ void* getInstanceData(); virtual UT_sint32 set(UT_uint32 iMilliseconds) = 0; /* set freq and start */ + virtual UT_sint32 setAsFastAsPossible() = 0; /* set idle and start */ virtual void stop(void) = 0; /* suspend events */ virtual void start(void) = 0; /* resume events */ void fire(); --- abi.orig/src/text/fmt/xp/fl_DocLayout.cpp Wed Aug 29 09:10:18 2001 +++ abi/src/text/fmt/xp/fl_DocLayout.cpp Wed Aug 29 11:53:28 2001 @@ -897,12 +897,13 @@ } } - if (i != 0 && pDocLayout->m_bStopSpellChecking == false) + if (i == 0) //&& pDocLayout->m_bStopSpellChecking == false) { - // restart timer unless it's not needed any more - //pDocLayout->m_pBackgroundCheckTimer->start(); + // stop timer if it's not needed any more + pDocLayout->m_pBackgroundCheckTimer->stop(); } pDocLayout->m_bImSpellCheckingNow = false; + return; } void FL_DocLayout::queueBlockForBackgroundCheck(UT_uint32 reason, fl_BlockLayout *pBlock, bool bHead) @@ -916,7 +917,8 @@ { m_pBackgroundCheckTimer = UT_Timer::static_constructor(_backgroundCheck, this, m_pG); if (m_pBackgroundCheckTimer) - m_pBackgroundCheckTimer->set(BACKGROUND_CHECK_MSECS); + //m_pBackgroundCheckTimer->set(BACKGROUND_CHECK_MSECS); + m_pBackgroundCheckTimer->setAsFastAsPossible(); } else {