#include "screensaver.h" #include #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; QTimer *timer = nullptr; 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 if (allow) { if (timer != nullptr) { timer->stop(); } } else { if (timer == nullptr) { timer = new QTimer; QObject::connect(timer, &QTimer::timeout, forceUnlockAndScreenOn); } timer->setSingleShot(false); timer->start(55000); } } void forceUnlockAndScreenOn() { if (!init()) return; QProcess::startDetached("xscreensaver-command", QStringList() << "-deactivate"); #ifdef X11_dpms_FOUND CARD16 power_level; BOOL state; if (DPMSInfo(display, &power_level, &state) && state) { DPMSForceLevel(display, DPMSModeOn); return; } #endif } }