]> source.dussan.org Git - tigervnc.git/commitdiff
Support calling methods from timers
authorPierre Ossman <ossman@cendio.se>
Mon, 18 May 2020 16:53:43 +0000 (18:53 +0200)
committerPierre Ossman <ossman@cendio.se>
Tue, 19 May 2020 17:55:57 +0000 (19:55 +0200)
We can't safely use the normal timers in base classes as we cannot
guarantee that subclasses will call the base class' handleTimeout()
properly if the subclass overrides it.

common/rfb/Timer.h

index ef5097250da87ffb4173f90e7b7216404db85636..ddfce1b23ac1f07ced9c14642a080bd4294feaa7 100644 (file)
@@ -35,6 +35,8 @@ namespace rfb {
      dispatch elapsed Timer callbacks and to determine how long to wait in select() for
      the next timeout to occur.
 
+     For classes that can be derived it's best to use MethodTimer which can call a specific
+     method on the class, thus avoiding conflicts when subclassing.
   */
 
   struct Timer {
@@ -101,6 +103,19 @@ namespace rfb {
     static std::list<Timer*> pending;
   };
 
+  template<class T> class MethodTimer
+    : public Timer, public Timer::Callback {
+  public:
+    MethodTimer(T* obj_, bool (T::*cb_)(Timer*))
+      : Timer(this), obj(obj_), cb(cb_) {}
+
+    virtual bool handleTimeout(Timer* t) { return (obj->*cb)(t); }
+
+  private:
+    T* obj;
+    bool (T::*cb)(Timer*);
+  };
+
 };
 
 #endif