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 }