fix clocktool lagging behind and skipping seconds

from time to time (...) time() might be off to gettimeofday() by a
second. the reason for this is that time() is usually implemented
by just returning the field 'second' of the struct that represents
the clock inside the kernel. gettimeofday() on the other hand also
takes the 'fraction' field (mostly 'nanoseconds') into account and
thus is closer to the current time than time().

the result of using time() was a perceived 'lag', sometimes the
clocktool even skipped a second. by using FbTk::FbTime()::system()
instead fixes the issue.
This commit is contained in:
Mathias Gumz 2014-05-12 10:22:49 +02:00
parent 9b40943dea
commit 913244789f

View file

@ -247,9 +247,20 @@ unsigned int ClockTool::height() const {
void ClockTool::updateTime() { void ClockTool::updateTime() {
time_t t = time(NULL); // time() might result in a different seconds-since-epoch than
// gettimeofday() due to the fact that time() might be implemented by just
// returning the amount of elapsed full seconds without taking into
// account the sum of accumulated sub-seconds might be bigger than a
// second. in this situation time() is 1s behind gettimeofday() which would
// result in having the same 'text' and thus fluxbox would skip this
// round. reference:
//
// http://stackoverflow.com/questions/22917318/time-and-gettimeofday-return-different-seconds/23597725#23597725
if (t != -1) { uint64_t now = FbTk::FbTime::system();
time_t t = static_cast<time_t>(now / 1000000L);
if (t != static_cast<time_t>(-1)) {
char buf[255]; char buf[255];
int len; int len;