diff options
-rw-r--r-- | src/ClockTool.cc | 9 | ||||
-rw-r--r-- | src/FbTk/FbTime.cc | 24 | ||||
-rw-r--r-- | src/FbTk/FbTime.hh | 15 | ||||
-rw-r--r-- | src/FbTk/Timer.cc | 6 | ||||
-rw-r--r-- | src/Window.cc | 8 |
5 files changed, 36 insertions, 26 deletions
diff --git a/src/ClockTool.cc b/src/ClockTool.cc index 3591f4f..b4792fe 100644 --- a/src/ClockTool.cc +++ b/src/ClockTool.cc | |||
@@ -70,12 +70,13 @@ int showSeconds(const std::string& fmt_string) { | |||
70 | 70 | ||
71 | uint64_t calcNextTimeout(const std::string& fmt_string) { | 71 | uint64_t calcNextTimeout(const std::string& fmt_string) { |
72 | 72 | ||
73 | if (showSeconds(fmt_string)) { // microseconds till next full second | 73 | uint64_t now = FbTk::FbTime::system(); |
74 | return FbTk::FbTime::remainingNext(FbTk::FbTime::IN_SECONDS); | 74 | uint64_t unit = FbTk::FbTime::IN_SECONDS; |
75 | if (!showSeconds(fmt_string)) { // microseconds till next full minute | ||
76 | unit *= 60L; | ||
75 | } | 77 | } |
76 | 78 | ||
77 | // microseconds until next full minute | 79 | return FbTk::FbTime::remainingNext(now, unit); |
78 | return FbTk::FbTime::remainingNext(60L * FbTk::FbTime::IN_SECONDS); | ||
79 | } | 80 | } |
80 | 81 | ||
81 | 82 | ||
diff --git a/src/FbTk/FbTime.cc b/src/FbTk/FbTime.cc index d0ef731..c86edb1 100644 --- a/src/FbTk/FbTime.cc +++ b/src/FbTk/FbTime.cc | |||
@@ -21,6 +21,8 @@ | |||
21 | 21 | ||
22 | #include "FbTime.hh" | 22 | #include "FbTime.hh" |
23 | 23 | ||
24 | #include <cstdlib> | ||
25 | #include <sys/time.h> | ||
24 | 26 | ||
25 | 27 | ||
26 | #ifdef HAVE_CLOCK_GETTIME // linux|*bsd|solaris | 28 | #ifdef HAVE_CLOCK_GETTIME // linux|*bsd|solaris |
@@ -28,16 +30,16 @@ | |||
28 | 30 | ||
29 | namespace { | 31 | namespace { |
30 | 32 | ||
31 | uint64_t _now() { | 33 | uint64_t _mono() { |
32 | 34 | ||
33 | uint64_t n = 0L; | 35 | uint64_t t = 0L; |
34 | timespec ts; | 36 | timespec ts; |
35 | 37 | ||
36 | if (clock_gettime(CLOCK_MONOTONIC, &ts) == 0) { | 38 | if (clock_gettime(CLOCK_MONOTONIC, &ts) == 0) { |
37 | n = (ts.tv_sec * FbTk::FbTime::IN_SECONDS) + (ts.tv_nsec / 1000L); | 39 | t = (ts.tv_sec * FbTk::FbTime::IN_SECONDS) + (ts.tv_nsec / 1000L); |
38 | } | 40 | } |
39 | 41 | ||
40 | return n; | 42 | return t; |
41 | } | 43 | } |
42 | 44 | ||
43 | } | 45 | } |
@@ -59,7 +61,7 @@ uint64_t _now() { | |||
59 | 61 | ||
60 | namespace { | 62 | namespace { |
61 | 63 | ||
62 | uint64_t _now() { | 64 | uint64_t _mono() { |
63 | 65 | ||
64 | // mach_absolute_time() * info.numer / info.denom yields | 66 | // mach_absolute_time() * info.numer / info.denom yields |
65 | // nanoseconds. | 67 | // nanoseconds. |
@@ -85,13 +87,15 @@ uint64_t _now() { | |||
85 | 87 | ||
86 | 88 | ||
87 | 89 | ||
88 | 90 | uint64_t FbTk::FbTime::mono() { | |
89 | uint64_t FbTk::FbTime::now() { | 91 | return ::_mono(); |
90 | return ::_now(); | ||
91 | } | 92 | } |
92 | 93 | ||
93 | 94 | ||
94 | uint64_t FbTk::FbTime::remainingNext(uint64_t unit) { | 95 | uint64_t FbTk::FbTime::system() { |
95 | return (unit - (::_now() % unit) - 1); | 96 | static timeval v; |
97 | gettimeofday(&v, NULL); | ||
98 | return (v.tv_sec * FbTk::FbTime::IN_SECONDS) + v.tv_usec; | ||
96 | } | 99 | } |
97 | 100 | ||
101 | |||
diff --git a/src/FbTk/FbTime.hh b/src/FbTk/FbTime.hh index 2b33dd8..3d80b12 100644 --- a/src/FbTk/FbTime.hh +++ b/src/FbTk/FbTime.hh | |||
@@ -34,7 +34,7 @@ | |||
34 | 34 | ||
35 | namespace FbTk { | 35 | namespace FbTk { |
36 | 36 | ||
37 | // time in micro-seconds, monotonic increasing | 37 | // time in micro-seconds |
38 | // | 38 | // |
39 | // interesting links: | 39 | // interesting links: |
40 | // | 40 | // |
@@ -44,12 +44,17 @@ namespace FbTk { | |||
44 | namespace FbTime { | 44 | namespace FbTime { |
45 | 45 | ||
46 | const uint64_t IN_MILLISECONDS = 1000L; | 46 | const uint64_t IN_MILLISECONDS = 1000L; |
47 | const uint64_t IN_SECONDS = 1000L * 1000L; | 47 | const uint64_t IN_SECONDS = 1000L * IN_MILLISECONDS; |
48 | const uint64_t IN_MINUTES = 60 * IN_SECONDS; | ||
48 | 49 | ||
49 | uint64_t now(); | 50 | uint64_t mono(); // point in time, always monotonic |
51 | uint64_t system(); // system time, might jump (DST, leap seconds) | ||
50 | 52 | ||
51 | // calculates the remaining microseconds up to the next full 'unit' | 53 | // calculates the remaining microseconds from 'now' up to the |
52 | uint64_t remainingNext(uint64_t unit); | 54 | // next full 'unit' |
55 | inline uint64_t remainingNext(uint64_t now, uint64_t unit) { | ||
56 | return (unit - (now % unit) - 1); | ||
57 | } | ||
53 | 58 | ||
54 | } // namespace FbTime | 59 | } // namespace FbTime |
55 | 60 | ||
diff --git a/src/FbTk/Timer.cc b/src/FbTk/Timer.cc index 2404773..1bec893 100644 --- a/src/FbTk/Timer.cc +++ b/src/FbTk/Timer.cc | |||
@@ -117,7 +117,7 @@ void Timer::start() { | |||
117 | // it from s_timerlist before restarting it | 117 | // it from s_timerlist before restarting it |
118 | stop(); | 118 | stop(); |
119 | 119 | ||
120 | m_start = FbTk::FbTime::now(); | 120 | m_start = FbTk::FbTime::mono(); |
121 | 121 | ||
122 | // interval timers have their timeout change every | 122 | // interval timers have their timeout change every |
123 | // time they are started! | 123 | // time they are started! |
@@ -158,7 +158,7 @@ void Timer::updateTimers(int fd) { | |||
158 | FD_SET(fd, &rfds); | 158 | FD_SET(fd, &rfds); |
159 | 159 | ||
160 | bool overdue = false; | 160 | bool overdue = false; |
161 | uint64_t now = FbTime::now(); | 161 | uint64_t now = FbTime::mono(); |
162 | uint64_t end_time; | 162 | uint64_t end_time; |
163 | 163 | ||
164 | // search for overdue timers | 164 | // search for overdue timers |
@@ -192,7 +192,7 @@ void Timer::updateTimers(int fd) { | |||
192 | 192 | ||
193 | static std::vector<FbTk::Timer*> timeouts; | 193 | static std::vector<FbTk::Timer*> timeouts; |
194 | 194 | ||
195 | now = FbTime::now(); | 195 | now = FbTime::mono(); |
196 | for (it = s_timerlist.begin(); it != s_timerlist.end(); ++it ) { | 196 | for (it = s_timerlist.begin(); it != s_timerlist.end(); ++it ) { |
197 | if (now < (*it)->getEndTime()) { | 197 | if (now < (*it)->getEndTime()) { |
198 | break; | 198 | break; |
diff --git a/src/Window.cc b/src/Window.cc index a15c6e0..1ee8853 100644 --- a/src/Window.cc +++ b/src/Window.cc | |||
@@ -550,7 +550,7 @@ void FluxboxWindow::init() { | |||
550 | 550 | ||
551 | m_workspacesig.emit(*this); | 551 | m_workspacesig.emit(*this); |
552 | 552 | ||
553 | m_creation_time = FbTk::FbTime::now(); | 553 | m_creation_time = FbTk::FbTime::mono(); |
554 | 554 | ||
555 | frame().frameExtentSig().emit(); | 555 | frame().frameExtentSig().emit(); |
556 | 556 | ||
@@ -2206,7 +2206,7 @@ void FluxboxWindow::configureRequestEvent(XConfigureRequestEvent &cr) { | |||
2206 | // just after creation if the user has a saved position/size | 2206 | // just after creation if the user has a saved position/size |
2207 | if (m_creation_time) { | 2207 | if (m_creation_time) { |
2208 | 2208 | ||
2209 | uint64_t now = FbTk::FbTime::now(); | 2209 | uint64_t now = FbTk::FbTime::mono(); |
2210 | 2210 | ||
2211 | Remember& rinst = Remember::instance(); | 2211 | Remember& rinst = Remember::instance(); |
2212 | 2212 | ||
@@ -2310,12 +2310,12 @@ void FluxboxWindow::keyPressEvent(XKeyEvent &ke) { | |||
2310 | } | 2310 | } |
2311 | 2311 | ||
2312 | // otherwise, make a note that the user is typing | 2312 | // otherwise, make a note that the user is typing |
2313 | m_last_keypress_time = FbTk::FbTime::now(); | 2313 | m_last_keypress_time = FbTk::FbTime::mono(); |
2314 | } | 2314 | } |
2315 | 2315 | ||
2316 | bool FluxboxWindow::isTyping() const { | 2316 | bool FluxboxWindow::isTyping() const { |
2317 | 2317 | ||
2318 | uint64_t diff = FbTk::FbTime::now() - m_last_keypress_time; | 2318 | uint64_t diff = FbTk::FbTime::mono() - m_last_keypress_time; |
2319 | return ((diff / 1000) < screen().noFocusWhileTypingDelay()); | 2319 | return ((diff / 1000) < screen().noFocusWhileTypingDelay()); |
2320 | } | 2320 | } |
2321 | 2321 | ||