summaryrefslogblamecommitdiffstats
path: root/src/server/util/platform/screensaver.cpp
blob: 569a4a35e1279501b406877acb1d8e186c5de7b4 (plain) (tree)
1
2
3
4
5
6




                        
                 










                                            
                                   

                                        
                                


                   
                                         


                                              
                                         

























                                                                                                   











                                                                                                  





                                     
                                                                                                










                                                                       
#include "screensaver.h"

#include <QX11Info>
#include <QStringList>
#include <QProcess>
#include <QTimer>
#include <X11/Xlib.h>

#ifdef X11_Xscreensaver_FOUND
#	include <X11/extensions/scrnsaver.h>
#endif
#ifdef X11_dpms_FOUND
#include <X11/extensions/dpms.h>
#endif

namespace {

	Display *display = nullptr;
	bool extensionSupported = false;
	bool dpmsSupported = false;
	QTimer *timer = nullptr;

	bool init()
	{
		if (display != nullptr) {
			return true;
		}
		display = QX11Info::display();
		if (display == nullptr) {
			return false;
		}
#ifdef X11_Xscreensaver_FOUND
		int dummy;
		extensionSupported = (XScreenSaverQueryExtension(display, &dummy, &dummy) == True);
#endif
#ifdef X11_dpms_FOUND
		dpmsSupported = (DPMSCapable(display) == True);
#endif
		return true;
	}

}

namespace ScreenSaver {

	void allowSaverAndStandby(bool allow)
	{
		if (!init())
			return;
#ifdef X11_Xscreensaver_FOUND
		if (extensionSupported) {
			XScreenSaverSuspend(display, allow ? False : True);
			return;
		}
#endif
		if (allow) {
			if (timer != nullptr) {
				timer->stop();
			}
		} else {
			if (timer == nullptr) {
				timer = new QTimer;
				QObject::connect(timer, &QTimer::timeout, forceUnlockAndScreenOn);
			}
			timer->setSingleShot(false);
			timer->start(55000);
		}
	}

	void forceUnlockAndScreenOn()
	{
		if (!init())
			return;
		QProcess::startDetached("xscreensaver-command", QStringList() << "-deactivate");
#ifdef X11_dpms_FOUND
		CARD16 power_level;
		BOOL state;
		if (DPMSInfo(display, &power_level, &state) && state) {
			DPMSForceLevel(display, DPMSModeOn);
			return;
		}
#endif
	}

}