]> Dogcows Code - chaz/openbox/blob - src/timer.cc
76fb022d37a0327c374c83dab3921f4207241402
[chaz/openbox] / src / timer.cc
1 // -*- mode: C++; indent-tabs-mode: nil; -*-
2
3 #ifdef HAVE_CONFIG_H
4 # include "../config.h"
5 #endif // HAVE_CONFIG_H
6
7 #include "timer.hh"
8 #include "util.hh"
9
10 namespace ob {
11
12 BTimer::BTimer(TimerQueueManager *m, TimeoutHandler *h) {
13 manager = m;
14 handler = h;
15
16 recur = timing = False;
17 }
18
19
20 BTimer::~BTimer(void) {
21 if (timing) stop();
22 }
23
24
25 void BTimer::setTimeout(long t) {
26 _timeout.tv_sec = t / 1000;
27 _timeout.tv_usec = t % 1000;
28 _timeout.tv_usec *= 1000;
29 }
30
31
32 void BTimer::setTimeout(const timeval &t) {
33 _timeout.tv_sec = t.tv_sec;
34 _timeout.tv_usec = t.tv_usec;
35 }
36
37
38 void BTimer::start(void) {
39 gettimeofday(&_start, 0);
40
41 if (! timing) {
42 timing = True;
43 manager->addTimer(this);
44 }
45 }
46
47
48 void BTimer::stop(void) {
49 timing = False;
50
51 manager->removeTimer(this);
52 }
53
54
55 void BTimer::halt(void) {
56 timing = False;
57 }
58
59
60 void BTimer::fireTimeout(void) {
61 if (handler)
62 handler->timeout();
63 }
64
65
66 timeval BTimer::timeRemaining(const timeval &tm) const {
67 timeval ret = endpoint();
68
69 ret.tv_sec -= tm.tv_sec;
70 ret.tv_usec -= tm.tv_usec;
71
72 return normalizeTimeval(ret);
73 }
74
75
76 timeval BTimer::endpoint(void) const {
77 timeval ret;
78
79 ret.tv_sec = _start.tv_sec + _timeout.tv_sec;
80 ret.tv_usec = _start.tv_usec + _timeout.tv_usec;
81
82 return normalizeTimeval(ret);
83 }
84
85
86 bool BTimer::shouldFire(const timeval &tm) const {
87 timeval end = endpoint();
88
89 return ! ((tm.tv_sec < end.tv_sec) ||
90 (tm.tv_sec == end.tv_sec && tm.tv_usec < end.tv_usec));
91 }
92
93 }
This page took 0.03525 seconds and 4 git commands to generate.