File indexing completed on 2024-06-16 05:09:54

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 "nightcolormonitor.h"
0008 #include "nightcolormonitor_p.h"
0009 
0010 #include <QDBusConnection>
0011 #include <QDBusMessage>
0012 #include <QDBusPendingCallWatcher>
0013 #include <QDBusPendingReply>
0014 #include <qstringliteral.h>
0015 #include <qtypes.h>
0016 #include <qvariant.h>
0017 
0018 static const QString s_serviceName = QStringLiteral("org.kde.KWin.NightLight");
0019 static const QString s_nightColorPath = QStringLiteral("/org/kde/KWin/NightLight");
0020 static const QString s_nightColorInterface = QStringLiteral("org.kde.KWin.NightLight");
0021 static const QString s_propertiesInterface = QStringLiteral("org.freedesktop.DBus.Properties");
0022 
0023 NightColorMonitorPrivate::NightColorMonitorPrivate(QObject *parent)
0024     : QObject(parent)
0025 {
0026     QDBusConnection bus = QDBusConnection::sessionBus();
0027 
0028     // clang-format off
0029     const bool connected = bus.connect(s_serviceName,
0030                                        s_nightColorPath,
0031                                        s_propertiesInterface,
0032                                        QStringLiteral("PropertiesChanged"),
0033                                        this,
0034                                        SLOT(handlePropertiesChanged(QString,QVariantMap,QStringList)));
0035     // clang-format on
0036     if (!connected) {
0037         return;
0038     }
0039 
0040     QDBusMessage message = QDBusMessage::createMethodCall(s_serviceName, s_nightColorPath, s_propertiesInterface, QStringLiteral("GetAll"));
0041     message.setArguments({s_nightColorInterface});
0042 
0043     QDBusPendingReply<QVariantMap> properties = bus.asyncCall(message);
0044     QDBusPendingCallWatcher *watcher = new QDBusPendingCallWatcher(properties, this);
0045 
0046     connect(watcher, &QDBusPendingCallWatcher::finished, this, [this](QDBusPendingCallWatcher *self) {
0047         self->deleteLater();
0048 
0049         const QDBusPendingReply<QVariantMap> properties = *self;
0050         if (properties.isError()) {
0051             return;
0052         }
0053 
0054         updateProperties(properties.value());
0055     });
0056 }
0057 
0058 NightColorMonitorPrivate::~NightColorMonitorPrivate()
0059 {
0060 }
0061 
0062 void NightColorMonitorPrivate::handlePropertiesChanged(const QString &interfaceName,
0063                                                        const QVariantMap &changedProperties,
0064                                                        const QStringList &invalidatedProperties)
0065 {
0066     Q_UNUSED(interfaceName)
0067     Q_UNUSED(invalidatedProperties)
0068 
0069     updateProperties(changedProperties);
0070 }
0071 
0072 int NightColorMonitorPrivate::currentTemperature() const
0073 {
0074     return m_currentTemperature;
0075 }
0076 
0077 int NightColorMonitorPrivate::targetTemperature() const
0078 {
0079     return m_targetTemperature;
0080 }
0081 
0082 void NightColorMonitorPrivate::updateProperties(const QVariantMap &properties)
0083 {
0084     const QVariant available = properties.value(QStringLiteral("available"));
0085     if (available.isValid()) {
0086         setAvailable(available.toBool());
0087     }
0088 
0089     const QVariant enabled = properties.value(QStringLiteral("enabled"));
0090     if (enabled.isValid()) {
0091         setEnabled(enabled.toBool());
0092     }
0093 
0094     const QVariant running = properties.value(QStringLiteral("running"));
0095     if (running.isValid()) {
0096         setRunning(running.toBool());
0097     }
0098 
0099     const QVariant mode = properties.value(QStringLiteral("mode"));
0100     if (mode.isValid()) {
0101         setMode(mode.toInt());
0102     }
0103 
0104     const QVariant daylight = properties.value(QStringLiteral("daylight"));
0105     if (daylight.isValid()) {
0106         setDaylight(daylight.toBool());
0107     }
0108 
0109     const QVariant currentTemperature = properties.value(QStringLiteral("currentTemperature"));
0110     if (currentTemperature.isValid()) {
0111         setCurrentTemperature(currentTemperature.toInt());
0112     }
0113 
0114     const QVariant targetTemperature = properties.value(QStringLiteral("targetTemperature"));
0115     if (targetTemperature.isValid()) {
0116         setTargetTemperature(targetTemperature.toInt());
0117     }
0118 
0119     const QVariant currentTransitionStartTime = properties.value(QStringLiteral("previousTransitionDateTime"));
0120     const QVariant currentTransitionDuration = properties.value(QStringLiteral("previousTransitionDuration"));
0121     if (currentTransitionStartTime.isValid() && currentTransitionDuration.isValid()) {
0122         setCurrentTransitionEndTime(currentTransitionStartTime.toULongLong() * 1000 + currentTransitionDuration.toUInt());
0123     }
0124 
0125     const QVariant scheduledTransitionStartTime = properties.value(QStringLiteral("scheduledTransitionDateTime"));
0126     if (scheduledTransitionStartTime.isValid()) {
0127         setScheduledTransitionStartTime(scheduledTransitionStartTime.toULongLong() * 1000);
0128     }
0129 }
0130 
0131 void NightColorMonitorPrivate::setCurrentTemperature(int temperature)
0132 {
0133     if (m_currentTemperature == temperature) {
0134         return;
0135     }
0136     m_currentTemperature = temperature;
0137     Q_EMIT currentTemperatureChanged();
0138 }
0139 
0140 void NightColorMonitorPrivate::setTargetTemperature(int temperature)
0141 {
0142     if (m_targetTemperature == temperature) {
0143         return;
0144     }
0145     m_targetTemperature = temperature;
0146     Q_EMIT targetTemperatureChanged();
0147 }
0148 
0149 bool NightColorMonitorPrivate::isAvailable() const
0150 {
0151     return m_isAvailable;
0152 }
0153 
0154 void NightColorMonitorPrivate::setAvailable(bool available)
0155 {
0156     if (m_isAvailable == available) {
0157         return;
0158     }
0159     m_isAvailable = available;
0160     Q_EMIT availableChanged();
0161 }
0162 
0163 bool NightColorMonitorPrivate::isEnabled() const
0164 {
0165     return m_isEnabled;
0166 }
0167 
0168 void NightColorMonitorPrivate::setEnabled(bool enabled)
0169 {
0170     if (m_isEnabled == enabled) {
0171         return;
0172     }
0173     m_isEnabled = enabled;
0174     Q_EMIT enabledChanged();
0175 }
0176 
0177 bool NightColorMonitorPrivate::isRunning() const
0178 {
0179     return m_isRunning;
0180 }
0181 
0182 void NightColorMonitorPrivate::setRunning(bool running)
0183 {
0184     if (m_isRunning == running) {
0185         return;
0186     }
0187     m_isRunning = running;
0188     Q_EMIT runningChanged();
0189 }
0190 
0191 int NightColorMonitorPrivate::mode() const
0192 {
0193     return m_mode;
0194 }
0195 
0196 void NightColorMonitorPrivate::setMode(int mode)
0197 {
0198     if (m_mode == mode) {
0199         return;
0200     }
0201     m_mode = mode;
0202     Q_EMIT modeChanged();
0203 }
0204 
0205 bool NightColorMonitorPrivate::isDaylight() const
0206 {
0207     return m_isDaylight;
0208 }
0209 
0210 void NightColorMonitorPrivate::setDaylight(bool daylight)
0211 {
0212     if (m_isDaylight == daylight) {
0213         return;
0214     }
0215     m_isDaylight = daylight;
0216     Q_EMIT daylightChanged();
0217 }
0218 
0219 quint64 NightColorMonitorPrivate::currentTransitionEndTime() const
0220 {
0221     return m_currentTransitionEndTime;
0222 }
0223 
0224 void NightColorMonitorPrivate::setCurrentTransitionEndTime(quint64 currentTransitionEndTime)
0225 {
0226     if (m_currentTransitionEndTime == currentTransitionEndTime) {
0227         return;
0228     }
0229     m_currentTransitionEndTime = currentTransitionEndTime;
0230     Q_EMIT currentTransitionEndTimeChanged();
0231 }
0232 
0233 quint64 NightColorMonitorPrivate::scheduledTransitionStartTime() const
0234 {
0235     return m_scheduledTransitionStartTime;
0236 }
0237 
0238 void NightColorMonitorPrivate::setScheduledTransitionStartTime(quint64 scheduledTransitionStartTime)
0239 {
0240     if (m_scheduledTransitionStartTime == scheduledTransitionStartTime) {
0241         return;
0242     }
0243     m_scheduledTransitionStartTime = scheduledTransitionStartTime;
0244     Q_EMIT scheduledTransitionStartTimeChanged();
0245 }
0246 
0247 NightColorMonitor::NightColorMonitor(QObject *parent)
0248     : QObject(parent)
0249     , d(new NightColorMonitorPrivate(this))
0250 {
0251     connect(d, &NightColorMonitorPrivate::availableChanged, this, &NightColorMonitor::availableChanged);
0252     connect(d, &NightColorMonitorPrivate::enabledChanged, this, &NightColorMonitor::enabledChanged);
0253     connect(d, &NightColorMonitorPrivate::runningChanged, this, &NightColorMonitor::runningChanged);
0254     connect(d, &NightColorMonitorPrivate::modeChanged, this, &NightColorMonitor::modeChanged);
0255     connect(d, &NightColorMonitorPrivate::daylightChanged, this, &NightColorMonitor::daylightChanged);
0256     connect(d, &NightColorMonitorPrivate::currentTransitionEndTimeChanged, this, &NightColorMonitor::currentTransitionEndTimeChanged);
0257     connect(d, &NightColorMonitorPrivate::scheduledTransitionStartTimeChanged, this, &NightColorMonitor::scheduledTransitionStartTimeChanged);
0258     connect(d, &NightColorMonitorPrivate::currentTemperatureChanged, this, &NightColorMonitor::currentTemperatureChanged);
0259     connect(d, &NightColorMonitorPrivate::targetTemperatureChanged, this, &NightColorMonitor::targetTemperatureChanged);
0260 }
0261 
0262 NightColorMonitor::~NightColorMonitor()
0263 {
0264 }
0265 
0266 bool NightColorMonitor::isAvailable() const
0267 {
0268     return d->isAvailable();
0269 }
0270 
0271 bool NightColorMonitor::isEnabled() const
0272 {
0273     return d->isEnabled();
0274 }
0275 
0276 bool NightColorMonitor::isRunning() const
0277 {
0278     return d->isRunning();
0279 }
0280 
0281 int NightColorMonitor::mode() const
0282 {
0283     return d->mode();
0284 }
0285 
0286 bool NightColorMonitor::isDaylight() const
0287 {
0288     return d->isDaylight();
0289 }
0290 
0291 int NightColorMonitor::currentTemperature() const
0292 {
0293     return d->currentTemperature();
0294 }
0295 
0296 int NightColorMonitor::targetTemperature() const
0297 {
0298     return d->targetTemperature();
0299 }
0300 
0301 quint64 NightColorMonitor::currentTransitionEndTime() const
0302 {
0303     return d->currentTransitionEndTime();
0304 }
0305 
0306 quint64 NightColorMonitor::scheduledTransitionStartTime() const
0307 {
0308     return d->scheduledTransitionStartTime();
0309 }