]>
Dogcows Code - chaz/openbox/blob - otk/timer.hh
1 // -*- mode: C++; indent-tabs-mode: nil; -*-
2 #ifndef _BLACKBOX_Timer_hh
3 #define _BLACKBOX_Timer_hh
6 #ifdef TIME_WITH_SYS_TIME
9 #else // !TIME_WITH_SYS_TIME
10 # ifdef HAVE_SYS_TIME_H
11 # include <sys/time.h>
12 # else // !HAVE_SYS_TIME_H
14 # endif // HAVE_SYS_TIME_H
15 #endif // TIME_WITH_SYS_TIME
24 // forward declaration
25 class OBTimerQueueManager
;
27 typedef void *OBTimeoutData
;
28 typedef void (*OBTimeoutHandler
)(OBTimeoutData
);
32 OBTimerQueueManager
*manager
;
33 OBTimeoutHandler handler
;
37 timeval _start
, _timeout
;
39 OBTimer(const OBTimer
&);
40 OBTimer
& operator=(const OBTimer
&);
43 OBTimer(OBTimerQueueManager
*m
, OBTimeoutHandler h
, OBTimeoutData d
);
48 inline bool isTiming() const { return timing
; }
49 inline bool isRecurring() const { return recur
; }
51 inline const timeval
&getTimeout() const { return _timeout
; }
52 inline const timeval
&getStartTime() const { return _start
; }
54 timeval
timeRemaining(const timeval
&tm
) const;
55 bool shouldFire(const timeval
&tm
) const;
56 timeval
endpoint() const;
58 inline void recurring(bool b
) { recur
= b
; }
60 void setTimeout(long t
);
61 void setTimeout(const timeval
&t
);
63 void start(); // manager acquires timer
64 void stop(); // manager releases timer
65 void halt(); // halts the timer
67 bool operator<(const OBTimer
& other
) const
68 { return shouldFire(other
.endpoint()); }
72 template <class _Tp
, class _Sequence
, class _Compare
>
73 class _timer_queue
: protected std::priority_queue
<_Tp
, _Sequence
, _Compare
> {
75 typedef std::priority_queue
<_Tp
, _Sequence
, _Compare
> _Base
;
77 _timer_queue(): _Base() {}
80 void release(const _Tp
& value
) {
81 c
.erase(std::remove(c
.begin(), c
.end(), value
), c
.end());
82 // after removing the item we need to make the heap again
83 std::make_heap(c
.begin(), c
.end(), comp
);
85 bool empty() const { return _Base::empty(); }
86 size_t size() const { return _Base::size(); }
87 void push(const _Tp
& value
) { _Base::push(value
); }
88 void pop() { _Base::pop(); }
89 const _Tp
& top() const { return _Base::top(); }
92 _timer_queue(const _timer_queue
&) {}
93 _timer_queue
& operator=(const _timer_queue
&) {}
96 struct TimerLessThan
{
97 bool operator()(const OBTimer
* const l
, const OBTimer
* const r
) const {
102 typedef _timer_queue
<OBTimer
*,
103 std::vector
<OBTimer
*>, TimerLessThan
> TimerQueue
;
105 //! Manages a queue of OBTimer objects
107 All OBTimer objects add themself to an OBTimerQueueManager. The manager is
108 what fires the timers when their time has elapsed. This is done by having the
109 application call the OBTimerQueueManager::fire class in its main event loop.
111 class OBTimerQueueManager
{
113 //! A priority queue of all timers being managed by this class.
114 TimerQueue timerList
;
116 //! Constructs a new OBTimerQueueManager
117 OBTimerQueueManager() {}
118 //! Destroys the OBTimerQueueManager
119 virtual ~OBTimerQueueManager() {}
121 //! Will wait for and fire the next timer in the queue.
123 The function will stop waiting if an event is received from the X server.
127 //! Adds a new timer to the queue
129 @param timer An OBTimer to add to the queue
131 virtual void addTimer(OBTimer
* timer
);
132 //! Removes a timer from the queue
134 @param timer An OBTimer already in the queue to remove
136 virtual void removeTimer(OBTimer
* timer
);
141 #endif // _BLACKBOX_Timer_hh
This page took 0.047749 seconds and 5 git commands to generate.