File indexing completed on 2024-04-28 15:25:35
0001 /* This file is part of the KDE libraries 0002 * SPDX-FileCopyrightText: 2009 Dario Freddi <drf at kde.org> 0003 * 0004 * SPDX-License-Identifier: LGPL-2.1-or-later 0005 */ 0006 0007 #include "xscreensaverbasedpoller.h" 0008 0009 #include <config-kidletime.h> 0010 0011 #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) 0012 #include <QGuiApplication> 0013 #else 0014 #include <QX11Info> 0015 #endif 0016 0017 // sourcing the moc file before the Xlib include, 0018 // whose defines like "Bool" break Qt names 0019 #include "moc_xscreensaverbasedpoller.cpp" 0020 0021 #include <X11/Xlib.h> 0022 #include <X11/extensions/scrnsaver.h> 0023 0024 static Display *display() 0025 { 0026 #if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) 0027 return QX11Info::display(); 0028 #else 0029 return qGuiApp->nativeInterface<QNativeInterface::QX11Application>()->display(); 0030 #endif 0031 } 0032 0033 XScreensaverBasedPoller::XScreensaverBasedPoller(QObject *parent) 0034 : WidgetBasedPoller(parent) 0035 , m_screenSaverIface(nullptr) 0036 { 0037 } 0038 0039 XScreensaverBasedPoller::~XScreensaverBasedPoller() 0040 { 0041 } 0042 0043 bool XScreensaverBasedPoller::additionalSetUp() 0044 { 0045 m_screenSaverIface = new OrgFreedesktopScreenSaverInterface(QLatin1String("org.freedesktop.ScreenSaver"), 0046 QLatin1String("/ScreenSaver"), 0047 QDBusConnection::sessionBus(), 0048 this); 0049 0050 connect(m_screenSaverIface, &OrgFreedesktopScreenSaverInterface::ActiveChanged, this, &XScreensaverBasedPoller::screensaverActivated); 0051 0052 return true; 0053 } 0054 0055 void XScreensaverBasedPoller::screensaverActivated(bool activated) 0056 { 0057 // We care only if it has been disactivated 0058 0059 if (!activated) { 0060 m_screenSaverIface->SimulateUserActivity(); 0061 Q_EMIT resumingFromIdle(); 0062 } 0063 } 0064 0065 int XScreensaverBasedPoller::getIdleTime() 0066 { 0067 XScreenSaverInfo *mitInfo = nullptr; 0068 mitInfo = XScreenSaverAllocInfo(); 0069 XScreenSaverQueryInfo(display(), DefaultRootWindow(display()), mitInfo); 0070 int ret = mitInfo->idle; 0071 XFree(mitInfo); 0072 return ret; 0073 } 0074 0075 void XScreensaverBasedPoller::simulateUserActivity() 0076 { 0077 stopCatchingIdleEvents(); 0078 XResetScreenSaver(display()); 0079 XFlush(display()); 0080 }