summaryrefslogtreecommitdiffstats
path: root/src/server/util
diff options
context:
space:
mode:
authorSimon Rettberg2017-03-06 16:01:30 +0100
committerSimon Rettberg2017-03-06 16:01:30 +0100
commit35c7c33c23685e00bc981a3809a3f3a3597c2f9a (patch)
treede55d0e2e81eb1842709028319237266f277c7e9 /src/server/util
parentUpdate translations (diff)
downloadpvs2-35c7c33c23685e00bc981a3809a3f3a3597c2f9a.tar.gz
pvs2-35c7c33c23685e00bc981a3809a3f3a3597c2f9a.tar.xz
pvs2-35c7c33c23685e00bc981a3809a3f3a3597c2f9a.zip
[server] Prevent screen standby while clients are connected
Diffstat (limited to 'src/server/util')
-rw-r--r--src/server/util/platform/screensaver.h26
-rw-r--r--src/server/util/platform/screensaver_X11.cpp74
2 files changed, 100 insertions, 0 deletions
diff --git a/src/server/util/platform/screensaver.h b/src/server/util/platform/screensaver.h
new file mode 100644
index 0000000..d62f9e1
--- /dev/null
+++ b/src/server/util/platform/screensaver.h
@@ -0,0 +1,26 @@
+#ifndef SCREENSAVER_H_
+#define SCREENSAVER_H_
+
+namespace ScreenSaver {
+
+ /**
+ * Whether we want to allow the screen saver
+ * to activate or the screen to enter standby.
+ * Note: If the screen is already in standby,
+ * this will not power it on again, or disable
+ * the screen saver, so to be safe, you might
+ * want to call forceOn() too.
+ * @param allow true to allow ss/standby
+ */
+ void allowSaverAndStandby(bool allow);
+
+ /**
+ * Disable the screen saver (only if password
+ * locking is disabled!), power screen on if
+ * it's in standby.
+ */
+ void forceUnlockAndScreenOn();
+
+}
+
+#endif /* SCREENSAVER_H_ */
diff --git a/src/server/util/platform/screensaver_X11.cpp b/src/server/util/platform/screensaver_X11.cpp
new file mode 100644
index 0000000..efffba9
--- /dev/null
+++ b/src/server/util/platform/screensaver_X11.cpp
@@ -0,0 +1,74 @@
+#include "screensaver.h"
+
+#include <QX11Info>
+#include <QStringList>
+#include <QProcess>
+#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 = NULL;
+ bool extensionSupported = false;
+ bool dpmsSupported = false;
+
+ bool init()
+ {
+ if (display != NULL) {
+ return true;
+ }
+ display = QX11Info::display();
+ if (display == NULL) {
+ 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
+ // TODO: Maybe try some fallback, call xset, or trigger some event periodically
+ }
+
+ void forceUnlockAndScreenOn()
+ {
+ if (!init())
+ return;
+ QProcess process;
+ process.start("xscreensaver-command", QStringList() << "-deactivate");
+ process.waitForFinished(100);
+#ifdef X11_dpms_FOUND
+ CARD16 power_level;
+ BOOL state;
+ if (DPMSInfo(display, &power_level, &state) && state) {
+ DPMSForceLevel(display, DPMSModeOn);
+ return;
+ }
+#endif
+ }
+
+}