diff options
| author | Maxime Coste <frrrwww@gmail.com> | 2014-11-25 01:00:18 +0000 |
|---|---|---|
| committer | Maxime Coste <frrrwww@gmail.com> | 2014-11-25 13:52:06 +0000 |
| commit | 49931fbf056ec1036693c669cec8cde4ea8c95fe (patch) | |
| tree | 6adb76a625aa106d6d32a3d9796060a9b75312a5 /src/event_manager.cc | |
| parent | 0272da65c0abf1f7dd3ab214638b6a4d5d390cc4 (diff) | |
Separate events between normal and urgent ones
Run urgent ones while executing %sh blocks.
Fixes #236
Diffstat (limited to 'src/event_manager.cc')
| -rw-r--r-- | src/event_manager.cc | 26 |
1 files changed, 18 insertions, 8 deletions
diff --git a/src/event_manager.cc b/src/event_manager.cc index 48e85f43..673f9403 100644 --- a/src/event_manager.cc +++ b/src/event_manager.cc @@ -16,8 +16,13 @@ FDWatcher::~FDWatcher() EventManager::instance().m_fd_watchers.erase(this); } -Timer::Timer(TimePoint date, Callback callback) - : m_date{date}, m_callback{std::move(callback)} +void FDWatcher::run(EventMode mode) +{ + m_callback(*this, mode); +} + +Timer::Timer(TimePoint date, Callback callback, EventMode mode) + : m_date{date}, m_callback{std::move(callback)}, m_mode(mode) { if (EventManager::has_instance()) EventManager::instance().m_timers.insert(this); @@ -29,10 +34,15 @@ Timer::~Timer() EventManager::instance().m_timers.erase(this); } -void Timer::run() +void Timer::run(EventMode mode) { - m_date = TimePoint::max(); - m_callback(*this); + if (mode & m_mode) + { + m_date = TimePoint::max(); + m_callback(*this); + } + else // try again a little later + m_date = Clock::now() + std::chrono::milliseconds{10}; } EventManager::EventManager() @@ -46,7 +56,7 @@ EventManager::~EventManager() kak_assert(m_timers.empty()); } -void EventManager::handle_next_events() +void EventManager::handle_next_events(EventMode mode) { std::vector<pollfd> events; events.reserve(m_fd_watchers.size()); @@ -76,7 +86,7 @@ void EventManager::handle_next_events() auto it = find_if(m_fd_watchers, [fd](FDWatcher* w) { return w->fd() == fd; }); if (it != m_fd_watchers.end()) - (*it)->run(); + (*it)->run(mode); } } @@ -84,7 +94,7 @@ void EventManager::handle_next_events() for (auto& timer : m_timers) { if (timer->next_date() <= now) - timer->run(); + timer->run(mode); } } |
