aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/ClockTool.cc50
1 files changed, 46 insertions, 4 deletions
diff --git a/src/ClockTool.cc b/src/ClockTool.cc
index 1dd07cd..5892abe 100644
--- a/src/ClockTool.cc
+++ b/src/ClockTool.cc
@@ -47,6 +47,48 @@
47#include <sys/time.h> 47#include <sys/time.h>
48#include <typeinfo> 48#include <typeinfo>
49 49
50
51namespace {
52
53/**
54 * return true if clock shows seconds. If clock doesn't show seconds then
55 * there is no need to wake up every second to redraw the clock.
56 */
57
58int showSeconds(const std::string& fmt_string) {
59
60 return fmt_string.find("%c") != -1
61 || fmt_string.find("%r") != -1
62 || fmt_string.find("%s") != -1
63 || fmt_string.find("%S") != -1
64 || fmt_string.find("%T") != -1
65 || fmt_string.find("%X") != -1
66 || fmt_string.find("%+") != -1;
67}
68
69timeval calcNextTimeout(const std::string& fmt_string) {
70 timeval now;
71 timeval next;
72 gettimeofday(&now, 0);
73 next.tv_sec = 60 - (now.tv_sec % 60) - 1;
74 next.tv_usec = 1000000 - now.tv_usec;
75 if (next.tv_usec >= 1000000) {
76 next.tv_sec++;
77 next.tv_usec -= 1000000;
78 }
79
80 // wake up at next second-change
81 if (showSeconds(fmt_string)) {
82 next.tv_sec = 0;
83 }
84
85 return next;
86}
87
88
89} // end of anonymous namespace
90
91
50class ClockMenuItem: public FbTk::MenuItem { 92class ClockMenuItem: public FbTk::MenuItem {
51public: 93public:
52 explicit ClockMenuItem(ClockTool &tool): 94 explicit ClockMenuItem(ClockTool &tool):
@@ -157,10 +199,8 @@ ClockTool::ClockTool(const FbTk::FbWindow &parent,
157 199
158 _FB_USES_NLS; 200 _FB_USES_NLS;
159 201
160 // setup timer to check the clock every 0.01 second 202 m_timer.setTimeout(calcNextTimeout(*m_timeformat));
161 // if nothing has changed, it wont update the graphics 203
162 m_timer.setInterval(1);
163 // m_timer.setTimeout(delay); // don't need to set timeout on interval timer
164 FbTk::RefCount<FbTk::Command<void> > update_graphic(new FbTk::SimpleCommand<ClockTool>(*this, 204 FbTk::RefCount<FbTk::Command<void> > update_graphic(new FbTk::SimpleCommand<ClockTool>(*this,
165 &ClockTool::updateTime)); 205 &ClockTool::updateTime));
166 m_timer.setCommand(update_graphic); 206 m_timer.setCommand(update_graphic);
@@ -262,6 +302,8 @@ void ClockTool::updateTime() {
262 gettimeofday(&now, 0); 302 gettimeofday(&now, 0);
263 time_t the_time = now.tv_sec; 303 time_t the_time = now.tv_sec;
264 304
305 m_timer.setTimeout(calcNextTimeout(*m_timeformat));
306
265 if (the_time != -1) { 307 if (the_time != -1) {
266 char time_string[255]; 308 char time_string[255];
267 int time_string_len; 309 int time_string_len;