2020-08-02 22:22:19 +00:00
|
|
|
/*
|
|
|
|
KWin - the KDE window manager
|
|
|
|
This file is part of the KDE project.
|
2016-08-15 06:16:33 +00:00
|
|
|
|
2020-08-02 22:22:19 +00:00
|
|
|
SPDX-FileCopyrightText: 2013 Martin Gräßlin <mgraesslin@kde.org>
|
2016-08-15 06:16:33 +00:00
|
|
|
|
2020-08-02 22:22:19 +00:00
|
|
|
SPDX-License-Identifier: GPL-2.0-or-later
|
|
|
|
*/
|
2016-08-15 06:16:33 +00:00
|
|
|
#include "screenlockerwatcher.h"
|
2016-08-16 07:26:17 +00:00
|
|
|
#include "wayland_server.h"
|
2016-08-15 06:16:33 +00:00
|
|
|
|
|
|
|
#include <QFutureWatcher>
|
|
|
|
#include <QtConcurrentRun>
|
|
|
|
// dbus generated
|
|
|
|
#include "screenlocker_interface.h"
|
2019-06-23 15:59:44 +00:00
|
|
|
#include "kscreenlocker_interface.h"
|
2016-08-15 06:16:33 +00:00
|
|
|
|
|
|
|
namespace KWin
|
|
|
|
{
|
|
|
|
|
2016-08-15 06:37:24 +00:00
|
|
|
KWIN_SINGLETON_FACTORY(ScreenLockerWatcher)
|
|
|
|
|
2016-08-15 06:16:33 +00:00
|
|
|
static const QString SCREEN_LOCKER_SERVICE_NAME = QStringLiteral("org.freedesktop.ScreenSaver");
|
|
|
|
|
|
|
|
ScreenLockerWatcher::ScreenLockerWatcher(QObject *parent)
|
|
|
|
: QObject(parent)
|
|
|
|
, m_serviceWatcher(new QDBusServiceWatcher(this))
|
|
|
|
, m_locked(false)
|
2016-08-16 07:26:17 +00:00
|
|
|
{
|
|
|
|
if (waylandServer() && waylandServer()->hasScreenLockerIntegration()) {
|
|
|
|
connect(waylandServer(), &WaylandServer::initialized, this, &ScreenLockerWatcher::initialize);
|
|
|
|
} else {
|
|
|
|
initialize();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
ScreenLockerWatcher::~ScreenLockerWatcher()
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
void ScreenLockerWatcher::initialize()
|
2016-08-15 06:16:33 +00:00
|
|
|
{
|
2020-09-23 18:39:59 +00:00
|
|
|
connect(m_serviceWatcher, &QDBusServiceWatcher::serviceOwnerChanged, this, &ScreenLockerWatcher::serviceOwnerChanged);
|
2016-08-15 06:16:33 +00:00
|
|
|
m_serviceWatcher->setWatchMode(QDBusServiceWatcher::WatchForOwnerChange);
|
|
|
|
m_serviceWatcher->addWatchedService(SCREEN_LOCKER_SERVICE_NAME);
|
|
|
|
// check whether service is registered
|
|
|
|
QFutureWatcher<QDBusReply<bool> > *watcher = new QFutureWatcher<QDBusReply<bool> >(this);
|
2020-09-23 18:39:59 +00:00
|
|
|
connect(watcher, &QFutureWatcher<QDBusReply<bool>>::finished,
|
|
|
|
this, &ScreenLockerWatcher::serviceRegisteredQueried);
|
|
|
|
connect(watcher, &QFutureWatcher<QDBusReply<bool>>::canceled,
|
|
|
|
watcher, &QFutureWatcher<QDBusReply<bool>>::deleteLater);
|
2022-03-09 16:32:34 +00:00
|
|
|
#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
|
2016-08-15 06:16:33 +00:00
|
|
|
watcher->setFuture(QtConcurrent::run(QDBusConnection::sessionBus().interface(),
|
|
|
|
&QDBusConnectionInterface::isServiceRegistered,
|
|
|
|
SCREEN_LOCKER_SERVICE_NAME));
|
2022-03-09 16:32:34 +00:00
|
|
|
#else
|
|
|
|
watcher->setFuture(QtConcurrent::run(&QDBusConnectionInterface::isServiceRegistered,
|
|
|
|
QDBusConnection::sessionBus().interface(),
|
|
|
|
SCREEN_LOCKER_SERVICE_NAME));
|
|
|
|
#endif
|
2016-08-15 06:16:33 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void ScreenLockerWatcher::serviceOwnerChanged(const QString &serviceName, const QString &oldOwner, const QString &newOwner)
|
|
|
|
{
|
|
|
|
Q_UNUSED(oldOwner)
|
|
|
|
if (serviceName != SCREEN_LOCKER_SERVICE_NAME) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
delete m_interface;
|
2019-06-23 15:59:44 +00:00
|
|
|
m_interface = nullptr;
|
|
|
|
delete m_kdeInterface;
|
|
|
|
m_kdeInterface = nullptr;
|
|
|
|
|
2016-08-15 06:16:33 +00:00
|
|
|
m_locked = false;
|
|
|
|
if (!newOwner.isEmpty()) {
|
|
|
|
m_interface = new OrgFreedesktopScreenSaverInterface(newOwner, QStringLiteral("/ScreenSaver"), QDBusConnection::sessionBus(), this);
|
2019-06-23 15:59:44 +00:00
|
|
|
m_kdeInterface = new OrgKdeScreensaverInterface(newOwner, QStringLiteral("/ScreenSaver"), QDBusConnection::sessionBus(), this);
|
2020-09-23 18:39:59 +00:00
|
|
|
connect(m_interface, &OrgFreedesktopScreenSaverInterface::ActiveChanged,
|
|
|
|
this, &ScreenLockerWatcher::setLocked);
|
2016-08-15 06:16:33 +00:00
|
|
|
QDBusPendingCallWatcher *watcher = new QDBusPendingCallWatcher(m_interface->GetActive(), this);
|
2020-09-23 18:39:59 +00:00
|
|
|
connect(watcher, &QDBusPendingCallWatcher::finished,
|
|
|
|
this, &ScreenLockerWatcher::activeQueried);
|
2019-06-23 15:59:44 +00:00
|
|
|
connect(m_kdeInterface, &OrgKdeScreensaverInterface::AboutToLock, this, &ScreenLockerWatcher::aboutToLock);
|
2016-08-15 06:16:33 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void ScreenLockerWatcher::serviceRegisteredQueried()
|
|
|
|
{
|
|
|
|
QFutureWatcher<QDBusReply<bool> > *watcher = dynamic_cast<QFutureWatcher<QDBusReply<bool> > *>(sender());
|
|
|
|
if (!watcher) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
const QDBusReply<bool> &reply = watcher->result();
|
|
|
|
if (reply.isValid() && reply.value()) {
|
|
|
|
QFutureWatcher<QDBusReply<QString> > *ownerWatcher = new QFutureWatcher<QDBusReply<QString> >(this);
|
2020-09-23 18:39:59 +00:00
|
|
|
connect(ownerWatcher, &QFutureWatcher<QDBusReply<QString>>::finished,
|
|
|
|
this, &ScreenLockerWatcher::serviceOwnerQueried);
|
|
|
|
connect(ownerWatcher, &QFutureWatcher<QDBusReply<QString>>::canceled,
|
|
|
|
ownerWatcher, &QFutureWatcher<QDBusReply<QString>>::deleteLater);
|
2022-03-09 16:32:34 +00:00
|
|
|
#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
|
2016-08-15 06:16:33 +00:00
|
|
|
ownerWatcher->setFuture(QtConcurrent::run(QDBusConnection::sessionBus().interface(),
|
|
|
|
&QDBusConnectionInterface::serviceOwner,
|
|
|
|
SCREEN_LOCKER_SERVICE_NAME));
|
2022-03-09 16:32:34 +00:00
|
|
|
#else
|
|
|
|
ownerWatcher->setFuture(QtConcurrent::run(&QDBusConnectionInterface::serviceOwner,
|
|
|
|
QDBusConnection::sessionBus().interface(),
|
|
|
|
SCREEN_LOCKER_SERVICE_NAME));
|
|
|
|
#endif
|
2016-08-15 06:16:33 +00:00
|
|
|
}
|
|
|
|
watcher->deleteLater();
|
|
|
|
}
|
|
|
|
|
|
|
|
void ScreenLockerWatcher::serviceOwnerQueried()
|
|
|
|
{
|
|
|
|
QFutureWatcher<QDBusReply<QString> > *watcher = dynamic_cast<QFutureWatcher<QDBusReply<QString> > *>(sender());
|
|
|
|
if (!watcher) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
const QDBusReply<QString> reply = watcher->result();
|
|
|
|
if (reply.isValid()) {
|
|
|
|
serviceOwnerChanged(SCREEN_LOCKER_SERVICE_NAME, QString(), reply.value());
|
|
|
|
}
|
|
|
|
|
|
|
|
watcher->deleteLater();
|
|
|
|
}
|
|
|
|
|
|
|
|
void ScreenLockerWatcher::activeQueried(QDBusPendingCallWatcher *watcher)
|
|
|
|
{
|
|
|
|
QDBusPendingReply<bool> reply = *watcher;
|
|
|
|
if (!reply.isError()) {
|
|
|
|
setLocked(reply.value());
|
|
|
|
}
|
|
|
|
watcher->deleteLater();
|
|
|
|
}
|
|
|
|
|
|
|
|
void ScreenLockerWatcher::setLocked(bool activated)
|
|
|
|
{
|
|
|
|
if (m_locked == activated) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
m_locked = activated;
|
2021-06-08 07:02:14 +00:00
|
|
|
Q_EMIT locked(m_locked);
|
2016-08-15 06:16:33 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
}
|