X-Git-Url: http://git.tdb.fi/?p=libs%2Fcore.git;a=blobdiff_plain;f=source%2Fio%2Feventdispatcher.cpp;h=49b28ac78bf436997f74d2d8fecb740aebf47fb5;hp=1583597ee067db4e73b81ecded2b4a609b23a0a7;hb=0f32d120e05ebc207dcd2ea733714f29795cb26b;hpb=e46de55d3c8f65d3b0eeaee76247476695e9eb7c diff --git a/source/io/eventdispatcher.cpp b/source/io/eventdispatcher.cpp index 1583597..49b28ac 100644 --- a/source/io/eventdispatcher.cpp +++ b/source/io/eventdispatcher.cpp @@ -1,35 +1,33 @@ -#include +#include #include "base.h" #include "eventdispatcher.h" +#include "eventobject.h" #include "poll.h" +using namespace std; + namespace Msp { namespace IO { -EventDispatcher::EventDispatcher() -{ } - -void EventDispatcher::add(Base &obj) +void EventDispatcher::add(EventObject &obj) { - SlotMap::iterator i = objects.find(&obj); + Slot slot(*this, obj); + set::iterator i = objects.find(slot); if(i==objects.end()) { - i = objects.insert(SlotMap::value_type(&obj, Slot(&obj))).first; - i->second.evch_conn = obj.signal_events_changed.connect(sigc::bind(sigc::mem_fun(this, &EventDispatcher::object_events_changed), &obj)); - i->second.del_conn = obj.signal_deleted.connect(sigc::bind(sigc::mem_fun(this, &EventDispatcher::object_deleted), &obj)); + i = objects.insert(slot).first; + i->connect_signals(); if(obj.get_events()) poller.set_object(obj, obj.get_events()); } } -void EventDispatcher::remove(Base &obj) +void EventDispatcher::remove(EventObject &obj) { - SlotMap::iterator i = objects.find(&obj); + set::iterator i = objects.find(Slot(*this, obj)); if(i!=objects.end()) { - i->second.evch_conn.disconnect(); - i->second.del_conn.disconnect(); objects.erase(i); poller.set_object(obj, P_NONE); @@ -54,21 +52,43 @@ void EventDispatcher::tick(const Time::TimeDelta &dt) dispatch(); } -void EventDispatcher::object_events_changed(PollEvent ev, Base *obj) +void EventDispatcher::tick(const Time::Timer &timer) { - poller.set_object(*obj, ev); + const Time::TimeStamp &timeout = timer.get_next_timeout(); + if(timeout) + tick(timeout-Time::now()); + else + tick(); } -void EventDispatcher::object_deleted(Base *obj) +void EventDispatcher::dispatch() { - remove(*obj); + const vector &result = poller.get_result(); + for(vector::const_iterator i=result.begin(); i!=result.end(); ++i) + if(objects.count(Slot(*this, *i->object))) + i->object->event(i->events); } -void EventDispatcher::dispatch() + +EventDispatcher::Slot::Slot(EventDispatcher &d, EventObject &o): + disp(d), + obj(o) +{ } + +void EventDispatcher::Slot::connect_signals() const +{ + obj.signal_events_changed.connect(sigc::mem_fun(this, &Slot::events_changed)); + obj.signal_deleted.connect(sigc::mem_fun(this, &Slot::deleted)); +} + +void EventDispatcher::Slot::events_changed(PollEvent ev) const +{ + disp.poller.set_object(obj, ev); +} + +void EventDispatcher::Slot::deleted() const { - const Poller::SlotList &result = poller.get_result(); - for(Poller::SlotList::const_iterator i=result.begin(); i!=result.end(); ++i) - i->object->event(i->events); + disp.remove(obj); } } // namespace IO