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 }