File indexing completed on 2024-05-05 03:55:06
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 #include <QGuiApplication> 0012 0013 // sourcing the moc file before the Xlib include, 0014 // whose defines like "Bool" break Qt names 0015 #include "moc_xscreensaverbasedpoller.cpp" 0016 0017 #include <X11/Xlib.h> 0018 #include <X11/extensions/scrnsaver.h> 0019 0020 static Display *display() 0021 { 0022 return qGuiApp->nativeInterface<QNativeInterface::QX11Application>()->display(); 0023 } 0024 0025 XScreensaverBasedPoller::XScreensaverBasedPoller(QObject *parent) 0026 : KWindowBasedIdleTimePoller(parent) 0027 , m_screenSaverIface(nullptr) 0028 { 0029 } 0030 0031 XScreensaverBasedPoller::~XScreensaverBasedPoller() 0032 { 0033 } 0034 0035 bool XScreensaverBasedPoller::additionalSetUp() 0036 { 0037 m_screenSaverIface = new OrgFreedesktopScreenSaverInterface(QLatin1String("org.freedesktop.ScreenSaver"), 0038 QLatin1String("/ScreenSaver"), 0039 QDBusConnection::sessionBus(), 0040 this); 0041 0042 connect(m_screenSaverIface, &OrgFreedesktopScreenSaverInterface::ActiveChanged, this, &XScreensaverBasedPoller::screensaverActivated); 0043 0044 return true; 0045 } 0046 0047 void XScreensaverBasedPoller::screensaverActivated(bool activated) 0048 { 0049 // We care only if it has been disactivated 0050 0051 if (!activated) { 0052 m_screenSaverIface->SimulateUserActivity(); 0053 Q_EMIT resumingFromIdle(); 0054 } 0055 } 0056 0057 int XScreensaverBasedPoller::getIdleTime() 0058 { 0059 XScreenSaverInfo *mitInfo = nullptr; 0060 mitInfo = XScreenSaverAllocInfo(); 0061 XScreenSaverQueryInfo(display(), DefaultRootWindow(display()), mitInfo); 0062 int ret = mitInfo->idle; 0063 XFree(mitInfo); 0064 return ret; 0065 } 0066 0067 void XScreensaverBasedPoller::simulateUserActivity() 0068 { 0069 stopCatchingIdleEvents(); 0070 XResetScreenSaver(display()); 0071 XFlush(display()); 0072 }