KWin
Loading...
Searching...
No Matches
nightcolordbusinterface.cpp
Go to the documentation of this file.
1/*
2 KWin - the KDE window manager
3 This file is part of the KDE project.
4
5 SPDX-FileCopyrightText: 2017 Roman Gilg <subdiff@gmail.com>
6
7 SPDX-License-Identifier: GPL-2.0-or-later
8*/
9
11#include "nightcolormanager.h"
12#include "nightlightadaptor.h"
13
14#include <QDBusMessage>
15
16namespace KWin
17{
18
20 : QObject(parent)
21 , m_manager(parent)
22 , m_inhibitorWatcher(new QDBusServiceWatcher(this))
23{
24 m_inhibitorWatcher->setConnection(QDBusConnection::sessionBus());
25 m_inhibitorWatcher->setWatchMode(QDBusServiceWatcher::WatchForUnregistration);
26 connect(m_inhibitorWatcher, &QDBusServiceWatcher::serviceUnregistered,
27 this, &NightColorDBusInterface::removeInhibitorService);
28
29 connect(m_manager, &NightColorManager::inhibitedChanged, this, [this] {
30 QVariantMap changedProperties;
31 changedProperties.insert(QStringLiteral("inhibited"), m_manager->isInhibited());
32
33 QDBusMessage message = QDBusMessage::createSignal(
34 QStringLiteral("/org/kde/KWin/NightLight"),
35 QStringLiteral("org.freedesktop.DBus.Properties"),
36 QStringLiteral("PropertiesChanged"));
37
38 message.setArguments({
39 QStringLiteral("org.kde.KWin.NightLight"),
40 changedProperties,
41 QStringList(), // invalidated_properties
42 });
43
44 QDBusConnection::sessionBus().send(message);
45 });
46
47 connect(m_manager, &NightColorManager::enabledChanged, this, [this] {
48 QVariantMap changedProperties;
49 changedProperties.insert(QStringLiteral("enabled"), m_manager->isEnabled());
50
51 QDBusMessage message = QDBusMessage::createSignal(
52 QStringLiteral("/org/kde/KWin/NightLight"),
53 QStringLiteral("org.freedesktop.DBus.Properties"),
54 QStringLiteral("PropertiesChanged"));
55
56 message.setArguments({
57 QStringLiteral("org.kde.KWin.NightLight"),
58 changedProperties,
59 QStringList(), // invalidated_properties
60 });
61
62 QDBusConnection::sessionBus().send(message);
63 });
64
65 connect(m_manager, &NightColorManager::runningChanged, this, [this] {
66 QVariantMap changedProperties;
67 changedProperties.insert(QStringLiteral("running"), m_manager->isRunning());
68
69 QDBusMessage message = QDBusMessage::createSignal(
70 QStringLiteral("/org/kde/KWin/NightLight"),
71 QStringLiteral("org.freedesktop.DBus.Properties"),
72 QStringLiteral("PropertiesChanged"));
73
74 message.setArguments({
75 QStringLiteral("org.kde.KWin.NightLight"),
76 changedProperties,
77 QStringList(), // invalidated_properties
78 });
79
80 QDBusConnection::sessionBus().send(message);
81 });
82
83 connect(m_manager, &NightColorManager::currentTemperatureChanged, this, [this] {
84 QVariantMap changedProperties;
85 changedProperties.insert(QStringLiteral("currentTemperature"), m_manager->currentTemperature());
86
87 QDBusMessage message = QDBusMessage::createSignal(
88 QStringLiteral("/org/kde/KWin/NightLight"),
89 QStringLiteral("org.freedesktop.DBus.Properties"),
90 QStringLiteral("PropertiesChanged"));
91
92 message.setArguments({
93 QStringLiteral("org.kde.KWin.NightLight"),
94 changedProperties,
95 QStringList(), // invalidated_properties
96 });
97
98 QDBusConnection::sessionBus().send(message);
99 });
100
101 connect(m_manager, &NightColorManager::targetTemperatureChanged, this, [this] {
102 QVariantMap changedProperties;
103 changedProperties.insert(QStringLiteral("targetTemperature"), m_manager->targetTemperature());
104
105 QDBusMessage message = QDBusMessage::createSignal(
106 QStringLiteral("/org/kde/KWin/NightLight"),
107 QStringLiteral("org.freedesktop.DBus.Properties"),
108 QStringLiteral("PropertiesChanged"));
109
110 message.setArguments({
111 QStringLiteral("org.kde.KWin.NightLight"),
112 changedProperties,
113 QStringList(), // invalidated_properties
114 });
115
116 QDBusConnection::sessionBus().send(message);
117 });
118
119 connect(m_manager, &NightColorManager::modeChanged, this, [this] {
120 QVariantMap changedProperties;
121 changedProperties.insert(QStringLiteral("mode"), uint(m_manager->mode()));
122
123 QDBusMessage message = QDBusMessage::createSignal(
124 QStringLiteral("/org/kde/KWin/NightLight"),
125 QStringLiteral("org.freedesktop.DBus.Properties"),
126 QStringLiteral("PropertiesChanged"));
127
128 message.setArguments({
129 QStringLiteral("org.kde.KWin.NightLight"),
130 changedProperties,
131 QStringList(), // invalidated_properties
132 });
133
134 QDBusConnection::sessionBus().send(message);
135 });
136
137 connect(m_manager, &NightColorManager::daylightChanged, this, [this] {
138 QVariantMap changedProperties;
139 changedProperties.insert(QStringLiteral("daylight"), uint(m_manager->daylight()));
140
141 QDBusMessage message = QDBusMessage::createSignal(
142 QStringLiteral("/org/kde/KWin/NightLight"),
143 QStringLiteral("org.freedesktop.DBus.Properties"),
144 QStringLiteral("PropertiesChanged"));
145
146 message.setArguments({
147 QStringLiteral("org.kde.KWin.NightLight"),
148 changedProperties,
149 QStringList(), // invalidated_properties
150 });
151
152 QDBusConnection::sessionBus().send(message);
153 });
154
155 connect(m_manager, &NightColorManager::previousTransitionTimingsChanged, this, [this] {
156 QVariantMap changedProperties;
157 changedProperties.insert(QStringLiteral("previousTransitionDateTime"), previousTransitionDateTime());
158 changedProperties.insert(QStringLiteral("previousTransitionDuration"), previousTransitionDuration());
159
160 QDBusMessage message = QDBusMessage::createSignal(
161 QStringLiteral("/org/kde/KWin/NightLight"),
162 QStringLiteral("org.freedesktop.DBus.Properties"),
163 QStringLiteral("PropertiesChanged"));
164
165 message.setArguments({
166 QStringLiteral("org.kde.KWin.NightLight"),
167 changedProperties,
168 QStringList(), // invalidated_properties
169 });
170
171 QDBusConnection::sessionBus().send(message);
172 });
173
174 connect(m_manager, &NightColorManager::scheduledTransitionTimingsChanged, this, [this] {
175 QVariantMap changedProperties;
176 changedProperties.insert(QStringLiteral("scheduledTransitionDateTime"), scheduledTransitionDateTime());
177 changedProperties.insert(QStringLiteral("scheduledTransitionDuration"), scheduledTransitionDuration());
178
179 QDBusMessage message = QDBusMessage::createSignal(
180 QStringLiteral("/org/kde/KWin/NightLight"),
181 QStringLiteral("org.freedesktop.DBus.Properties"),
182 QStringLiteral("PropertiesChanged"));
183
184 message.setArguments({
185 QStringLiteral("org.kde.KWin.NightLight"),
186 changedProperties,
187 QStringList(), // invalidated_properties
188 });
189
190 QDBusConnection::sessionBus().send(message);
191 });
192
193 new NightLightAdaptor(this);
194 QDBusConnection::sessionBus().registerObject(QStringLiteral("/org/kde/KWin/NightLight"), this);
195 QDBusConnection::sessionBus().registerService(QStringLiteral("org.kde.KWin.NightLight"));
196}
197
199{
200 QDBusConnection::sessionBus().unregisterService(QStringLiteral("org.kde.KWin.NightLight"));
201}
202
204{
205 return m_manager->isInhibited();
206}
207
209{
210 return m_manager->isEnabled();
211}
212
214{
215 return m_manager->isRunning();
216}
217
219{
220 return true; // TODO: Night color should register its own dbus service instead.
221}
222
224{
225 return m_manager->currentTemperature();
226}
227
229{
230 return m_manager->targetTemperature();
231}
232
234{
235 return m_manager->mode();
236}
237
239{
240 return m_manager->daylight();
241}
242
244{
245 const QDateTime dateTime = m_manager->previousTransitionDateTime();
246 if (dateTime.isValid()) {
247 return quint64(dateTime.toSecsSinceEpoch());
248 }
249 return 0;
250}
251
253{
254 return quint32(m_manager->previousTransitionDuration());
255}
256
258{
259 const QDateTime dateTime = m_manager->scheduledTransitionDateTime();
260 if (dateTime.isValid()) {
261 return quint64(dateTime.toSecsSinceEpoch());
262 }
263 return 0;
264}
265
267{
268 return quint32(m_manager->scheduledTransitionDuration());
269}
270
271void NightColorDBusInterface::setLocation(double latitude, double longitude)
272{
273 m_manager->autoLocationUpdate(latitude, longitude);
274}
275
277{
278 const QString serviceName = QDBusContext::message().service();
279
280 if (!m_inhibitors.contains(serviceName)) {
281 m_inhibitorWatcher->addWatchedService(serviceName);
282 }
283
284 m_inhibitors.insert(serviceName, ++m_lastInhibitionCookie);
285
286 m_manager->inhibit();
287
288 return m_lastInhibitionCookie;
289}
290
292{
293 const QString serviceName = QDBusContext::message().service();
294
295 uninhibit(serviceName, cookie);
296}
297
298void NightColorDBusInterface::uninhibit(const QString &serviceName, uint cookie)
299{
300 const int removedCount = m_inhibitors.remove(serviceName, cookie);
301 if (!removedCount) {
302 return;
303 }
304
305 if (!m_inhibitors.contains(serviceName)) {
306 m_inhibitorWatcher->removeWatchedService(serviceName);
307 }
308
309 m_manager->uninhibit();
310}
311
312void NightColorDBusInterface::removeInhibitorService(const QString &serviceName)
313{
314 const auto cookies = m_inhibitors.values(serviceName);
315 for (const uint &cookie : cookies) {
316 uninhibit(serviceName, cookie);
317 }
318}
319
321{
322 m_manager->preview(previewTemp);
323}
324
326{
327 m_manager->stopPreview();
328}
329
330}
331
332#include "moc_nightcolordbusinterface.cpp"
uint inhibit()
Temporarily blocks Night Color.
NightColorDBusInterface(NightColorManager *parent)
void uninhibit(uint cookie)
Cancels the previous call to inhibit().
void stopPreview()
Stops an ongoing preview.
void preview(uint temperature)
Previews a given temperature for a short time (15s).
void setLocation(double latitude, double longitude)
For receiving auto location updates, primarily through the KDE Daemon.
NightColorMode mode() const
QDateTime previousTransitionDateTime() const
qint64 previousTransitionDuration() const
void scheduledTransitionTimingsChanged()
QDateTime scheduledTransitionDateTime() const
void autoLocationUpdate(double latitude, double longitude)
qint64 scheduledTransitionDuration() const
void previousTransitionTimingsChanged()
void preview(uint previewTemp)