summaryrefslogtreecommitdiffstats
path: root/src/server/util/platform/screensaver_X11.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/server/util/platform/screensaver_X11.cpp')
-rw-r--r--src/server/util/platform/screensaver_X11.cpp74
1 files changed, 74 insertions, 0 deletions
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
+ }
+
+}