kwin/colorcorrection/colorcorrectdbusinterface.cpp

313 lines
9.5 KiB
C++

/*
KWin - the KDE window manager
This file is part of the KDE project.
SPDX-FileCopyrightText: 2017 Roman Gilg <subdiff@gmail.com>
SPDX-License-Identifier: GPL-2.0-or-later
*/
#include "colorcorrectdbusinterface.h"
#include "colorcorrectadaptor.h"
#include "manager.h"
#include <QDBusMessage>
namespace KWin {
namespace ColorCorrect {
ColorCorrectDBusInterface::ColorCorrectDBusInterface(Manager *parent)
: QObject(parent)
, m_manager(parent)
, m_inhibitorWatcher(new QDBusServiceWatcher(this))
{
m_inhibitorWatcher->setConnection(QDBusConnection::sessionBus());
m_inhibitorWatcher->setWatchMode(QDBusServiceWatcher::WatchForUnregistration);
connect(m_inhibitorWatcher, &QDBusServiceWatcher::serviceUnregistered,
this, &ColorCorrectDBusInterface::removeInhibitorService);
connect(m_manager, &Manager::inhibitedChanged, this, [this] {
QVariantMap changedProperties;
changedProperties.insert(QStringLiteral("inhibited"), m_manager->isInhibited());
QDBusMessage message = QDBusMessage::createSignal(
QStringLiteral("/ColorCorrect"),
QStringLiteral("org.freedesktop.DBus.Properties"),
QStringLiteral("PropertiesChanged")
);
message.setArguments({
QStringLiteral("org.kde.kwin.ColorCorrect"),
changedProperties,
QStringList(), // invalidated_properties
});
QDBusConnection::sessionBus().send(message);
});
connect(m_manager, &Manager::enabledChanged, this, [this] {
QVariantMap changedProperties;
changedProperties.insert(QStringLiteral("enabled"), m_manager->isEnabled());
QDBusMessage message = QDBusMessage::createSignal(
QStringLiteral("/ColorCorrect"),
QStringLiteral("org.freedesktop.DBus.Properties"),
QStringLiteral("PropertiesChanged")
);
message.setArguments({
QStringLiteral("org.kde.kwin.ColorCorrect"),
changedProperties,
QStringList(), // invalidated_properties
});
QDBusConnection::sessionBus().send(message);
});
connect(m_manager, &Manager::runningChanged, this, [this] {
QVariantMap changedProperties;
changedProperties.insert(QStringLiteral("running"), m_manager->isRunning());
QDBusMessage message = QDBusMessage::createSignal(
QStringLiteral("/ColorCorrect"),
QStringLiteral("org.freedesktop.DBus.Properties"),
QStringLiteral("PropertiesChanged")
);
message.setArguments({
QStringLiteral("org.kde.kwin.ColorCorrect"),
changedProperties,
QStringList(), // invalidated_properties
});
QDBusConnection::sessionBus().send(message);
});
connect(m_manager, &Manager::currentTemperatureChanged, this, [this] {
QVariantMap changedProperties;
changedProperties.insert(QStringLiteral("currentTemperature"), m_manager->currentTemperature());
QDBusMessage message = QDBusMessage::createSignal(
QStringLiteral("/ColorCorrect"),
QStringLiteral("org.freedesktop.DBus.Properties"),
QStringLiteral("PropertiesChanged")
);
message.setArguments({
QStringLiteral("org.kde.kwin.ColorCorrect"),
changedProperties,
QStringList(), // invalidated_properties
});
QDBusConnection::sessionBus().send(message);
});
connect(m_manager, &Manager::targetTemperatureChanged, this, [this] {
QVariantMap changedProperties;
changedProperties.insert(QStringLiteral("targetTemperature"), m_manager->targetTemperature());
QDBusMessage message = QDBusMessage::createSignal(
QStringLiteral("/ColorCorrect"),
QStringLiteral("org.freedesktop.DBus.Properties"),
QStringLiteral("PropertiesChanged")
);
message.setArguments({
QStringLiteral("org.kde.kwin.ColorCorrect"),
changedProperties,
QStringList(), // invalidated_properties
});
QDBusConnection::sessionBus().send(message);
});
connect(m_manager, &Manager::modeChanged, this, [this] {
QVariantMap changedProperties;
changedProperties.insert(QStringLiteral("mode"), uint(m_manager->mode()));
QDBusMessage message = QDBusMessage::createSignal(
QStringLiteral("/ColorCorrect"),
QStringLiteral("org.freedesktop.DBus.Properties"),
QStringLiteral("PropertiesChanged")
);
message.setArguments({
QStringLiteral("org.kde.kwin.ColorCorrect"),
changedProperties,
QStringList(), // invalidated_properties
});
QDBusConnection::sessionBus().send(message);
});
connect(m_manager, &Manager::previousTransitionTimingsChanged, this, [this] {
QVariantMap changedProperties;
changedProperties.insert(QStringLiteral("previousTransitionDateTime"), previousTransitionDateTime());
changedProperties.insert(QStringLiteral("previousTransitionDuration"), previousTransitionDuration());
QDBusMessage message = QDBusMessage::createSignal(
QStringLiteral("/ColorCorrect"),
QStringLiteral("org.freedesktop.DBus.Properties"),
QStringLiteral("PropertiesChanged")
);
message.setArguments({
QStringLiteral("org.kde.kwin.ColorCorrect"),
changedProperties,
QStringList(), // invalidated_properties
});
QDBusConnection::sessionBus().send(message);
});
connect(m_manager, &Manager::scheduledTransitionTimingsChanged, this, [this] {
QVariantMap changedProperties;
changedProperties.insert(QStringLiteral("scheduledTransitionDateTime"), scheduledTransitionDateTime());
changedProperties.insert(QStringLiteral("scheduledTransitionDuration"), scheduledTransitionDuration());
QDBusMessage message = QDBusMessage::createSignal(
QStringLiteral("/ColorCorrect"),
QStringLiteral("org.freedesktop.DBus.Properties"),
QStringLiteral("PropertiesChanged")
);
message.setArguments({
QStringLiteral("org.kde.kwin.ColorCorrect"),
changedProperties,
QStringList(), // invalidated_properties
});
QDBusConnection::sessionBus().send(message);
});
connect(m_manager, &Manager::configChange, this, &ColorCorrectDBusInterface::nightColorConfigChanged);
new ColorCorrectAdaptor(this);
QDBusConnection::sessionBus().registerObject(QStringLiteral("/ColorCorrect"), this);
}
bool ColorCorrectDBusInterface::isInhibited() const
{
return m_manager->isInhibited();
}
bool ColorCorrectDBusInterface::isEnabled() const
{
return m_manager->isEnabled();
}
bool ColorCorrectDBusInterface::isRunning() const
{
return m_manager->isRunning();
}
bool ColorCorrectDBusInterface::isAvailable() const
{
return m_manager->isAvailable();
}
int ColorCorrectDBusInterface::currentTemperature() const
{
return m_manager->currentTemperature();
}
int ColorCorrectDBusInterface::targetTemperature() const
{
return m_manager->targetTemperature();
}
int ColorCorrectDBusInterface::mode() const
{
return m_manager->mode();
}
quint64 ColorCorrectDBusInterface::previousTransitionDateTime() const
{
const QDateTime dateTime = m_manager->previousTransitionDateTime();
if (dateTime.isValid()) {
return quint64(dateTime.toSecsSinceEpoch());
}
return 0;
}
quint32 ColorCorrectDBusInterface::previousTransitionDuration() const
{
return quint32(m_manager->previousTransitionDuration());
}
quint64 ColorCorrectDBusInterface::scheduledTransitionDateTime() const
{
const QDateTime dateTime = m_manager->scheduledTransitionDateTime();
if (dateTime.isValid()) {
return quint64(dateTime.toSecsSinceEpoch());
}
return 0;
}
quint32 ColorCorrectDBusInterface::scheduledTransitionDuration() const
{
return quint32(m_manager->scheduledTransitionDuration());
}
QHash<QString, QVariant> ColorCorrectDBusInterface::nightColorInfo()
{
return m_manager->info();
}
bool ColorCorrectDBusInterface::setNightColorConfig(QHash<QString, QVariant> data)
{
return m_manager->changeConfiguration(data);
}
void ColorCorrectDBusInterface::nightColorAutoLocationUpdate(double latitude, double longitude)
{
m_manager->autoLocationUpdate(latitude, longitude);
}
uint ColorCorrectDBusInterface::inhibit()
{
const QString serviceName = QDBusContext::message().service();
if (!m_inhibitors.contains(serviceName)) {
m_inhibitorWatcher->addWatchedService(serviceName);
}
m_inhibitors.insert(serviceName, ++m_lastInhibitionCookie);
m_manager->inhibit();
return m_lastInhibitionCookie;
}
void ColorCorrectDBusInterface::uninhibit(uint cookie)
{
const QString serviceName = QDBusContext::message().service();
uninhibit(serviceName, cookie);
}
void ColorCorrectDBusInterface::uninhibit(const QString &serviceName, uint cookie)
{
const int removedCount = m_inhibitors.remove(serviceName, cookie);
if (!removedCount) {
return;
}
if (!m_inhibitors.contains(serviceName)) {
m_inhibitorWatcher->removeWatchedService(serviceName);
}
m_manager->uninhibit();
}
void ColorCorrectDBusInterface::removeInhibitorService(const QString &serviceName)
{
const auto cookies = m_inhibitors.values(serviceName);
for (const uint &cookie : cookies) {
uninhibit(serviceName, cookie);
}
}
}
}