diff options
| author | Maxime Coste <mawww@kakoune.org> | 2018-01-21 12:00:40 +1100 |
|---|---|---|
| committer | Maxime Coste <mawww@kakoune.org> | 2018-01-21 12:00:40 +1100 |
| commit | 299e22ca7c3a976c7f2edf99f4ff248f6e4c9f85 (patch) | |
| tree | 9ab91ac81211ed0fe4a4203cf561411e3e834627 /src/event_manager.cc | |
| parent | 43f50c0852a6f95abbcdf81f9d3bab9eeefbde0d (diff) | |
Do not block when waiting for next event if we have pending input
Handle next event should never block if we have already accumulated
input that we want to process. As we can accumulate new input in
lots of places (everytime we run a shell process for example, we
might end up reading input keys. That can be triggered during the
mode line generation which takes place during display of the window)
Fixes #1804
Diffstat (limited to 'src/event_manager.cc')
| -rw-r--r-- | src/event_manager.cc | 6 |
1 files changed, 3 insertions, 3 deletions
diff --git a/src/event_manager.cc b/src/event_manager.cc index 63f47858..cb69fc5e 100644 --- a/src/event_manager.cc +++ b/src/event_manager.cc @@ -69,7 +69,7 @@ EventManager::~EventManager() kak_assert(m_timers.empty()); } -void EventManager::handle_next_events(EventMode mode, sigset_t* sigmask) +void EventManager::handle_next_events(EventMode mode, sigset_t* sigmask, bool block) { int max_fd = 0; fd_set rfds, wfds, efds; @@ -92,7 +92,7 @@ void EventManager::handle_next_events(EventMode mode, sigset_t* sigmask) bool with_timeout = false; timespec ts{}; - if (not m_timers.empty()) + if (block and not m_timers.empty()) { auto next_date = (*std::min_element( m_timers.begin(), m_timers.end(), [](Timer* lhs, Timer* rhs) { @@ -109,7 +109,7 @@ void EventManager::handle_next_events(EventMode mode, sigset_t* sigmask) } } int res = pselect(max_fd + 1, &rfds, &wfds, &efds, - with_timeout ? &ts : nullptr, sigmask); + not block or with_timeout ? &ts : nullptr, sigmask); // copy forced fds *after* select, so that signal handlers can write to // m_forced_fd, interupt select, and directly be serviced. |
