]> git.tdb.fi Git - libs/core.git/blobdiff - source/io/eventdispatcher.h
Refactor signal connection handling in EventDispatcher
[libs/core.git] / source / io / eventdispatcher.h
index 25455ab842f510f10e5c18f14e28779de8467b5f..f95f477daac5199df5995698a217baa64e6e3f99 100644 (file)
@@ -1,9 +1,10 @@
 #ifndef MSP_IO_EVENTDISPATCHER_H_
 #define MSP_IO_EVENTDISPATCHER_H_
 
-#include <sigc++/connection.h>
+#include <set>
 #include <sigc++/trackable.h>
 #include <msp/time/timedelta.h>
+#include <msp/time/timer.h>
 #include "poll.h"
 
 namespace Msp {
@@ -13,27 +14,27 @@ namespace IO {
 Put your I/O objects inside one of these to get signaled when something happens
 on some of them.
 */
-class EventDispatcher: public sigc::trackable
+class EventDispatcher
 {
 private:
-       struct Slot
+       struct Slot: public sigc::trackable
        {
-               EventObject *obj;
-               sigc::connection evch_conn;
-               sigc::connection del_conn;
+               EventDispatcher &disp;
+               EventObject &obj;
 
-               Slot(EventObject *o): obj(o) { }
-       };
+               Slot(EventDispatcher &, EventObject &);
+
+               void connect_signals() const;
+               void events_changed(PollEvent) const;
+               void deleted() const;
 
-       typedef std::map<EventObject *, Slot> SlotMap;
+               bool operator<(const Slot &o) const { return &obj<&o.obj; }
+       };
 
        Poller poller;
-       SlotMap objects;
+       std::set<Slot> objects;
 
 public:
-       EventDispatcher();
-       ~EventDispatcher();
-
        void add(EventObject &);
        void remove(EventObject &);
 
@@ -45,9 +46,11 @@ public:
        waits at most the specified time before returning. */
        void tick(const Time::TimeDelta &);
 
+       /** Checks for and dispatches events.  If there are no events available,
+       waits until the timer's next timeout before returning. */
+       void tick(const Time::Timer &);
+
 private:
-       void object_events_changed(PollEvent, EventObject *);
-       void object_deleted(EventObject *);
        void dispatch();
 };