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 }