From 35c7c33c23685e00bc981a3809a3f3a3597c2f9a Mon Sep 17 00:00:00 2001 From: Simon Rettberg Date: Mon, 6 Mar 2017 16:01:30 +0100 Subject: [server] Prevent screen standby while clients are connected --- src/server/util/platform/screensaver.h | 26 ++++++++++ src/server/util/platform/screensaver_X11.cpp | 74 ++++++++++++++++++++++++++++ 2 files changed, 100 insertions(+) create mode 100644 src/server/util/platform/screensaver.h create mode 100644 src/server/util/platform/screensaver_X11.cpp (limited to 'src/server/util') 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 +#include +#include +#include + +#ifdef X11_Xscreensaver_FOUND +# include +#endif +#ifdef X11_dpms_FOUND +#include +#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 + } + +} -- cgit v1.2.3-55-g7522