void CXWindowsScreenSaver::sendXScreenSaverCommand(Atom cmd, long arg1, long arg2) { XEvent event; event.xclient.type = ClientMessage; event.xclient.display = m_display; event.xclient.window = m_xscreensaverSink; event.xclient.message_type = m_atomScreenSaver; event.xclient.format = 32; event.xclient.data.l[0] = static_cast<long>(cmd); event.xclient.data.l[1] = arg1; event.xclient.data.l[2] = arg2; event.xclient.data.l[3] = 0; event.xclient.data.l[4] = 0; LOG((CLOG_DEBUG "send xscreensaver command: %d %d %d", (long)cmd, arg1, arg2)); bool error = false; { CXWindowsUtil::CErrorLock lock(m_display, &error); XSendEvent(m_display, m_xscreensaver, False, 0, &event); } if (error) { findXScreenSaver(); } }
void CXWindowsScreenSaver::deactivate() { // reinstall disable job timer m_suppressDisable = false; updateDisableTimer(); // try DPMS activateDPMS(false); // disable DPMS if screen saver is disabled if (m_disabled) { enableDPMS(false); } // try xscreensaver findXScreenSaver(); if (m_xscreensaver != None) { sendXScreenSaverCommand(m_atomScreenSaverDeactivate); return; } // use built-in X screen saver XForceScreenSaver(m_display, ScreenSaverReset); }
void CXWindowsScreenSaver::activate() { // remove disable job timer m_suppressDisable = true; updateDisableTimer(); // enable DPMS if it was enabled enableDPMS(m_dpmsEnabled); // try xscreensaver findXScreenSaver(); if (m_xscreensaver != None) { sendXScreenSaverCommand(m_atomScreenSaverActivate); return; } // try built-in X screen saver if (m_timeout != 0) { XForceScreenSaver(m_display, ScreenSaverActive); } // try DPMS activateDPMS(true); }
void CXWindowsScreenSaver::activate() { // remove disable job timer m_suppressDisable = true; updateDisableJob(); // try xscreensaver findXScreenSaver(); if (m_xscreensaver != None) { sendXScreenSaverCommand(m_atomScreenSaverActivate); return; } // use built-in X screen saver XForceScreenSaver(m_display, ScreenSaverActive); }
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( Display* display, Window window, void* eventTarget, IEventQueue* events) : m_display(display), m_xscreensaverSink(window), m_eventTarget(eventTarget), m_xscreensaver(None), m_xscreensaverActive(false), m_dpms(false), m_disabled(false), m_suppressDisable(false), m_disableTimer(NULL), m_disablePos(0), m_events(events) { // get atoms m_atomScreenSaver = XInternAtom(m_display, "SCREENSAVER", False); m_atomScreenSaverVersion = XInternAtom(m_display, "_SCREENSAVER_VERSION", False); m_atomScreenSaverActivate = XInternAtom(m_display, "ACTIVATE", False); m_atomScreenSaverDeactivate = XInternAtom(m_display, "DEACTIVATE", False); // check for DPMS extension. this is an alternative screen saver // that powers down the display. #if HAVE_X11_EXTENSIONS_DPMS_H int eventBase, errorBase; if (DPMSQueryExtension(m_display, &eventBase, &errorBase)) { if (DPMSCapable(m_display)) { // we have DPMS m_dpms = true; } } #endif // watch top-level windows for changes bool error = false; { CXWindowsUtil::CErrorLock lock(m_display, &error); Window root = DefaultRootWindow(m_display); XWindowAttributes attr; XGetWindowAttributes(m_display, root, &attr); m_rootEventMask = attr.your_event_mask; XSelectInput(m_display, root, m_rootEventMask | SubstructureNotifyMask); } if (error) { LOG((CLOG_DEBUG "didn't set root event mask")); m_rootEventMask = 0; } // get the built-in settings XGetScreenSaver(m_display, &m_timeout, &m_interval, &m_preferBlanking, &m_allowExposures); // get the DPMS settings m_dpmsEnabled = isDPMSEnabled(); // get the xscreensaver window, if any if (!findXScreenSaver()) { setXScreenSaver(None); } // install disable timer event handler m_events->adoptHandler(CEvent::kTimer, this, new TMethodEventJob<CXWindowsScreenSaver>(this, &CXWindowsScreenSaver::handleDisableTimer)); }
CXWindowsScreenSaver::CXWindowsScreenSaver( CXWindowsScreen* screen, Display* display) : m_screen(screen), m_display(display), m_notify(None), m_xscreensaver(None), m_xscreensaverActive(false), m_disabled(false), m_suppressDisable(false), m_disableJobInstalled(false) { // screen saver disable callback m_disableJob = new TMethodJob<CXWindowsScreenSaver>(this, &CXWindowsScreenSaver::disableCallback); // get atoms m_atomScreenSaver = XInternAtom(m_display, "SCREENSAVER", False); m_atomScreenSaverVersion = XInternAtom(m_display, "_SCREENSAVER_VERSION", False); m_atomScreenSaverActivate = XInternAtom(m_display, "ACTIVATE", False); m_atomScreenSaverDeactivate = XInternAtom(m_display, "DEACTIVATE", False); m_atomSynergyScreenSaver = XInternAtom(m_display, "SYNERGY_SCREENSAVER", False); // create dummy window to receive xscreensaver responses. this // shouldn't be necessary (we should be able to send responses // to None) but it doesn't hurt. XSetWindowAttributes attr; attr.event_mask = 0;//PropertyChangeMask; attr.do_not_propagate_mask = 0; attr.override_redirect = True; m_xscreensaverSink = XCreateWindow(m_display, DefaultRootWindow(m_display), 0, 0, 1, 1, 0, 0, InputOnly, CopyFromParent, CWDontPropagate | CWEventMask | CWOverrideRedirect, &attr); LOG((CLOG_DEBUG "xscreensaver sink window is 0x%08x", m_xscreensaverSink)); // watch top-level windows for changes { bool error = false; CXWindowsUtil::CErrorLock lock(m_display, &error); Window root = DefaultRootWindow(m_display); XWindowAttributes attr; XGetWindowAttributes(m_display, root, &attr); m_rootEventMask = attr.your_event_mask; XSelectInput(m_display, root, m_rootEventMask | SubstructureNotifyMask); if (error) { LOG((CLOG_DEBUG "didn't set root event mask")); m_rootEventMask = 0; } } // get the xscreensaver window, if any if (!findXScreenSaver()) { setXScreenSaver(None); } // get the built-in settings XGetScreenSaver(m_display, &m_timeout, &m_interval, &m_preferBlanking, &m_allowExposures); }