Exemplo n.º 1
0
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();
	}
}
Exemplo n.º 2
0
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();
	}
}
Exemplo n.º 3
0
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;
}