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 }