diff options
-rw-r--r-- | win32/ScintillaWin.cxx | 29 |
1 files changed, 27 insertions, 2 deletions
diff --git a/win32/ScintillaWin.cxx b/win32/ScintillaWin.cxx index 7f52560d5..81b8e0592 100644 --- a/win32/ScintillaWin.cxx +++ b/win32/ScintillaWin.cxx @@ -76,6 +76,8 @@ #define MK_ALT 32 #endif +#define SC_WIN_IDLE 5001 + // Functions imported from PlatWin extern bool IsNT(); extern void Platform_Initialise(void *hInstance); @@ -584,13 +586,36 @@ sptr_t ScintillaWin::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam if (wParam == standardTimerID && timer.ticking) { Tick(); } else if (wParam == idleTimerID && idler.state) { - if (!Idle()) - SetIdle(false); + SendMessage(MainHWND(), SC_WIN_IDLE, 0, 1); } else { return 1; } break; + case SC_WIN_IDLE: + // wParam=dwTickCountInitial, or 0 to initialize. lParam=bSkipUserInputTest + if (idler.state) { + if (lParam || (WAIT_TIMEOUT==MsgWaitForMultipleObjects(0,0,0,0, QS_INPUT|QS_HOTKEY))) { + if (Idle()) { + // User input was given priority above, but all events do get a turn. Other + // messages, notifications, etc. will get interleaved with the idle messages. + + // However, some things like WM_PAINT are a lower priority, and will not fire + // when there's a message posted. So, several times a second, we stop and let + // the low priority events have a turn (after which the timer will fire again). + + DWORD dwCurrent = GetTickCount(); + DWORD dwStart = wParam ? wParam : dwCurrent; + + if (dwCurrent >= dwStart && dwCurrent > 200 && dwCurrent - 200 < dwStart) + PostMessage(MainHWND(), SC_WIN_IDLE, dwStart, 0); + } else { + SetIdle(false); + } + } + } + break; + case WM_GETMINMAXINFO: return ::DefWindowProc(MainHWND(), iMessage, wParam, lParam); |