diff options
Diffstat (limited to 'win32/ScintillaWin.cxx')
-rw-r--r-- | win32/ScintillaWin.cxx | 37 |
1 files changed, 31 insertions, 6 deletions
diff --git a/win32/ScintillaWin.cxx b/win32/ScintillaWin.cxx index 4c9f7341a..9c2d78e1c 100644 --- a/win32/ScintillaWin.cxx +++ b/win32/ScintillaWin.cxx @@ -171,10 +171,13 @@ class ScintillaWin : static sptr_t PASCAL CTWndProc( HWND hWnd, UINT iMessage, WPARAM wParam, sptr_t lParam); + enum { invalidTimerID, standardTimerID, idleTimerID }; + virtual void StartDrag(); sptr_t WndPaint(uptr_t wParam); sptr_t HandleComposition(uptr_t wParam, sptr_t lParam); virtual sptr_t DefWndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam); + virtual bool SetIdle(bool on); virtual void SetTicking(bool on); virtual void SetMouseCapture(bool on); virtual bool HaveMouseCapture(); @@ -282,6 +285,7 @@ void ScintillaWin::Initialise() { void ScintillaWin::Finalise() { ScintillaBase::Finalise(); SetTicking(false); + SetIdle(false); ::RevokeDragDrop(MainHWND()); ::OleUninitialize(); } @@ -577,7 +581,14 @@ sptr_t ScintillaWin::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam return 0; case WM_TIMER: - Tick(); + if (wParam == standardTimerID && timer.ticking) { + Tick(); + } else if (wParam == idleTimerID && idler.state) { + if (!Idle()) + SetIdle(false); + } else { + return 1; + } break; case WM_GETMINMAXINFO: @@ -887,11 +898,8 @@ void ScintillaWin::SetTicking(bool on) { if (timer.ticking != on) { timer.ticking = on; if (timer.ticking) { - timer.tickerID = reinterpret_cast<TickerID>(1); - if (::SetTimer(MainHWND(), reinterpret_cast<uptr_t>(timer.tickerID), timer.tickSize, NULL) == 0) { - timer.ticking = false; - timer.tickerID = 0; - } + timer.tickerID = ::SetTimer(MainHWND(), standardTimerID, timer.tickSize, NULL) + ? reinterpret_cast<TickerID>(standardTimerID) : 0; } else { ::KillTimer(MainHWND(), reinterpret_cast<uptr_t>(timer.tickerID)); timer.tickerID = 0; @@ -900,6 +908,23 @@ void ScintillaWin::SetTicking(bool on) { timer.ticksToWait = caret.period; } +bool ScintillaWin::SetIdle(bool on) { + // On Win32 the Idler is implemented as a Timer on the Scintilla window. This + // takes advantage of the fact that WM_TIMER messages are very low priority, + // and are only posted when the message queue is empty, i.e. during idle time. + if (idler.state != on) { + if (on) { + idler.idlerID = ::SetTimer(MainHWND(), idleTimerID, 20, NULL) + ? reinterpret_cast<IdlerID>(idleTimerID) : 0; + } else { + ::KillTimer(MainHWND(), reinterpret_cast<uptr_t>(idler.idlerID)); + idler.idlerID = 0; + } + idler.state = idler.idlerID != 0; + } + return idler.state; +} + void ScintillaWin::SetMouseCapture(bool on) { if (mouseDownCaptures) { if (on) { |