summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/Timer.cc140
-rw-r--r--src/Timer.hh84
2 files changed, 158 insertions, 66 deletions
diff --git a/src/Timer.cc b/src/Timer.cc
index b031816..ba695e1 100644
--- a/src/Timer.cc
+++ b/src/Timer.cc
@@ -21,62 +21,152 @@
21 21
22// stupid macros needed to access some functions in version 2 of the GNU C 22// stupid macros needed to access some functions in version 2 of the GNU C
23// library 23// library
24#ifndef _GNU_SOURCE 24#ifndef _GNU_SOURCE
25# define _GNU_SOURCE 25# define _GNU_SOURCE
26#endif // _GNU_SOURCE 26#endif // _GNU_SOURCE
27 27
28#ifdef HAVE_CONFIG_H 28#ifdef HAVE_CONFIG_H
29# include "../config.h" 29# include "../config.h"
30#endif // HAVE_CONFIG_H 30#endif // HAVE_CONFIG_H
31 31
32#include "BaseDisplay.hh" 32#include "BaseDisplay.hh"
33#include "Timer.hh" 33#include "Timer.hh"
34 34
35//static var
36BTimer::TimerList BTimer::m_timerlist;
35 37
36BTimer::BTimer(BaseDisplay *d, TimeoutHandler *h) { 38BTimer::BTimer(TimeoutHandler *h):
37 display = d; 39m_handler(h),
38 handler = h; 40m_timing(false) ,
39 41m_once(false) {
40 once = timing = False;
41} 42}
42 43
43 44
44BTimer::~BTimer(void) { 45BTimer::~BTimer(void) {
45 if (isTiming()) stop(); 46 if (isTiming()) stop();
46} 47}
47 48
48 49
49void BTimer::setTimeout(long t) { 50void BTimer::setTimeout(long t) {
50 _timeout.tv_sec = t / 1000; 51 m_timeout.tv_sec = t / 1000;
51 _timeout.tv_usec = t; 52 m_timeout.tv_usec = t;
52 _timeout.tv_usec -= (_timeout.tv_sec * 1000); 53 m_timeout.tv_usec -= (m_timeout.tv_sec * 1000);
53 _timeout.tv_usec *= 1000; 54 m_timeout.tv_usec *= 1000;
54} 55}
55 56
56 57
57void BTimer::setTimeout(timeval t) { 58void BTimer::setTimeout(timeval t) {
58 _timeout.tv_sec = t.tv_sec; 59 m_timeout.tv_sec = t.tv_sec;
59 _timeout.tv_usec = t.tv_usec; 60 m_timeout.tv_usec = t.tv_usec;
60} 61}
61 62
62 63
63void BTimer::start(void) { 64void BTimer::start(void) {
64 gettimeofday(&_start, 0); 65 gettimeofday(&m_start, 0);
65 66
66 if (! timing) { 67 if (! m_timing) {
67 timing = True; 68 m_timing = true;
68 display->addTimer(this); 69 addTimer(this); //add us to the list
69 } 70 }
70} 71}
71 72
72 73
73void BTimer::stop(void) { 74void BTimer::stop(void) {
74 timing = False; 75 m_timing = false;
75 76 removeTimer(this); //remove us from the list
76 display->removeTimer(this);
77} 77}
78 78
79 79
80void BTimer::fireTimeout(void) { 80void BTimer::fireTimeout(void) {
81 if (handler) handler->timeout(); 81 if (m_handler) m_handler->timeout();
82}
83
84void BTimer::updateTimers(int fd) {
85 fd_set rfds;
86 timeval now, tm, *timeout = 0;
87
88 FD_ZERO(&rfds);
89 FD_SET(fd, &rfds);
90
91 if (m_timerlist.size() > 0) {
92 gettimeofday(&now, 0);
93
94 tm.tv_sec = tm.tv_usec = 0l;
95
96 BTimer *timer = m_timerlist.front();
97
98 tm.tv_sec = timer->getStartTime().tv_sec +
99 timer->getTimeout().tv_sec - now.tv_sec;
100 tm.tv_usec = timer->getStartTime().tv_usec +
101 timer->getTimeout().tv_usec - now.tv_usec;
102
103 while (tm.tv_usec >= 1000000) {
104 tm.tv_sec++;
105 tm.tv_usec -= 1000000;
106 }
107
108 while (tm.tv_usec < 0) {
109 if (tm.tv_sec > 0) {
110 tm.tv_sec--;
111 tm.tv_usec += 1000000;
112 } else {
113 tm.tv_usec = 0;
114 break;
115 }
116 }
117
118 timeout = &tm;
119 }
120
121 select(fd + 1, &rfds, 0, 0, timeout);
122
123 // check for timer timeout
124 gettimeofday(&now, 0);
125
126 TimerList::iterator it = m_timerlist.begin();
127 //must check end ...the timer might remove
128 //it self from the list (should be fixed in the future)
129 for(; it != m_timerlist.end(); ++it) {
130 tm.tv_sec = (*it)->getStartTime().tv_sec +
131 (*it)->getTimeout().tv_sec;
132 tm.tv_usec = (*it)->getStartTime().tv_usec +
133 (*it)->getTimeout().tv_usec;
134
135 if ((now.tv_sec < tm.tv_sec) ||
136 (now.tv_sec == tm.tv_sec && now.tv_usec < tm.tv_usec))
137 break;
138
139 (*it)->fireTimeout();
140
141 // restart the current timer so that the start time is updated
142 if (! (*it)->doOnce())
143 (*it)->start();
144 else {
145 (*it)->stop();
146 it--;
147 }
148 }
149}
150
151void BTimer::addTimer(BTimer *timer) {
152 assert(timer);
153
154 TimerList::iterator it = m_timerlist.begin();
155 TimerList::iterator it_end = m_timerlist.end();
156 int index = 0;
157 for (; it != it_end; ++it, ++index) {
158 if (((*it)->getTimeout().tv_sec > timer->getTimeout().tv_sec) ||
159 (((*it)->getTimeout().tv_sec == timer->getTimeout().tv_sec) &&
160 ((*it)->getTimeout().tv_usec >= timer->getTimeout().tv_usec))) {
161 break;
162 }
163 }
164 m_timerlist.insert(it, timer);
165
166}
167
168void BTimer::removeTimer(BTimer *timer) {
169 assert(timer);
170 m_timerlist.remove(timer);
82} 171}
172
diff --git a/src/Timer.hh b/src/Timer.hh
index bf40c3c..91d03b7 100644
--- a/src/Timer.hh
+++ b/src/Timer.hh
@@ -1,3 +1,6 @@
1// Timer.hh for fluxbox
2// Copyright (c) 2002 Henrik Kinnunen (fluxgen@linuxmail.org)
3//
1// Timer.hh for Blackbox - An X11 Window Manager 4// Timer.hh for Blackbox - An X11 Window Manager
2// Copyright (c) 1997 - 2000 Brad Hughes (bhughes@tcac.net) 5// Copyright (c) 1997 - 2000 Brad Hughes (bhughes@tcac.net)
3// 6//
@@ -13,73 +16,72 @@
13// 16//
14// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 19// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
17// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 21// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
19// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 22// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
20// DEALINGS IN THE SOFTWARE. 23// DEALINGS IN THE SOFTWARE.
21 24
22#ifndef TIMER_HH 25#ifndef TIMER_HH
23#define TIMER_HH 26#define TIMER_HH
24 27
25#ifdef HAVE_CONFIG_H 28#ifdef HAVE_CONFIG_H
26#include "../config.h" 29#include "../config.h"
27#endif //HAVE_CONFIG_H 30#endif //HAVE_CONFIG_H
28 31
29#ifdef TIME_WITH_SYS_TIME 32#ifdef TIME_WITH_SYS_TIME
30# include <sys/time.h> 33# include <sys/time.h>
31# include <time.h> 34# include <time.h>
32#else // !TIME_WITH_SYS_TIME 35#else // !TIME_WITH_SYS_TIME
33# ifdef HAVE_SYS_TIME_H 36# ifdef HAVE_SYS_TIME_H
34#include <sys/time.h> 37#include <sys/time.h>
35# else // !HAVE_SYS_TIME_H 38# else // !HAVE_SYS_TIME_H
36# include <time.h> 39# include <time.h>
37# endif // HAVE_SYS_TIME_H 40# endif // HAVE_SYS_TIME_H
38#endif // TIME_WITH_SYS_TIME 41#endif // TIME_WITH_SYS_TIME
39 42
40// forward declaration 43#include <list>
41class BTimer;
42class TimeoutHandler;
43
44#include "BaseDisplay.hh"
45
46 44
47class TimeoutHandler { 45class TimeoutHandler {
48public: 46public:
49 virtual void timeout(void) = 0; 47 virtual void timeout(void) = 0;
50}; 48};
51 49
52 50
53class BTimer { 51class BTimer {
54 friend class BaseDisplay; 52public:
55private: 53 explicit BTimer(TimeoutHandler *);
56 BaseDisplay *display; 54 virtual ~BTimer(void);
57 TimeoutHandler *handler;
58 int timing, once;
59
60 timeval _start, _timeout;
61
62
63protected:
64 void fireTimeout(void);
65 55
56 inline const int isTiming(void) const { return m_timing; }
57 inline const int doOnce(void) const { return m_once; }
66 58
67public: 59 inline const timeval &getTimeout(void) const { return m_timeout; }
68 BTimer(BaseDisplay *, TimeoutHandler *); 60 inline const timeval &getStartTime(void) const { return m_start; }
69 virtual ~BTimer(void);
70 61
71 inline const int &isTiming(void) const { return timing; } 62 inline void fireOnce(bool once) { m_once = once; }
72 inline const int &doOnce(void) const { return once; }
73 63
74 inline const timeval &getTimeout(void) const { return _timeout; } 64 void setTimeout(long);
75 inline const timeval &getStartTime(void) const { return _start; } 65 void setTimeout(timeval);
66 void start(void);
67 void stop(void);
68 static void updateTimers(int fd);
69protected:
70 void fireTimeout(void);
76 71
77 inline void fireOnce(int o) { once = o; } 72private:
73 static void addTimer(BTimer *timer);
74 static void removeTimer(BTimer *timer);
75
76 typedef std::list<BTimer *> TimerList;
77 static TimerList m_timerlist;
78
79 TimeoutHandler *m_handler;
80
81 bool m_timing, m_once;
82
83 timeval m_start, m_timeout;
78 84
79 void setTimeout(long);
80 void setTimeout(timeval);
81 void start(void);
82 void stop(void);
83}; 85};
84 86
85 87