summaryrefslogtreecommitdiffstats
path: root/src/server/util/platform/screensaver.cpp
blob: 569a4a35e1279501b406877acb1d8e186c5de7b4 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
#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
	}

}