otk::Timer-ng!! thanks ManMower for this shizznit!
authorDana Jansens <danakj@orodu.net>
Tue, 14 Jan 2003 09:54:05 +0000 (09:54 +0000)
committerDana Jansens <danakj@orodu.net>
Tue, 14 Jan 2003 09:54:05 +0000 (09:54 +0000)
16 files changed:
otk/Makefile.am
otk/application.cc
otk/application.hh
otk/image.hh
otk/imagecontrol.cc
otk/otk.hh
otk/otk.i
otk/timer.cc
otk/timer.hh
src/bindings.cc
src/bindings.hh
src/openbox.cc
src/openbox.hh
src/openbox.py
src/openbox_wrap.cc
src/screen.cc

index dc84e0e..3677c2b 100644 (file)
@@ -10,7 +10,7 @@ noinst_LTLIBRARIES=libotk.la
 
 libotk_la_SOURCES= color.cc display.cc font.cc gccache.cc image.cc \
                   property.cc imagecontrol.cc rect.cc screeninfo.cc \
-                  texture.cc timer.cc timerqueuemanager.cc style.cc \
+                  texture.cc timer.cc style.cc \
                   configuration.cc util.cc widget.cc focuswidget.cc \
                   button.cc eventhandler.cc eventdispatcher.cc ustring.cc \
                   label.cc focuslabel.cc application.cc appwidget.cc
@@ -34,18 +34,17 @@ otk_test: libotk.a otk_test.cc
 
 # local dependencies
 application.o: application.cc application.hh eventdispatcher.hh \
- eventhandler.hh display.hh configuration.hh timerqueuemanager.hh \
- timerqueue.hh timer.hh image.hh color.hh screeninfo.hh rect.hh \
+ eventhandler.hh display.hh configuration.hh \
+ timer.hh image.hh color.hh screeninfo.hh rect.hh \
  point.hh style.hh font.hh texture.hh util.hh widget.hh
 appwidget.o: appwidget.cc appwidget.hh widget.hh rect.hh point.hh \
  texture.hh color.hh util.hh style.hh font.hh image.hh screeninfo.hh \
  timer.hh configuration.hh eventdispatcher.hh eventhandler.hh \
- application.hh display.hh timerqueuemanager.hh timerqueue.hh
+ application.hh display.hh 
 button.o: button.cc button.hh focuslabel.hh focuswidget.hh widget.hh \
  rect.hh point.hh texture.hh color.hh util.hh style.hh font.hh \
  image.hh screeninfo.hh timer.hh configuration.hh eventdispatcher.hh \
- eventhandler.hh application.hh display.hh timerqueuemanager.hh \
- timerqueue.hh
+ eventhandler.hh application.hh display.hh 
 color.o: color.cc color.hh display.hh screeninfo.hh rect.hh point.hh
 configuration.o: configuration.cc configuration.hh util.hh
 eventdispatcher.o: eventdispatcher.cc eventdispatcher.hh \
@@ -54,13 +53,11 @@ eventhandler.o: eventhandler.cc eventhandler.hh
 focuslabel.o: focuslabel.cc focuslabel.hh focuswidget.hh widget.hh \
  rect.hh point.hh texture.hh color.hh util.hh style.hh font.hh \
  image.hh screeninfo.hh timer.hh configuration.hh eventdispatcher.hh \
- eventhandler.hh application.hh display.hh timerqueuemanager.hh \
- timerqueue.hh
+ eventhandler.hh application.hh display.hh
 focuswidget.o: focuswidget.cc focuswidget.hh widget.hh rect.hh \
  point.hh texture.hh color.hh util.hh style.hh font.hh image.hh \
  screeninfo.hh timer.hh configuration.hh eventdispatcher.hh \
- eventhandler.hh application.hh display.hh timerqueuemanager.hh \
- timerqueue.hh
+ eventhandler.hh application.hh display.hh 
 font.o: font.cc font.hh util.hh display.hh color.hh screeninfo.hh \
  rect.hh point.hh
 gccache.o: gccache.cc gccache.hh display.hh color.hh assassin.hh \
@@ -72,10 +69,10 @@ imagecontrol.o: imagecontrol.cc display.hh color.hh image.hh \
 label.o: label.cc label.hh widget.hh rect.hh point.hh texture.hh \
  color.hh util.hh style.hh font.hh image.hh screeninfo.hh timer.hh \
  configuration.hh eventdispatcher.hh eventhandler.hh application.hh \
- display.hh timerqueuemanager.hh timerqueue.hh
+ display.hh 
 otk_test.o: otk_test.cc application.hh eventdispatcher.hh \
- eventhandler.hh display.hh configuration.hh timerqueuemanager.hh \
- timerqueue.hh timer.hh image.hh color.hh screeninfo.hh rect.hh \
+ eventhandler.hh display.hh configuration.hh \
+ timer.hh image.hh color.hh screeninfo.hh rect.hh \
  point.hh style.hh font.hh texture.hh util.hh focuswidget.hh widget.hh \
  appwidget.hh button.hh focuslabel.hh
 property.o: property.cc property.hh screeninfo.hh rect.hh point.hh \
@@ -88,11 +85,9 @@ style.o: style.cc display.hh util.hh style.hh color.hh font.hh \
  configuration.hh
 texture.o: texture.cc texture.hh color.hh util.hh display.hh image.hh \
  screeninfo.hh rect.hh point.hh timer.hh
-timer.o: timer.cc timer.hh timerqueuemanager.hh timerqueue.hh
-timerqueuemanager.o: timerqueuemanager.cc timerqueuemanager.hh \
- timerqueue.hh timer.hh display.hh
+timer.o: timer.cc timer.hh
 util.o: util.cc util.hh
 widget.o: widget.cc widget.hh rect.hh point.hh texture.hh color.hh \
  util.hh style.hh font.hh image.hh screeninfo.hh timer.hh \
  configuration.hh eventdispatcher.hh eventhandler.hh application.hh \
- display.hh timerqueuemanager.hh timerqueue.hh assassin.hh
+ display.hh assassin.hh
index 1c4a32a..fd8689e 100644 (file)
@@ -7,6 +7,7 @@
 #include "application.hh"
 #include "eventhandler.hh"
 #include "widget.hh"
+#include "timer.hh"
 
 extern "C" {
 #ifdef HAVE_STDLIB_H
@@ -29,8 +30,8 @@ Application::Application(int argc, char **argv)
 
   const ScreenInfo *s_info = _display.screenInfo(DefaultScreen(*_display));
 
-  _timer_manager = new TimerQueueManager();
-  _img_ctrl = new ImageControl(_timer_manager, s_info, True, 4, 5, 200);
+  Timer::initialize();
+  _img_ctrl = new ImageControl(s_info, True, 4, 5, 200);
   _style_conf = new Configuration(False);
   _style = new Style(_img_ctrl);
 
@@ -41,8 +42,8 @@ Application::~Application()
 {
   delete _style_conf;
   delete _img_ctrl;
-  delete _timer_manager;
   delete _style;
+  Timer::destroy();
 }
 
 void Application::loadStyle(void)
@@ -68,7 +69,7 @@ void Application::run(void)
 
   while (_appwidget_count > 0) {
     dispatchEvents();
-    _timer_manager->fire(); // fire pending events
+    Timer::dispatchTimers(); // fire pending events
   }
 }
 
index a0795ac..4d7b0d8 100644 (file)
@@ -5,7 +5,6 @@
 #include "eventdispatcher.hh"
 #include "display.hh"
 #include "configuration.hh"
-#include "timerqueuemanager.hh"
 #include "image.hh"
 #include "style.hh"
 
@@ -33,7 +32,6 @@ private:
   void loadStyle(void);
 
   Display _display;
-  TimerQueueManager *_timer_manager;
   ImageControl *_img_ctrl;
   Configuration *_style_conf;
   Style *_style;
index d172a21..225660c 100644 (file)
@@ -77,11 +77,10 @@ public:
   };
 #endif
 
-  ImageControl(otk::TimerQueueManager *timermanager,
-                const otk::ScreenInfo *scrn,
-                bool _dither= False, int _cpc = 4,
-                unsigned long cache_timeout = 300000l,
-                unsigned long cmax = 200l);
+  ImageControl(const otk::ScreenInfo *scrn,
+               bool _dither= False, int _cpc = 4,
+               unsigned long cache_timeout = 300000l,
+               unsigned long cmax = 200l);
   virtual ~ImageControl(void);
 
   inline bool doDither(void) { return dither; }
index 348e234..ab8f5c5 100644 (file)
@@ -41,11 +41,10 @@ static unsigned long bsqrt(unsigned long x) {
 
 ImageControl *ctrl = 0;
 
-ImageControl::ImageControl(TimerQueueManager *timermanager,
-                             const ScreenInfo *scrn,
-                             bool _dither, int _cpc,
-                             unsigned long cache_timeout,
-                             unsigned long cmax) {
+ImageControl::ImageControl(const ScreenInfo *scrn,
+                           bool _dither, int _cpc,
+                           unsigned long cache_timeout,
+                           unsigned long cmax) {
   if (! ctrl) ctrl = this;
 
   screeninfo = scrn;
@@ -53,13 +52,10 @@ ImageControl::ImageControl(TimerQueueManager *timermanager,
   setColorsPerChannel(_cpc);
 
   cache_max = cmax;
-  if (cache_timeout) {
-    timer = new Timer(timermanager, (TimeoutHandler)timeout, this);
-    timer->setTimeout(cache_timeout);
-    timer->start();
-  } else {
+  if (cache_timeout)
+    timer = new Timer(cache_timeout, (Timer::TimeoutHandler)timeout, this);
+  else
     timer = (Timer *) 0;
-  }
 
   colors = (XColor *) 0;
   ncolors = 0;
@@ -350,10 +346,8 @@ ImageControl::~ImageControl(void) {
     for (; it != end; ++it)
       XFreePixmap(**display, it->pixmap);
   }
-  if (timer) {
-    timer->stop();
+  if (timer)
     delete timer;
-  }
 }
 
 
index b06afcb..23af847 100644 (file)
@@ -26,8 +26,6 @@
 #include "style.hh"
 #include "texture.hh"
 #include "timer.hh"
-#include "timerqueue.hh"
-#include "timerqueuemanager.hh"
 #include "util.hh"
 #include "ustring.hh"
 #include "widget.hh"
index d0e4331..bda7ce9 100644 (file)
--- a/otk/otk.i
+++ b/otk/otk.i
@@ -76,8 +76,6 @@ namespace otk {
 %include "style.hh"
 %include "texture.hh"
 %include "timer.hh"
-%include "timerqueue.hh"
-%include "timerqueuemanager.hh"
 %include "util.hh"
 %include "widget.hh"
 
index 3fe8c70..2d36c7a 100644 (file)
 #endif // HAVE_CONFIG_H
 
 #include "timer.hh"
-#include "timerqueuemanager.hh"
+#include "display.hh"
 
 namespace otk {
 
-static timeval normalizeTimeval(const timeval &tm)
-{
-  timeval ret = tm;
-
-  while (ret.tv_usec < 0) {
-    if (ret.tv_sec > 0) {
-      --ret.tv_sec;
-      ret.tv_usec += 1000000;
-    } else {
-      ret.tv_usec = 0;
-    }
-  }
-
-  if (ret.tv_usec >= 1000000) {
-    ret.tv_sec += ret.tv_usec / 1000000;
-    ret.tv_usec %= 1000000;
-  }
-
-  if (ret.tv_sec < 0) ret.tv_sec = 0;
-
-  return ret;
-}
-
+timeval Timer::_nearest_timeout, Timer::_now;
+Timer::TimerQ Timer::_q;
 
-Timer::Timer(TimerQueueManager *m, TimeoutHandler h, TimeoutData d)
+void Timer::timevalAdd(timeval &a, long msec)
 {
-  _manager = m;
-  _handler = h;
-  _data = d;
-
-  _recur = _timing = false;
+  a.tv_sec += msec / 1000;
+  a.tv_usec += (msec % 1000) * 1000;
+  a.tv_sec += a.tv_usec / 1000000;
+  a.tv_usec %= 1000000;        
 }
 
-
-Timer::~Timer(void)
+bool Timer::nearestTimeout(struct timeval &tm)
 {
-  if (_timing) stop();
-}
-
+  if (_q.empty())
+    return false;
+  tm.tv_sec = _nearest_timeout.tv_sec - _now.tv_sec;
+  tm.tv_usec = _nearest_timeout.tv_usec - _now.tv_usec;
+
+  while (tm.tv_usec < 0) {
+    tm.tv_usec += 1000000;
+    tm.tv_sec--;
+  }
+  tm.tv_sec += tm.tv_usec / 1000000;
+  tm.tv_usec %= 1000000;
+  if (tm.tv_sec < 0)
+    tm.tv_sec = 0;
 
-void Timer::setTimeout(long t)
-{
-  _timeout.tv_sec = t / 1000;
-  _timeout.tv_usec = t % 1000;
-  _timeout.tv_usec *= 1000;
+  return true;
 }
 
-
-void Timer::setTimeout(const timeval &t)
+void Timer::dispatchTimers(bool wait)
 {
-  _timeout.tv_sec = t.tv_sec;
-  _timeout.tv_usec = t.tv_usec;
-}
-
+  fd_set selset;
+  int fd;
+  timeval next;
+  Timer *curr;
+
+  gettimeofday(&_now, NULL);
+  _nearest_timeout = _now;
+  _nearest_timeout.tv_sec += 10000;
+
+  while (!_q.empty()) {
+    curr = _q.top();
+    /* since we overload the destructor to keep from removing from the middle of 
+       the priority queue, set _del_me, we have to do our real delete in here.
+    */
+    if (curr->_del_me) {
+      _q.pop();
+      realDelete(curr);
+      continue;
+    }
 
-void Timer::start(void)
-{
-  gettimeofday(&_start, 0);
+    // the queue is sorted, so if this timer shouldn't fire, none are ready
+    _nearest_timeout = curr->_timeout;
+    if (!timercmp(&_now, &_nearest_timeout, >))
+      break;
+
+    /* we set the last fired time to delay msec after the previous firing, then 
+       re-insert.  timers maintain their order and may trigger more than once if 
+       they've waited more than one delay's worth of time.
+    */
+    _q.pop();
+    timevalAdd(curr->_last, curr->_delay);
+    curr->_action(curr->_data);
+    timevalAdd(curr->_timeout, curr->_delay);
+    _q.push(curr);
+  }
 
-  if (! _timing) {
-    _timing = true;
-    _manager->addTimer(this);
+  if (wait) {
+    // wait for the nearest trigger, or for X to do something interesting
+    fd = ConnectionNumber(**display);
+    FD_ZERO(&selset);
+    FD_SET(fd, &selset);
+    if (nearestTimeout(next))
+      select(fd + 1, &selset, NULL, NULL, &next);
+    else
+      select(fd + 1, &selset, NULL, NULL, NULL);
   }
 }
 
-
-void Timer::stop(void)
+Timer::Timer(long delay, Timer::TimeoutHandler action, void *data)
+  : _delay(delay),
+    _action(action),
+    _data(data),
+    _del_me(false),
+    _last(_now),
+    _timeout(_now)
 {
-  if (_timing) {
-    _timing = false;
-
-    _manager->removeTimer(this);
-  }
+  timevalAdd(_timeout, delay);
+  _q.push(this);
 }
 
-
-void Timer::fire(void)
+void Timer::operator delete(void *self)
 {
-  if (_handler)
-    _handler(_data);
+  Timer *t;
+  t = (Timer *)self;
+  t->_del_me = true;
 }
 
-
-timeval Timer::remainingTime(const timeval &tm) const
+void Timer::realDelete(Timer *me)
 {
-  timeval ret = endTime();
-
-  ret.tv_sec  -= tm.tv_sec;
-  ret.tv_usec -= tm.tv_usec;
-
-  return normalizeTimeval(ret);
+  ::delete me;
 }
 
-
-timeval Timer::endTime(void) const
+void Timer::initialize(void)
 {
-  timeval ret;
-
-  ret.tv_sec = _start.tv_sec + _timeout.tv_sec;
-  ret.tv_usec = _start.tv_usec + _timeout.tv_usec;
-
-  return normalizeTimeval(ret);
+  gettimeofday(&_now, NULL);
+  _nearest_timeout.tv_sec = 100000;
+  _nearest_timeout.tv_usec = 0;
 }
 
-
-bool Timer::shouldFire(const timeval &tm) const
+void Timer::destroy(void)
 {
-  timeval end = endTime();
-
-  return ! ((tm.tv_sec < end.tv_sec) ||
-            (tm.tv_sec == end.tv_sec && tm.tv_usec < end.tv_usec));
+  while(!_q.empty()) {
+    realDelete(_q.top());
+    _q.pop();
+  }
 }
 
 }
index 7d3e726..1d93f91 100644 (file)
@@ -2,6 +2,10 @@
 #ifndef   __timer_hh
 #define   __timer_hh
 
+/*! @file timer.hh
+  @brief Contains the Timer class, used for timed callbacks.
+*/
+
 extern "C" {
 #ifdef    TIME_WITH_SYS_TIME
 #  include <sys/time.h>
@@ -13,120 +17,109 @@ extern "C" {
 #    include <time.h>
 #  endif // HAVE_SYS_TIME_H
 #endif // TIME_WITH_SYS_TIME
+
+#ifdef    HAVE_UNISTD_H
+#  include <sys/types.h>
+#  include <unistd.h>
+#endif // HAVE_UNISTD_H
 }
 
-namespace otk {
+#include <queue>
+#include <vector>
 
-class TimerQueueManager;
+namespace otk {
 
-//! The data passed to the TimeoutHandler function.
+//! The Timer class implements timed callbacks.
 /*!
-  Note: this is a very useful place to put an object instance, and set the
-  event handler to a static function in the same class.
+  The Timer class can be used to have a callback fire after a given time
+  interval. A created Timer will fire repetitively until it is destroyed.
 */
-typedef void *TimeoutData;
-//! The type of function which can be set as the callback for a Timer firing
-typedef void (*TimeoutHandler)(TimeoutData);
-
-//! A Timer class which will fire a function when its time elapses
 class Timer {
-private:
-  //! The manager which to add ourself to and remove ourself after we are done
-  TimerQueueManager *_manager;
-  //! The function to call when the time elapses
-  TimeoutHandler _handler;
-  //! The data which gets passed along to the TimeoutHandler
-  TimeoutData _data;
-  //! Determines if the timer is currently started
-  bool _timing;
-  //! When this is true, the timer will reset itself to fire again every time
-  bool _recur;
-
-  //! The time at which the timer started
-  timeval _start;
-  //! The time at which the timer is going to fire
-  timeval _timeout;
-
-  //! Disallows copying of Timer objects
-  Timer(const Timer&);
-  //! Disallows copying of Timer objects
-  Timer& operator=(const Timer&);
-
 public:
-  //! Constructs a new Timer object
-  /*!
-    @param m The TimerQueueManager with which to associate. The manager
-             specified will be resposible for making this timer fire.
-    @param h The function to call when the timer fires
-    @param d The data to pass along to the function call when the timer fires
-  */
-  Timer(TimerQueueManager *m, TimeoutHandler h, TimeoutData d);
-  //! Destroys the Timer object
-  virtual ~Timer();
-
-  //! Fires the timer, calling its TimeoutHandler
-  void fire();
+  //! Data type of Timer callback
+  typedef void (*TimeoutHandler)(void *data);
 
-  //! Returns if the Timer is started and timing
-  inline bool timing() const { return _timing; }
-  //! Returns if the Timer is going to repeat
-  inline bool recurring() const { return _recur; }
-
-  //! Gets the amount of time the Timer should last before firing
-  inline const timeval &timeout() const { return _timeout; }
-  //! Gets the time at which the Timer started
-  inline const timeval &startTime() const { return _start; }
-
-  //! Gets the amount of time left before the Timer fires
-  timeval remainingTime(const timeval &tm) const;
-  //! Returns if the Timer is past its timeout time, and should fire
-  bool shouldFire(const timeval &tm) const;
-
-  //! Gets the time at which the Timer will fire
-  timeval endTime() const;
-
-  //! Sets the Timer to repeat or not
+private:
+  //! Compares two timeval structs
+  struct TimerCompare {
+     //! Compares two timeval structs
+     inline bool operator()(const Timer *a, const Timer *b) const {
+       return timercmp(&a->_timeout, &b->_timeout, >);
+     }
+  };
+
+  typedef
+  std::priority_queue<Timer*, std::vector<Timer*>, TimerCompare> TimerQ;
+
+  //! Milliseconds between timer firings
+  long _delay;
+  //! Callback for timer expiry
+  TimeoutHandler _action;
+  //! Data sent to callback
+  void *_data;
+  //! We overload the delete operator to just set this to true
+  bool _del_me;
+  //! The time the last fire should've been at
+  struct timeval _last;
+  //! When this timer will next trigger
+  struct timeval _timeout;
+
+  //! Queue of pending timers
+  static TimerQ _q;
+  //! Time next timer will expire
+  static timeval _nearest_timeout;
+  //! Time at start of current processing loop
+  static timeval _now;
+
+  //! Really delete something (not just flag for later)
   /*!
-    @param b If true, the timer is set to repeat; otherwise, it will fire only
-             once
+    @param self Timer to be deleted.
   */
-  inline void setRecurring(bool b) { _recur = b; }
+  static void realDelete(Timer *self);
 
-  //! Sets the amount of time for the Timer to last in milliseconds
+  //! Adds a millisecond delay to a timeval structure
   /*!
-    @param t The number of milliseconds the timer should last
+    @param a Amount of time to increment.
+    @param msec Number of milliseconds to increment by.
   */
-  void setTimeout(long t);
-  //! Sets the amount of time the Timer should last before firing
+  static void timevalAdd(timeval &a, long msec);
+
+public:
+  //! Constructs a new running timer and queues it
   /*!
-    @param t The amount of time the timer should last
+    @param delay Time in milliseconds between firings
+    @param cb The function to be called on fire.
+    @param data Data to be passed to the callback on fire.
   */
-  void setTimeout(const timeval &t);
+  Timer(long delay, TimeoutHandler cb, void *data);
 
-  //! Causes the timer to begin
+  //! Overloaded delete so we can leave deleted objects in queue for later reap
   /*!
-    The timer fires after the time in Timer::getTimeout has passed since this
-    function was called.
-    Calling this function while the timer is already started will cause it to
-    restart its countdown.
+    @param self Pointer to current instance of Timer.
   */
-  void start();  // manager acquires timer
-  //! Causes the timer to stop
+  void operator delete(void *self);
+
+  //! Dispatches all elligible timers, then optionally waits for X events
   /*!
-    The timer will no longer fire once this function has been called.
-    Calling this function more than once does not have any effect.
+    @param wait Whether to wait for X events after processing timers.
   */
-  void stop();   // manager releases timer
+  static void dispatchTimers(bool wait = true);
 
-  //! Determines if this Timer will fire before a second Timer object
+  //! Returns a relative timeval (to pass select) of the next timer
   /*!
-    @param other The second Timer with which to compare
-    @return true if this Timer will fire before 'other'; otherwise, false
+    @param tm Changed to hold the time until next timer.
+    @return true if there are any timers queued, and the timeout is being
+            returned in 'tm'. false if there are no timers queued.
   */
-  bool operator<(const Timer& other) const
-  { return shouldFire(other.endTime()); }
+  static bool nearestTimeout(struct timeval &tm);
+
+  //! Initializes internal data before use
+  static void initialize(void);
+
+  //! Deletes all waiting timers
+  static void destroy(void);
 };
 
 }
 
-#endif // __timer_hh
+#endif // __timer.hh
index 83c9913..054bec2 100644 (file)
@@ -145,17 +145,17 @@ KeyBindingTree *Bindings::buildtree(const StringVect &keylist,
 Bindings::Bindings()
   : _curpos(&_keytree),
     _resetkey(0,0),
-    _timer(openbox->timerManager(),
-           (otk::TimeoutHandler)resetChains, this)
+    _timer((otk::Timer *) 0)
 {
-  _timer.setTimeout(5000); // chains reset after 5 seconds
-  
 //  setResetKey("C-g"); // set the default reset key
 }
 
 
 Bindings::~Bindings()
 {
+  if (_timer)
+    delete _timer;
+
   grabKeys(false);
   removeAllKeys();
 //  removeAllButtons(); XXX
@@ -379,7 +379,11 @@ void Bindings::fireKey(int screen, unsigned int modifiers, unsigned int key,
     while (p) {
       if (p->binding.key == key && p->binding.modifiers == modifiers) {
         if (p->chain) {
-          _timer.start(); // start/restart the timer
+         if (_timer)
+            delete _timer;
+          _timer = new otk::Timer(5000, // 5 second timeout
+                                  (otk::Timer::TimeoutHandler)resetChains,
+                                  this);
           // grab the server here to make sure no key pressed go missed
           otk::display->grab();
           grabKeys(false);
@@ -403,7 +407,10 @@ void Bindings::fireKey(int screen, unsigned int modifiers, unsigned int key,
 
 void Bindings::resetChains(Bindings *self)
 {
-  self->_timer.stop();
+  if (self->_timer) {
+    delete self->_timer;
+    self->_timer = (otk::Timer *) 0;
+  }
   // grab the server here to make sure no key pressed go missed
   otk::display->grab();
   self->grabKeys(false);
index 6ce5670..32f422f 100644 (file)
@@ -67,7 +67,7 @@ private:
 
   Binding _resetkey; // the key which resets the key chain status
 
-  otk::Timer _timer;
+  otk::Timer *_timer;
   
   KeyBindingTree *find(KeyBindingTree *search, bool *conflict) const;
   KeyBindingTree *buildtree(const StringVect &keylist,
index 2f08989..f4d1125 100644 (file)
@@ -113,6 +113,7 @@ Openbox::Openbox(int argc, char **argv)
   sigaction(SIGINT, &action, (struct sigaction *) 0);
   sigaction(SIGHUP, &action, (struct sigaction *) 0);
 
+  otk::Timer::initialize();
   _property = new otk::Property();
   _actions = new Actions();
   _bindings = new Bindings();
@@ -194,6 +195,8 @@ Openbox::~Openbox()
   // all im gunna do is the same.
   //otk::display->destroy();
 
+  otk::Timer::destroy();
+
   if (_restart) {
     if (!_restart_prog.empty()) {
       const std::string &dstr =
@@ -320,7 +323,7 @@ void Openbox::eventLoop()
     XFlush(**otk::display); // flush here before we go wait for timers
     // don't wait if we're to shutdown
     if (_shutdown) break;
-    _timermanager.fire(!_sync); // wait if not in sync mode
+    otk::Timer::dispatchTimers(!_sync); // wait if not in sync mode
   }
 }
 
index fe49df1..d53bce0 100644 (file)
@@ -16,7 +16,6 @@ extern "C" {
 
 #include "otk/display.hh"
 #include "otk/screeninfo.hh"
-#include "otk/timerqueuemanager.hh"
 #include "otk/property.hh"
 #include "otk/configuration.hh"
 #include "otk/eventdispatcher.hh"
@@ -109,13 +108,6 @@ private:
   //! A list of all the managed screens
   ScreenList _screens;
   
-  //! Manages all timers for the application
-  /*!
-    Use of the otk::TimerQueueManager::fire funtion in this object ensures
-    that all timers fire when their times elapse.
-  */
-  otk::TimerQueueManager _timermanager;
-
   //! Cached atoms on the display
   /*!
     This is a pointer because the Property class uses otk::Display::display
@@ -185,13 +177,6 @@ public:
   //! Returns the state of the window manager (starting, exiting, etc)
   inline RunState state() const { return _state; }
 
-  //! Returns the otk::TimerQueueManager for the application
-  /*!
-    All otk::Timer objects used in the application should be made to use this
-    otk::TimerQueueManager.
-  */
-  inline otk::TimerQueueManager *timerManager() { return &_timermanager; }
-
   //! Returns the otk::Property instance for the window manager
   inline const otk::Property *property() const { return _property; }
 
index 1d7e410..6b70a7b 100644 (file)
@@ -446,7 +446,6 @@ class Openbox(EventDispatcher,EventHandler):
     State_Normal = _openbox.Openbox_State_Normal
     State_Exiting = _openbox.Openbox_State_Exiting
     def state(*args): return apply(_openbox.Openbox_state,args)
-    def timerManager(*args): return apply(_openbox.Openbox_timerManager,args)
     def property(*args): return apply(_openbox.Openbox_property,args)
     def actions(*args): return apply(_openbox.Openbox_actions,args)
     def bindings(*args): return apply(_openbox.Openbox_bindings,args)
index 4d1136c..a6386a1 100644 (file)
@@ -706,8 +706,7 @@ SWIG_InstallConstants(PyObject *d, swig_const_info constants[]) {
 #define  SWIGTYPE_p_XMotionEvent swig_types[58] 
 #define  SWIGTYPE_p_XButtonEvent swig_types[59] 
 #define  SWIGTYPE_p_XSelectionEvent swig_types[60] 
-#define  SWIGTYPE_p_otk__TimerQueueManager swig_types[61] 
-static swig_type_info *swig_types[63];
+static swig_type_info *swig_types[62];
 
 /* -------- TYPES TABLE (END) -------- */
 
@@ -5073,23 +5072,6 @@ static PyObject *_wrap_Openbox_state(PyObject *self, PyObject *args) {
 }
 
 
-static PyObject *_wrap_Openbox_timerManager(PyObject *self, PyObject *args) {
-    PyObject *resultobj;
-    ob::Openbox *arg1 = (ob::Openbox *) 0 ;
-    otk::TimerQueueManager *result;
-    PyObject * obj0  = 0 ;
-    
-    if(!PyArg_ParseTuple(args,(char *)"O:Openbox_timerManager",&obj0)) goto fail;
-    if ((SWIG_ConvertPtr(obj0,(void **) &arg1, SWIGTYPE_p_ob__Openbox,SWIG_POINTER_EXCEPTION | 0 )) == -1) SWIG_fail;
-    result = (otk::TimerQueueManager *)(arg1)->timerManager();
-    
-    resultobj = SWIG_NewPointerObj((void *) result, SWIGTYPE_p_otk__TimerQueueManager, 0);
-    return resultobj;
-    fail:
-    return NULL;
-}
-
-
 static PyObject *_wrap_Openbox_property(PyObject *self, PyObject *args) {
     PyObject *resultobj;
     ob::Openbox *arg1 = (ob::Openbox *) 0 ;
@@ -8117,7 +8099,6 @@ static PyMethodDef SwigMethods[] = {
         { (char *)"Cursors_ur_angle_get", _wrap_Cursors_ur_angle_get, METH_VARARGS },
         { (char *)"Cursors_swigregister", Cursors_swigregister, METH_VARARGS },
         { (char *)"Openbox_state", _wrap_Openbox_state, METH_VARARGS },
-        { (char *)"Openbox_timerManager", _wrap_Openbox_timerManager, METH_VARARGS },
         { (char *)"Openbox_property", _wrap_Openbox_property, METH_VARARGS },
         { (char *)"Openbox_actions", _wrap_Openbox_actions, METH_VARARGS },
         { (char *)"Openbox_bindings", _wrap_Openbox_bindings, METH_VARARGS },
@@ -8353,7 +8334,6 @@ static swig_type_info _swigt__p_p_unsigned_long[] = {{"_p_p_unsigned_long", 0, "
 static swig_type_info _swigt__p_XMotionEvent[] = {{"_p_XMotionEvent", 0, "XMotionEvent *", 0},{"_p_XMotionEvent"},{0}};
 static swig_type_info _swigt__p_XButtonEvent[] = {{"_p_XButtonEvent", 0, "XButtonEvent *", 0},{"_p_XButtonEvent"},{0}};
 static swig_type_info _swigt__p_XSelectionEvent[] = {{"_p_XSelectionEvent", 0, "XSelectionEvent *", 0},{"_p_XSelectionEvent"},{0}};
-static swig_type_info _swigt__p_otk__TimerQueueManager[] = {{"_p_otk__TimerQueueManager", 0, "otk::TimerQueueManager *", 0},{"_p_otk__TimerQueueManager"},{0}};
 
 static swig_type_info *swig_types_initial[] = {
 _swigt__p_otk__Point, 
@@ -8417,7 +8397,6 @@ _swigt__p_p_unsigned_long,
 _swigt__p_XMotionEvent, 
 _swigt__p_XButtonEvent, 
 _swigt__p_XSelectionEvent, 
-_swigt__p_otk__TimerQueueManager, 
 0
 };
 
index 2719dee..6158243 100644 (file)
@@ -75,8 +75,7 @@ Screen::Screen(int screen)
                 openbox->cursors().session);
 
   // initialize the shit that is used for all drawing on the screen
-  _image_control = new otk::ImageControl(openbox->timerManager(),
-                                         _info, true);
+  _image_control = new otk::ImageControl(_info, true);
   _image_control->installRootColormap();
   _root_cmap_installed = True;