16
#include "libdisplay/DisplayX11.h"
18
Display *TimerX11::display_ = NULL;
20
TimerX11::TimerX11(const int w, const unsigned long h,
21
const unsigned long i) : Timer(w, h, i)
23
display_ = XOpenDisplay(NULL);
26
screenSaverInfo_ = NULL;
29
const int screen_num = DefaultScreen(display_);
30
root_ = RootWindow(display_, screen_num);
31
int event_base, error_base;
33
if (XScreenSaverQueryExtension(display_, &event_base, &error_base))
34
screenSaverInfo_ = XScreenSaverAllocInfo();
41
XCloseDisplay(display_);
44
XFree(screenSaverInfo_);
48
// Sleep for sleep_time seconds. Also check if this is a window
49
// that's been closed, in which case the program should quit.
51
TimerX11::Sleep(time_t sleep_time)
53
Options *options = Options::getInstance();
54
if (options->DisplayMode() == WINDOW)
56
Window window = DisplayX11::WindowID();
57
Atom wmDeleteWindow = XInternAtom(display_,
61
XSetWMProtocols(display_, window, &wmDeleteWindow, 1);
62
XSelectInput(display_, window, KeyPressMask);
65
// Check every 1/10th of a second if there's been a request to
67
for (int i = 0; i < sleep_time * 10; i++)
69
if (XCheckTypedWindowEvent(display_, window,
70
ClientMessage, &event) == True)
72
if ((unsigned int) event.xclient.data.l[0]
76
else if (XCheckTypedWindowEvent(display_, window,
77
KeyPress, &event) == True)
81
XLookupString(&(event.xkey), &keybuf, 1, &keysym, NULL);
82
if (keybuf == 'q' || keybuf == 'Q')
87
usleep(100000); // sleep for 1/10 second
99
// returns false if the program should exit after this sleep
103
// Sleep until the next update
104
gettimeofday(¤tTime_, NULL);
105
time_t sleep_time = nextUpdate_ - currentTime_.tv_sec;
108
Options *options = Options::getInstance();
109
if (options->Verbosity() > 0)
112
msg << "sleeping for " << static_cast<int> (sleep_time)
114
<< ctime((time_t *) &nextUpdate_);
115
xpMsg(msg.str(), __FILE__, __LINE__);
117
if (!Sleep(sleep_time)) return(false);
121
if (screenSaverInfo_ != NULL)
125
XScreenSaverQueryInfo(display_, root_, screenSaverInfo_);
126
while (screenSaverInfo_->idle < idlewait_)
128
if (!Sleep((idlewait_ - screenSaverInfo_->idle) / 1000))
130
XScreenSaverQueryInfo(display_, root_, screenSaverInfo_);
136
XScreenSaverQueryInfo(display_, root_, screenSaverInfo_);
137
while (screenSaverInfo_->idle > hibernate_)
139
if (!Sleep(1)) return(false);
140
XScreenSaverQueryInfo(display_, root_, screenSaverInfo_);