#include "screensaver.h" #include #include #include #include #ifdef X11_Xscreensaver_FOUND # include #endif #ifdef X11_dpms_FOUND #include #endif namespace { Display *display = nullptr; bool extensionSupported = false; bool dpmsSupported = false; 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 // 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 } }