]> git.tdb.fi Git - libs/core.git/blob - source/io/eventdispatcher.cpp
Use #ifdef _WIN32 rather than WIN32
[libs/core.git] / source / io / eventdispatcher.cpp
1 #include "base.h"
2 #include "eventdispatcher.h"
3 #include "eventobject.h"
4 #include "poll.h"
5
6 namespace Msp {
7 namespace IO {
8
9 EventDispatcher::EventDispatcher()
10 { }
11
12 EventDispatcher::~EventDispatcher()
13 { }
14
15 void EventDispatcher::add(EventObject &obj)
16 {
17         SlotMap::iterator i = objects.find(&obj);
18         if(i==objects.end())
19         {
20                 i = objects.insert(SlotMap::value_type(&obj, Slot(&obj))).first;
21                 i->second.evch_conn = obj.signal_events_changed.connect(sigc::bind(sigc::mem_fun(this, &EventDispatcher::object_events_changed), &obj));
22                 i->second.del_conn = obj.signal_deleted.connect(sigc::bind(sigc::mem_fun(this, &EventDispatcher::object_deleted), &obj));
23
24                 if(obj.get_events())
25                         poller.set_object(obj, obj.get_events());
26         }
27 }
28
29 void EventDispatcher::remove(EventObject &obj)
30 {
31         SlotMap::iterator i = objects.find(&obj);
32         if(i!=objects.end())
33         {
34                 i->second.evch_conn.disconnect();
35                 i->second.del_conn.disconnect();
36                 objects.erase(i);
37
38                 poller.set_object(obj, P_NONE);
39         }
40 }
41
42 void EventDispatcher::tick()
43 {
44         if(objects.empty())
45                 return;
46
47         if(poller.poll()>0)
48                 dispatch();
49 }
50
51 void EventDispatcher::tick(const Time::TimeDelta &dt)
52 {
53         if(objects.empty())
54                 return;
55
56         if(poller.poll(dt)>0)
57                 dispatch();
58 }
59
60 void EventDispatcher::object_events_changed(PollEvent ev, EventObject *obj)
61 {
62         poller.set_object(*obj, ev);
63 }
64
65 void EventDispatcher::object_deleted(EventObject *obj)
66 {
67         remove(*obj);
68 }
69
70 void EventDispatcher::dispatch()
71 {
72         const Poller::SlotList &result = poller.get_result();
73         for(Poller::SlotList::const_iterator i=result.begin(); i!=result.end(); ++i)
74                 i->object->event(i->events);
75 }
76
77 } // namespace IO
78 } // namespace Msp