From 1f0db0efc64e4866fdcfa4f64b7679f4de8d87bb Mon Sep 17 00:00:00 2001 From: Devin Lin Date: Tue, 4 Jan 2022 12:12:46 -0500 Subject: [PATCH] quicksettings/nightcolor: Fix night color --- CMakeLists.txt | 4 +- quicksettings/CMakeLists.txt | 5 + quicksettings/nightcolor/CMakeLists.txt | 49 ++++++++ .../dbus/org.kde.kwin.ColorCorrect.xml | 109 ++++++++++++++++++ quicksettings/nightcolor/enum.h | 40 +++++++ quicksettings/nightcolor/nightcolorplugin.cpp | 23 ++++ quicksettings/nightcolor/nightcolorplugin.h | 21 ++++ .../nightcolor/nightcolorsettings.kcfg | 65 +++++++++++ .../nightcolor/nightcolorsettings.kcfgc | 14 +++ quicksettings/nightcolor/nightcolorutil.cpp | 53 +++++++++ quicksettings/nightcolor/nightcolorutil.h | 35 ++++++ .../{ => package}/contents/ui/main.qml | 15 +-- .../nightcolor/{ => package}/metadata.desktop | 0 quicksettings/nightcolor/qmldir | 6 + 14 files changed, 424 insertions(+), 15 deletions(-) create mode 100644 quicksettings/CMakeLists.txt create mode 100644 quicksettings/nightcolor/CMakeLists.txt create mode 100644 quicksettings/nightcolor/dbus/org.kde.kwin.ColorCorrect.xml create mode 100644 quicksettings/nightcolor/enum.h create mode 100644 quicksettings/nightcolor/nightcolorplugin.cpp create mode 100644 quicksettings/nightcolor/nightcolorplugin.h create mode 100644 quicksettings/nightcolor/nightcolorsettings.kcfg create mode 100644 quicksettings/nightcolor/nightcolorsettings.kcfgc create mode 100644 quicksettings/nightcolor/nightcolorutil.cpp create mode 100644 quicksettings/nightcolor/nightcolorutil.h rename quicksettings/nightcolor/{ => package}/contents/ui/main.qml (56%) rename quicksettings/nightcolor/{ => package}/metadata.desktop (100%) create mode 100644 quicksettings/nightcolor/qmldir diff --git a/CMakeLists.txt b/CMakeLists.txt index ec8ec924..0439ba00 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -58,16 +58,14 @@ include(CheckIncludeFiles) plasma_install_package(look-and-feel org.kde.plasma.phone look-and-feel) plasma_install_package(shell org.kde.plasma.phoneshell shells) -plasma_install_package(quicksettings/nightcolor org.kde.plasma.nightcolor quicksettings) -plasma_install_package(quicksettings/airplanemode org.kde.plasma.airplanemode quicksettings) install(FILES plasma_phone_components.notifyrc DESTINATION ${KNOTIFYRC_INSTALL_DIR}) - add_subdirectory(bin) add_subdirectory(applets) add_subdirectory(containments) add_subdirectory(components) +add_subdirectory(quicksettings) find_program(PlasmaOpenSettings plasma-open-settings) set_package_properties(PlasmaOpenSettings PROPERTIES diff --git a/quicksettings/CMakeLists.txt b/quicksettings/CMakeLists.txt new file mode 100644 index 00000000..f25fe9ec --- /dev/null +++ b/quicksettings/CMakeLists.txt @@ -0,0 +1,5 @@ +# SPDX-FileCopyrightText: 2022 Devin Lin +# SPDX-License-Identifier: GPL-2.0-or-later + +plasma_install_package(airplanemode org.kde.plasma.airplanemode quicksettings) +add_subdirectory(nightcolor) diff --git a/quicksettings/nightcolor/CMakeLists.txt b/quicksettings/nightcolor/CMakeLists.txt new file mode 100644 index 00000000..9f890732 --- /dev/null +++ b/quicksettings/nightcolor/CMakeLists.txt @@ -0,0 +1,49 @@ +# SPDX-FileCopyrightText: 2022 Devin Lin +# SPDX-License-Identifier: GPL-2.0-or-later + +set_source_files_properties(dbus/org.kde.kwin.ColorCorrect.xml PROPERTIES NO_NAMESPACE TRUE) +qt_add_dbus_interfaces(DBUS_SRCS dbus/org.kde.kwin.ColorCorrect.xml) + +set(nightcolorplugin_SRCS + nightcolorplugin.cpp + nightcolorutil.cpp + enum.h + ${DBUS_SRCS} +) + +kconfig_add_kcfg_files(nightcolorplugin_SRCS nightcolorsettings.kcfgc GENERATE_MOC) + +add_library(nightcolorplugin ${nightcolorplugin_SRCS}) + +find_package(KF5 ${KF5_MIN_VERSION} REQUIRED COMPONENTS + Config + Declarative +) + +target_link_libraries(nightcolorplugin + PUBLIC + Qt::Core + PRIVATE + Qt::DBus + Qt::Qml + Qt::Gui + Qt::Quick + KF5::Plasma + KF5::I18n + KF5::Notifications + KF5::PlasmaQuick + KF5::WaylandClient + KF5::Service + KF5::CoreAddons + KF5::QuickAddons + KF5::ConfigCore + KF5::ConfigGui + ) + +set_property(TARGET nightcolorplugin PROPERTY LIBRARY_OUTPUT_DIRECTORY ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/org/kde/plasma/quicksetting/nightcolor) +file(COPY qmldir DESTINATION ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/org/kde/plasma/quicksetting/nightcolor) + +install(TARGETS nightcolorplugin DESTINATION ${QML_INSTALL_DIR}/org/kde/plasma/quicksetting/nightcolor) +install(FILES qmldir ${qml_SRC} DESTINATION ${QML_INSTALL_DIR}/org/kde/plasma/quicksetting/nightcolor) + +plasma_install_package(package org.kde.plasma.nightcolor quicksettings) diff --git a/quicksettings/nightcolor/dbus/org.kde.kwin.ColorCorrect.xml b/quicksettings/nightcolor/dbus/org.kde.kwin.ColorCorrect.xml new file mode 100644 index 00000000..ee0cb112 --- /dev/null +++ b/quicksettings/nightcolor/dbus/org.kde.kwin.ColorCorrect.xml @@ -0,0 +1,109 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/quicksettings/nightcolor/enum.h b/quicksettings/nightcolor/enum.h new file mode 100644 index 00000000..fae55f84 --- /dev/null +++ b/quicksettings/nightcolor/enum.h @@ -0,0 +1,40 @@ +/* +SPDX-FileCopyrightText: 2021 Benjamin Port + +SPDX-License-Identifier: GPL-2.0-or-later +*/ + +#pragma once + +#include + +namespace ColorCorrect +{ +Q_NAMESPACE +enum NightColorMode { + /** + * Color temperature is computed based on the current position of the Sun. + * + * Location of the user is provided by Plasma. + */ + Automatic, + /** + * Color temperature is computed based on the current position of the Sun. + * + * Location of the user is provided by themselves. + */ + Location, + /** + * Color temperature is computed based on the current time. + * + * Sunrise and sunset times have to be specified by the user. + */ + Timings, + /** + * Color temperature is constant thoughout the day. + */ + Constant, +}; + +Q_ENUM_NS(NightColorMode) +} diff --git a/quicksettings/nightcolor/nightcolorplugin.cpp b/quicksettings/nightcolor/nightcolorplugin.cpp new file mode 100644 index 00000000..70a6793d --- /dev/null +++ b/quicksettings/nightcolor/nightcolorplugin.cpp @@ -0,0 +1,23 @@ +/* + * SPDX-FileCopyrightText: 2022 by Devin Lin + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#include "nightcolorplugin.h" + +#include +#include + +#include "nightcolorutil.h" + +void NightColorPlugin::registerTypes(const char *uri) +{ + Q_ASSERT(QLatin1String(uri) == QLatin1String("org.kde.plasma.quicksetting.nightcolor")); + + qmlRegisterSingletonType(uri, 1, 0, "NightColorUtil", [](QQmlEngine *, QJSEngine *) { + return new NightColorUtil; + }); +} + +//#include "moc_nightcolorplugin.cpp" diff --git a/quicksettings/nightcolor/nightcolorplugin.h b/quicksettings/nightcolor/nightcolorplugin.h new file mode 100644 index 00000000..f59d4f7a --- /dev/null +++ b/quicksettings/nightcolor/nightcolorplugin.h @@ -0,0 +1,21 @@ +/* + * SPDX-FileCopyrightText: 2022 by Devin Lin + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#pragma once + +#include + +#include +#include + +class NightColorPlugin : public QQmlExtensionPlugin +{ + Q_OBJECT + Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface") + +public: + void registerTypes(const char *uri) override; +}; diff --git a/quicksettings/nightcolor/nightcolorsettings.kcfg b/quicksettings/nightcolor/nightcolorsettings.kcfg new file mode 100644 index 00000000..313a9bd1 --- /dev/null +++ b/quicksettings/nightcolor/nightcolorsettings.kcfg @@ -0,0 +1,65 @@ + + + + + + + + + true + + + false + + + true + + + + + + + + + Automatic + + + true + + + 4500 + 1000 + 6500 + + + 0. + + + 0. + + + true + + + 0. + + + 0. + + + 0600 + + + 1800 + + + 30 + + + diff --git a/quicksettings/nightcolor/nightcolorsettings.kcfgc b/quicksettings/nightcolor/nightcolorsettings.kcfgc new file mode 100644 index 00000000..4625928e --- /dev/null +++ b/quicksettings/nightcolor/nightcolorsettings.kcfgc @@ -0,0 +1,14 @@ +# SPDX-FileCopyrightText: 2020 Vlad Zahorodnii +# SPDX-License-Identifier: GPL-2.0-or-later + +File=nightcolorsettings.kcfg +Namespace=ColorCorrect +ClassName=NightColorSettings +Mutators=true +# nightcolormanager.h is needed for NightColorMode +IncludeFiles=enum.h +UseEnumTypes=true +DefaultValueGetters=true +GenerateProperties=true +ParentInConstructor=true +Notifiers=true diff --git a/quicksettings/nightcolor/nightcolorutil.cpp b/quicksettings/nightcolor/nightcolorutil.cpp new file mode 100644 index 00000000..a1d6e92a --- /dev/null +++ b/quicksettings/nightcolor/nightcolorutil.cpp @@ -0,0 +1,53 @@ +/* + * SPDX-FileCopyrightText: 2022 by Devin Lin + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#include "nightcolorutil.h" + +NightColorUtil::NightColorUtil(QObject *parent) + : QObject{parent} + , m_ccInterface{new OrgKdeKwinColorCorrectInterface(QStringLiteral("org.kde.KWin"), QStringLiteral("/ColorCorrect"), QDBusConnection::sessionBus(), this)} + , m_settings{new NightColorSettings(this)} +{ + if (!m_ccInterface->isValid()) { + qWarning() << "Can't connect to nightcolor over DBus!"; + } else { + m_enabled = m_ccInterface->running(); + + // subscribe to property updates + QDBusConnection::sessionBus().connect(QStringLiteral("org.kde.KWin"), + QStringLiteral("/ColorCorrect"), + QStringLiteral("org.freedesktop.DBus.Properties"), + QStringLiteral("PropertiesChanged"), + this, + SLOT(enabledUpdated(QString, QVariantMap, QStringList))); + } +} + +bool NightColorUtil::enabled() +{ + return m_enabled; +} + +void NightColorUtil::setEnabled(bool enabled) +{ + m_settings->setModeEnabled(true); + m_settings->setMode(ColorCorrect::NightColorMode::Constant); + m_settings->setActiveEnabled(true); + m_settings->setActive(enabled); + m_settings->save(); +} + +void NightColorUtil::enabledUpdated(QString name, QVariantMap map, QStringList list) +{ + Q_UNUSED(name); + Q_UNUSED(map); + Q_UNUSED(list); + bool running = m_ccInterface->running(); + if (running != m_enabled) { + m_enabled = running; + Q_EMIT enabledChanged(); + } +} diff --git a/quicksettings/nightcolor/nightcolorutil.h b/quicksettings/nightcolor/nightcolorutil.h new file mode 100644 index 00000000..25c4817f --- /dev/null +++ b/quicksettings/nightcolor/nightcolorutil.h @@ -0,0 +1,35 @@ +/* + * SPDX-FileCopyrightText: 2022 by Devin Lin + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#pragma once + +#include + +#include "colorcorrectinterface.h" +#include "nightcolorsettings.h" + +class NightColorUtil : public QObject +{ + Q_OBJECT + Q_PROPERTY(bool enabled READ enabled WRITE setEnabled NOTIFY enabledChanged) + +public: + NightColorUtil(QObject *parent = nullptr); + + bool enabled(); + void setEnabled(bool enabled); + +Q_SIGNALS: + void enabledChanged(); + +public Q_SLOTS: + void enabledUpdated(QString name, QVariantMap map, QStringList list); + +private: + bool m_enabled; + OrgKdeKwinColorCorrectInterface *m_ccInterface; + NightColorSettings *m_settings; +}; diff --git a/quicksettings/nightcolor/contents/ui/main.qml b/quicksettings/nightcolor/package/contents/ui/main.qml similarity index 56% rename from quicksettings/nightcolor/contents/ui/main.qml rename to quicksettings/nightcolor/package/contents/ui/main.qml index dc8f080e..5b18b63c 100644 --- a/quicksettings/nightcolor/contents/ui/main.qml +++ b/quicksettings/nightcolor/package/contents/ui/main.qml @@ -8,25 +8,16 @@ import org.kde.colorcorrect 0.1 as CC import org.kde.plasma.private.mobileshell 1.0 as MobileShell +import org.kde.plasma.quicksetting.nightcolor 1.0 as NightColor MobileShell.QuickSetting { text: i18n("Night Color") icon: "redshift-status-on" - enabled: compositorAdaptor.active + enabled: NightColor.NightColorUtil.enabled status: "" settingsCommand: "plasma-open-settings kcm_nightcolor" - CC.CompositorAdaptor { - id: compositorAdaptor - } function toggle() { - if (compositorAdaptor.active) { - compositorAdaptor.activeStaged = false; - } else { - compositorAdaptor.activeStaged = true; - compositorAdaptor.modeStaged = 3; // always on - } - compositorAdaptor.sendConfigurationAll(); - enabled = compositorAdaptor.active; + NightColor.NightColorUtil.enabled = !enabled; } } diff --git a/quicksettings/nightcolor/metadata.desktop b/quicksettings/nightcolor/package/metadata.desktop similarity index 100% rename from quicksettings/nightcolor/metadata.desktop rename to quicksettings/nightcolor/package/metadata.desktop diff --git a/quicksettings/nightcolor/qmldir b/quicksettings/nightcolor/qmldir new file mode 100644 index 00000000..9de8d007 --- /dev/null +++ b/quicksettings/nightcolor/qmldir @@ -0,0 +1,6 @@ +# SPDX-FileCopyrightText: 2022 Devin Lin +# SPDX-License-Identifier: GPL-2.0-or-later + +module org.kde.plasma.quicksetting.nightcolor +plugin nightcolorplugin +classname NightColorPlugin