summaryrefslogtreecommitdiff
path: root/src/event_manager.cc
diff options
context:
space:
mode:
authorMaxime Coste <frrrwww@gmail.com>2014-11-25 01:00:18 +0000
committerMaxime Coste <frrrwww@gmail.com>2014-11-25 13:52:06 +0000
commit49931fbf056ec1036693c669cec8cde4ea8c95fe (patch)
tree6adb76a625aa106d6d32a3d9796060a9b75312a5 /src/event_manager.cc
parent0272da65c0abf1f7dd3ab214638b6a4d5d390cc4 (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.cc26
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);
}
}