void CXWindowsScreenSaver::setXScreenSaver(Window window) { LOG((CLOG_DEBUG "xscreensaver window: 0x%08x", window)); // save window m_xscreensaver = window; if (m_xscreensaver != None) { // clear old watch list clearWatchForXScreenSaver(); // see if xscreensaver is active bool error = false; XWindowAttributes attr; { CXWindowsUtil::CErrorLock lock(m_display, &error); XGetWindowAttributes(m_display, m_xscreensaver, &attr); } setXScreenSaverActive(!error && attr.map_state != IsUnmapped); // save current DPMS state; xscreensaver may have changed it. m_dpmsEnabled = isDPMSEnabled(); } else { // screen saver can't be active if it doesn't exist setXScreenSaverActive(false); // start watching for xscreensaver watchForXScreenSaver(); } }
void CXWindowsScreenSaver::watchForXScreenSaver() { // clear old watch list clearWatchForXScreenSaver(); // add every child of the root to the list of windows to watch Window root = DefaultRootWindow(m_display); Window rw, pw, *cw; unsigned int nc; if (XQueryTree(m_display, root, &rw, &pw, &cw, &nc)) { for (unsigned int i = 0; i < nc; ++i) { addWatchXScreenSaver(cw[i]); } XFree(cw); } // now check for xscreensaver window in case it set the property // before we could request property change events. if (findXScreenSaver()) { // found it so clear out our watch list clearWatchForXScreenSaver(); } }
CXWindowsScreenSaver::~CXWindowsScreenSaver() { // done with disable job if (m_disableTimer != NULL) { m_events->deleteTimer(m_disableTimer); } m_events->removeHandler(CEvent::kTimer, this); if (m_display != NULL) { enableDPMS(m_dpmsEnabled); XSetScreenSaver(m_display, m_timeout, m_interval, m_preferBlanking, m_allowExposures); clearWatchForXScreenSaver(); CXWindowsUtil::CErrorLock lock(m_display); XSelectInput(m_display, DefaultRootWindow(m_display), m_rootEventMask); } }
CXWindowsScreenSaver::~CXWindowsScreenSaver() { // clear watch list clearWatchForXScreenSaver(); // stop watching root for events CXWindowsUtil::CErrorLock lock(m_display); Window root = DefaultRootWindow(m_display); XSelectInput(m_display, root, m_rootEventMask); // destroy dummy sink window XDestroyWindow(m_display, m_xscreensaverSink); // done with disable job m_screen->removeTimer(m_disableJob); delete m_disableJob; }