]> git.tdb.fi Git - libs/core.git/blob - source/io/eventdispatcher.h
Separate event-related stuff from Base
[libs/core.git] / source / io / eventdispatcher.h
1 #ifndef EVENTDISPATCHER_H_
2 #define EVENTDISPATCHER_H_
3
4 #include <sigc++/connection.h>
5 #include <sigc++/trackable.h>
6 #include "poll.h"
7
8 namespace Msp {
9 namespace IO {
10
11 /**
12 Put your I/O objects inside one of these to get signaled when something happens
13 on some of them.
14 */
15 class EventDispatcher: public sigc::trackable
16 {
17 private:
18         struct Slot
19         {
20                 EventObject *obj;
21                 sigc::connection evch_conn;
22                 sigc::connection del_conn;
23
24                 Slot(EventObject *o): obj(o) { }
25         };
26
27         typedef std::map<EventObject *, Slot> SlotMap;
28
29         Poller poller;
30         SlotMap objects;
31
32 public:
33         EventDispatcher();
34
35         void add(EventObject &);
36         void remove(EventObject &);
37
38         /** Checks for and dispatches events.  If there are no events available,
39         blocks until there are. */
40         void tick();
41
42         /** Checks for and dispatches events.  If there are no events available,
43         waits at most the specified time before returning. */
44         void tick(const Time::TimeDelta &);
45
46 private:
47         void object_events_changed(PollEvent, EventObject *);
48         void object_deleted(EventObject *);
49         void dispatch();
50 };
51
52 } // namespace IO
53 } // namespace Msp
54
55 #endif