Scare Crowe d2ebfd0519 QortalOS Titan 5.60.12
Screw the description like that inbred T3Q
2022-03-05 21:17:59 +05:00

157 lines
5.8 KiB
C++

/*
SPDX-FileCopyrightText: 2017 Roman Gilg <subdiff@gmail.com>
SPDX-License-Identifier: GPL-2.0-or-later
*/
#include "kwinwaylandbackend.h"
#include "kwinwaylandtouchpad.h"
#include <algorithm>
#include <KLocalizedString>
#include <QDBusInterface>
#include <QDBusMessage>
#include <QDBusReply>
#include <QStringList>
#include "logging.h"
KWinWaylandBackend::KWinWaylandBackend(QObject *parent)
: TouchpadBackend(parent)
{
m_deviceManager = new QDBusInterface(QStringLiteral("org.kde.KWin"),
QStringLiteral("/org/kde/KWin/InputDevice"),
QStringLiteral("org.kde.KWin.InputDeviceManager"),
QDBusConnection::sessionBus(),
this);
setMode(TouchpadInputBackendMode::WaylandLibinput);
findTouchpads();
m_deviceManager->connection().connect(QStringLiteral("org.kde.KWin"),
QStringLiteral("/org/kde/KWin/InputDevice"),
QStringLiteral("org.kde.KWin.InputDeviceManager"),
QStringLiteral("deviceAdded"),
this,
SLOT(onDeviceAdded(QString)));
m_deviceManager->connection().connect(QStringLiteral("org.kde.KWin"),
QStringLiteral("/org/kde/KWin/InputDevice"),
QStringLiteral("org.kde.KWin.InputDeviceManager"),
QStringLiteral("deviceRemoved"),
this,
SLOT(onDeviceRemoved(QString)));
}
KWinWaylandBackend::~KWinWaylandBackend()
{
qDeleteAll(m_devices);
delete m_deviceManager;
}
void KWinWaylandBackend::findTouchpads()
{
QStringList devicesSysNames;
const QVariant reply = m_deviceManager->property("devicesSysNames");
if (reply.isValid()) {
qCDebug(KCM_TOUCHPAD) << "Devices list received successfully from KWin.";
devicesSysNames = reply.toStringList();
} else {
qCCritical(KCM_TOUCHPAD) << "Error on receiving device list from KWin.";
m_errorString = i18n("Querying input devices failed. Please reopen this settings module.");
return;
}
for (QString sn : devicesSysNames) {
QDBusInterface deviceIface(QStringLiteral("org.kde.KWin"),
QStringLiteral("/org/kde/KWin/InputDevice/") + sn,
QStringLiteral("org.kde.KWin.InputDevice"),
QDBusConnection::sessionBus(),
this);
const QVariant reply = deviceIface.property("touchpad");
if (reply.isValid() && reply.toBool()) {
KWinWaylandTouchpad *tp = new KWinWaylandTouchpad(sn);
if (!tp->init() || !tp->getConfig()) {
qCCritical(KCM_TOUCHPAD) << "Error on creating touchpad object" << sn;
m_errorString = i18n("Critical error on reading fundamental device infos for touchpad %1.", sn);
return;
}
m_devices.append(tp);
qCDebug(KCM_TOUCHPAD).nospace() << "Touchpad found: " << tp->name() << " (" << tp->sysName() << ")";
}
}
}
bool KWinWaylandBackend::applyConfig()
{
return std::all_of(m_devices.constBegin(), m_devices.constEnd(), [](QObject *t) {
return static_cast<KWinWaylandTouchpad *>(t)->applyConfig();
});
}
bool KWinWaylandBackend::getConfig()
{
return std::all_of(m_devices.constBegin(), m_devices.constEnd(), [](QObject *t) {
return static_cast<KWinWaylandTouchpad *>(t)->getConfig();
});
}
bool KWinWaylandBackend::getDefaultConfig()
{
return std::all_of(m_devices.constBegin(), m_devices.constEnd(), [](QObject *t) {
return static_cast<KWinWaylandTouchpad *>(t)->getDefaultConfig();
});
}
bool KWinWaylandBackend::isChangedConfig() const
{
return std::any_of(m_devices.constBegin(), m_devices.constEnd(), [](QObject *t) {
return static_cast<KWinWaylandTouchpad *>(t)->isChangedConfig();
});
}
void KWinWaylandBackend::onDeviceAdded(QString sysName)
{
if (std::any_of(m_devices.constBegin(), m_devices.constEnd(), [sysName](QObject *t) {
return static_cast<KWinWaylandTouchpad *>(t)->sysName() == sysName;
})) {
return;
}
QDBusInterface deviceIface(QStringLiteral("org.kde.KWin"),
QStringLiteral("/org/kde/KWin/InputDevice/") + sysName,
QStringLiteral("org.kde.KWin.InputDevice"),
QDBusConnection::sessionBus(),
this);
QVariant reply = deviceIface.property("touchpad");
if (reply.isValid() && reply.toBool()) {
KWinWaylandTouchpad *tp = new KWinWaylandTouchpad(sysName);
if (!tp->init() || !tp->getConfig()) {
Q_EMIT touchpadAdded(false);
return;
}
m_devices.append(tp);
qCDebug(KCM_TOUCHPAD).nospace() << "Touchpad connected: " << tp->name() << " (" << tp->sysName() << ")";
Q_EMIT touchpadAdded(true);
}
}
void KWinWaylandBackend::onDeviceRemoved(QString sysName)
{
QVector<QObject *>::const_iterator it = std::find_if(m_devices.constBegin(), m_devices.constEnd(), [sysName](QObject *t) {
return static_cast<KWinWaylandTouchpad *>(t)->sysName() == sysName;
});
if (it == m_devices.cend()) {
return;
}
KWinWaylandTouchpad *tp = static_cast<KWinWaylandTouchpad *>(*it);
qCDebug(KCM_TOUCHPAD).nospace() << "Touchpad disconnected: " << tp->name() << " (" << tp->sysName() << ")";
int index = it - m_devices.cbegin();
m_devices.removeAt(index);
Q_EMIT touchpadRemoved(index);
}