diff options
author | Simon Rettberg | 2017-03-06 16:01:30 +0100 |
---|---|---|
committer | Simon Rettberg | 2017-03-06 16:01:30 +0100 |
commit | 35c7c33c23685e00bc981a3809a3f3a3597c2f9a (patch) | |
tree | de55d0e2e81eb1842709028319237266f277c7e9 /src/server/util | |
parent | Update translations (diff) | |
download | pvs2-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.h | 26 | ||||
-rw-r--r-- | src/server/util/platform/screensaver_X11.cpp | 74 |
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 + } + +} |