File indexing completed on 2024-05-19 16:31:39

0001 /*
0002  * SPDX-FileCopyrightText: 2019 Vlad Zahorodnii <vlad.zahorodnii@kde.org>
0003  *
0004  * SPDX-License-Identifier: GPL-2.0-or-later
0005  */
0006 
0007 #include "monitor.h"
0008 #include "monitor_p.h"
0009 
0010 #include <QDBusConnection>
0011 #include <QDBusMessage>
0012 #include <QDBusPendingCallWatcher>
0013 #include <QDBusPendingReply>
0014 
0015 static const QString s_serviceName = QStringLiteral("org.kde.NightColor");
0016 static const QString s_nightColorPath = QStringLiteral("/ColorCorrect");
0017 static const QString s_nightColorInterface = QStringLiteral("org.kde.kwin.ColorCorrect");
0018 static const QString s_propertiesInterface = QStringLiteral("org.freedesktop.DBus.Properties");
0019 
0020 MonitorPrivate::MonitorPrivate(QObject *parent)
0021     : QObject(parent)
0022 {
0023     QDBusConnection bus = QDBusConnection::sessionBus();
0024 
0025     // clang-format off
0026     const bool connected = bus.connect(s_serviceName,
0027                                        s_nightColorPath,
0028                                        s_propertiesInterface,
0029                                        QStringLiteral("PropertiesChanged"),
0030                                        this,
0031                                        SLOT(handlePropertiesChanged(QString,QVariantMap,QStringList)));
0032     // clang-format on
0033     if (!connected) {
0034         return;
0035     }
0036 
0037     QDBusMessage message = QDBusMessage::createMethodCall(s_serviceName, s_nightColorPath, s_propertiesInterface, QStringLiteral("GetAll"));
0038     message.setArguments({s_nightColorInterface});
0039 
0040     QDBusPendingReply<QVariantMap> properties = bus.asyncCall(message);
0041     QDBusPendingCallWatcher *watcher = new QDBusPendingCallWatcher(properties, this);
0042 
0043     connect(watcher, &QDBusPendingCallWatcher::finished, this, [this](QDBusPendingCallWatcher *self) {
0044         self->deleteLater();
0045 
0046         const QDBusPendingReply<QVariantMap> properties = *self;
0047         if (properties.isError()) {
0048             return;
0049         }
0050 
0051         updateProperties(properties.value());
0052     });
0053 }
0054 
0055 MonitorPrivate::~MonitorPrivate()
0056 {
0057 }
0058 
0059 void MonitorPrivate::handlePropertiesChanged(const QString &interfaceName, const QVariantMap &changedProperties, const QStringList &invalidatedProperties)
0060 {
0061     Q_UNUSED(interfaceName)
0062     Q_UNUSED(invalidatedProperties)
0063 
0064     updateProperties(changedProperties);
0065 }
0066 
0067 int MonitorPrivate::currentTemperature() const
0068 {
0069     return m_currentTemperature;
0070 }
0071 
0072 int MonitorPrivate::targetTemperature() const
0073 {
0074     return m_targetTemperature;
0075 }
0076 
0077 void MonitorPrivate::updateProperties(const QVariantMap &properties)
0078 {
0079     const QVariant available = properties.value(QStringLiteral("available"));
0080     if (available.isValid()) {
0081         setAvailable(available.toBool());
0082     }
0083 
0084     const QVariant enabled = properties.value(QStringLiteral("enabled"));
0085     if (enabled.isValid()) {
0086         setEnabled(enabled.toBool());
0087     }
0088 
0089     const QVariant running = properties.value(QStringLiteral("running"));
0090     if (running.isValid()) {
0091         setRunning(running.toBool());
0092     }
0093 
0094     const QVariant currentTemperature = properties.value(QStringLiteral("currentTemperature"));
0095     if (currentTemperature.isValid()) {
0096         setCurrentTemperature(currentTemperature.toInt());
0097     }
0098 
0099     const QVariant targetTemperature = properties.value(QStringLiteral("targetTemperature"));
0100     if (targetTemperature.isValid()) {
0101         setTargetTemperature(targetTemperature.toInt());
0102     }
0103 }
0104 
0105 void MonitorPrivate::setCurrentTemperature(int temperature)
0106 {
0107     if (m_currentTemperature == temperature) {
0108         return;
0109     }
0110     m_currentTemperature = temperature;
0111     Q_EMIT currentTemperatureChanged();
0112 }
0113 
0114 void MonitorPrivate::setTargetTemperature(int temperature)
0115 {
0116     if (m_targetTemperature == temperature) {
0117         return;
0118     }
0119     m_targetTemperature = temperature;
0120     Q_EMIT targetTemperatureChanged();
0121 }
0122 
0123 bool MonitorPrivate::isAvailable() const
0124 {
0125     return m_isAvailable;
0126 }
0127 
0128 void MonitorPrivate::setAvailable(bool available)
0129 {
0130     if (m_isAvailable == available) {
0131         return;
0132     }
0133     m_isAvailable = available;
0134     Q_EMIT availableChanged();
0135 }
0136 
0137 bool MonitorPrivate::isEnabled() const
0138 {
0139     return m_isEnabled;
0140 }
0141 
0142 void MonitorPrivate::setEnabled(bool enabled)
0143 {
0144     if (m_isEnabled == enabled) {
0145         return;
0146     }
0147     m_isEnabled = enabled;
0148     Q_EMIT enabledChanged();
0149 }
0150 
0151 bool MonitorPrivate::isRunning() const
0152 {
0153     return m_isRunning;
0154 }
0155 
0156 void MonitorPrivate::setRunning(bool running)
0157 {
0158     if (m_isRunning == running) {
0159         return;
0160     }
0161     m_isRunning = running;
0162     Q_EMIT runningChanged();
0163 }
0164 
0165 Monitor::Monitor(QObject *parent)
0166     : QObject(parent)
0167     , d(new MonitorPrivate(this))
0168 {
0169     connect(d, &MonitorPrivate::availableChanged, this, &Monitor::availableChanged);
0170     connect(d, &MonitorPrivate::enabledChanged, this, &Monitor::enabledChanged);
0171     connect(d, &MonitorPrivate::runningChanged, this, &Monitor::runningChanged);
0172     connect(d, &MonitorPrivate::currentTemperatureChanged, this, &Monitor::currentTemperatureChanged);
0173     connect(d, &MonitorPrivate::targetTemperatureChanged, this, &Monitor::targetTemperatureChanged);
0174 }
0175 
0176 Monitor::~Monitor()
0177 {
0178 }
0179 
0180 bool Monitor::isAvailable() const
0181 {
0182     return d->isAvailable();
0183 }
0184 
0185 bool Monitor::isEnabled() const
0186 {
0187     return d->isEnabled();
0188 }
0189 
0190 bool Monitor::isRunning() const
0191 {
0192     return d->isRunning();
0193 }
0194 
0195 int Monitor::currentTemperature() const
0196 {
0197     return d->currentTemperature();
0198 }
0199 
0200 int Monitor::targetTemperature() const
0201 {
0202     return d->targetTemperature();
0203 }