summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMaxime Coste <frrrwww@gmail.com>2012-10-27 15:01:13 +0200
committerMaxime Coste <frrrwww@gmail.com>2012-10-27 15:01:13 +0200
commit70cdb7a811e59206b0164bda8f5cdfd33424ca3c (patch)
tree9dd83809c53d34aea3381bfbef0379ac0aedf2ab /src
parent24b43f91c8ffe9aca28823c5840a923cd9b5431a (diff)
EventManager: add force_signal method to force event execution
Diffstat (limited to 'src')
-rw-r--r--src/event_manager.cc15
-rw-r--r--src/event_manager.hh5
2 files changed, 17 insertions, 3 deletions
diff --git a/src/event_manager.cc b/src/event_manager.cc
index 3ac0ce3a..daa363f7 100644
--- a/src/event_manager.cc
+++ b/src/event_manager.cc
@@ -5,6 +5,8 @@
namespace Kakoune
{
+EventManager::EventManager() { m_forced.reserve(4); }
+
void EventManager::watch(int fd, EventHandler handler)
{
auto event = std::find_if(m_events.begin(), m_events.end(),
@@ -31,15 +33,22 @@ void EventManager::unwatch(int fd)
void EventManager::handle_next_events()
{
- int res = poll(m_events.data(), m_events.size(), -1);
- if (res > 0)
+ const int timeout_ms = 100;
+ int res = poll(m_events.data(), m_events.size(), timeout_ms);
+ if (res >= 0)
{
for (size_t i = 0; i < m_events.size(); ++i)
{
- if (m_events[i].revents)
+ if (m_events[i].revents or contains(m_forced, m_events[i].fd))
m_handlers[i](m_events[i].fd);
}
+ m_forced.clear();
}
}
+void EventManager::force_signal(int fd)
+{
+ m_forced.push_back(fd);
+}
+
}
diff --git a/src/event_manager.hh b/src/event_manager.hh
index c1795983..1e8d5a87 100644
--- a/src/event_manager.hh
+++ b/src/event_manager.hh
@@ -13,14 +13,19 @@ using EventHandler = std::function<void (int fd)>;
class EventManager : public Singleton<EventManager>
{
public:
+ EventManager();
+
void watch(int fd, EventHandler handler);
void unwatch(int fd);
void handle_next_events();
+ void force_signal(int fd);
+
private:
std::vector<pollfd> m_events;
std::vector<EventHandler> m_handlers;
+ std::vector<int> m_forced;
};
}