--- /dev/null
+/*
+This file is part of libmspframework
+Copyright © 2006 Mikko Rasa, Mikkosoft Productions
+Distributed under the LGPL
+*/
+#include "application.h"
+#include "event.h"
+
+using namespace std;
+
+namespace Msp {
+
+EventManager::EventManager(Application &a):
+ app(a),
+ next_id(1)
+{
+ app.add_pollable(&pipe, POLLIN).signal_event.connect(sigc::mem_fun(this, &EventManager::data_available));
+}
+
+EventManager::Event &EventManager::create_event()
+{
+ events.push_back(Event(*this, next_id++));
+ return events.back();
+}
+
+void EventManager::data_available(short)
+{
+ unsigned buf[1024];
+ int len=pipe.read((char *)buf, sizeof(buf));
+ for(unsigned i=0; i*sizeof(unsigned)<(unsigned)len; ++i)
+ {
+ for(list<Event>::iterator j=events.begin(); j!=events.end(); ++j)
+ if(j->get_id()==buf[i])
+ j->signal_triggered.emit();
+ }
+}
+
+void EventManager::Event::trigger()
+{
+ mgr.pipe.write((char *)&id, sizeof(id));
+}
+
+EventManager::Pipe::Pipe()
+{
+ ::pipe(fd);
+}
+
+int EventManager::Pipe::write(char *buf, unsigned len)
+{
+ return ::write(fd[1], buf, len);
+}
+
+int EventManager::Pipe::read(char *buf, unsigned len)
+{
+ return ::read(fd[0], buf, len);
+}
+
+} // namespace Msp