diff --git a/kwin/CMakeLists.txt b/kwin/CMakeLists.txt index 4f5969d..c3df9a4 100644 --- a/kwin/CMakeLists.txt +++ b/kwin/CMakeLists.txt @@ -26,6 +26,8 @@ include(cmake/qtversion.cmake) # required frameworks by Core find_package(KF${QT_MAJOR_VERSION} ${KF_MIN_VERSION} REQUIRED COMPONENTS + Config + ConfigWidgets CoreAddons GlobalAccel I18n diff --git a/kwin/src/CMakeLists.txt b/kwin/src/CMakeLists.txt index ae9930f..e645c19 100644 --- a/kwin/src/CMakeLists.txt +++ b/kwin/src/CMakeLists.txt @@ -1,8 +1,11 @@ +add_subdirectory(kcm) + kcoreaddons_add_plugin(breezy_desktop_effect INSTALL_NAMESPACE "kwin/effects/plugins/") target_sources(breezy_desktop_effect PRIVATE breezydesktopeffect.cpp main.cpp ) +kconfig_add_kcfg_files(breezy_desktop_effect cubeconfig.kcfgc) target_include_directories(breezy_desktop_effect PRIVATE /usr/include/kwin) target_link_libraries(breezy_desktop_effect @@ -10,6 +13,8 @@ target_link_libraries(breezy_desktop_effect Qt6::Gui Qt6::Quick + KF6::ConfigCore + KF6::ConfigGui KF6::CoreAddons KF6::GlobalAccel KF6::I18n diff --git a/kwin/src/breezydesktopeffect.cpp b/kwin/src/breezydesktopeffect.cpp index f56afa1..adc5e90 100644 --- a/kwin/src/breezydesktopeffect.cpp +++ b/kwin/src/breezydesktopeffect.cpp @@ -1,4 +1,5 @@ #include "breezydesktopeffect.h" +#include "cubeconfig.h" #include "effect/effect.h" #include "effect/effecthandler.h" #include "opengl/glutils.h" @@ -51,6 +52,7 @@ BreezyDesktopEffect::BreezyDesktopEffect() connect(effects, &EffectsHandler::cursorShapeChanged, this, &BreezyDesktopEffect::updateCursorImage); updateCursorImage(); + reconfigure(ReconfigureAll); setSource(QUrl::fromLocalFile(QStandardPaths::locate(QStandardPaths::GenericDataLocation, QStringLiteral("kwin/effects/breezy_desktop/qml/main.qml")))); @@ -66,6 +68,11 @@ BreezyDesktopEffect::BreezyDesktopEffect() m_cursorUpdateTimer->start(); } +void BreezyDesktopEffect::reconfigure(ReconfigureFlags) +{ + CubeConfig::self()->read(); +} + QVariantMap BreezyDesktopEffect::initialProperties(Output *screen) { return QVariantMap{ diff --git a/kwin/src/breezydesktopeffect.h b/kwin/src/breezydesktopeffect.h index e357876..e2a34b6 100644 --- a/kwin/src/breezydesktopeffect.h +++ b/kwin/src/breezydesktopeffect.h @@ -34,6 +34,8 @@ namespace KWin BreezyDesktopEffect(); + void reconfigure(ReconfigureFlags) override; + int requestedEffectChainPosition() const override; int animationDuration() const; diff --git a/kwin/src/cubeconfig.kcfg b/kwin/src/cubeconfig.kcfg new file mode 100644 index 0000000..57e83db --- /dev/null +++ b/kwin/src/cubeconfig.kcfg @@ -0,0 +1,9 @@ + + + + + + diff --git a/kwin/src/cubeconfig.kcfgc b/kwin/src/cubeconfig.kcfgc new file mode 100644 index 0000000..4c28cf9 --- /dev/null +++ b/kwin/src/cubeconfig.kcfgc @@ -0,0 +1,4 @@ +File=cubeconfig.kcfg +ClassName=CubeConfig +Singleton=true +Mutators=true diff --git a/kwin/src/kcm/CMakeLists.txt b/kwin/src/kcm/CMakeLists.txt new file mode 100644 index 0000000..9a6df2a --- /dev/null +++ b/kwin/src/kcm/CMakeLists.txt @@ -0,0 +1,20 @@ +# SPDX-FileCopyrightText: 2022 Vlad Zahorodnii +# +# SPDX-License-Identifier: BSD-3-Clause + +set(breezy_desktop_config_SOURCES cubeeffectkcm.cpp) +ki18n_wrap_ui(breezy_desktop_config_SOURCES cubeeffectkcm.ui) +qt_add_dbus_interface(breezy_desktop_config_SOURCES ${KWIN_EFFECTS_INTERFACE} kwineffects_interface) + +kcoreaddons_add_plugin(breezy_desktop_config INSTALL_NAMESPACE "kwin/effects/configs" SOURCES ${breezy_desktop_config_SOURCES}) +kconfig_add_kcfg_files(breezy_desktop_config ../cubeconfig.kcfgc) +target_link_libraries(breezy_desktop_config + KF6::ConfigCore + KF6::ConfigGui + KF6::ConfigWidgets + KF6::CoreAddons + KF6::GlobalAccel + KF6::I18n + KF6::KCMUtils + KF6::XmlGui +) diff --git a/kwin/src/kcm/cubeeffectkcm.cpp b/kwin/src/kcm/cubeeffectkcm.cpp new file mode 100644 index 0000000..c61dfa1 --- /dev/null +++ b/kwin/src/kcm/cubeeffectkcm.cpp @@ -0,0 +1,74 @@ +/* + SPDX-FileCopyrightText: 2022 Vlad Zahorodnii + + SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL +*/ + +#include "cubeeffectkcm.h" +#include "cubeconfig.h" + +#include + +#include +#include +#include +#include + +#include +#include + +K_PLUGIN_CLASS(CubeEffectConfig) + +CubeEffectConfig::CubeEffectConfig(QObject *parent, const KPluginMetaData &data, const QVariantList &args) + : KCModule(parent, data) +{ + ui.setupUi(widget()); + addConfig(CubeConfig::self(), widget()); +} + +CubeEffectConfig::~CubeEffectConfig() +{ +} + +void CubeEffectConfig::load() +{ + KCModule::load(); + updateUiFromConfig(); + updateUnmanagedState(); +} + +void CubeEffectConfig::save() +{ + updateConfigFromUi(); + CubeConfig::self()->save(); + KCModule::save(); + updateUnmanagedState(); + + OrgKdeKwinEffectsInterface interface(QStringLiteral("org.kde.KWin"), QStringLiteral("/Effects"), QDBusConnection::sessionBus()); + interface.reconfigureEffect(QStringLiteral("cube")); +} + +void CubeEffectConfig::defaults() +{ + KCModule::defaults(); + updateUiFromDefaultConfig(); + updateUnmanagedState(); +} + +void CubeEffectConfig::updateConfigFromUi() +{ +} + +void CubeEffectConfig::updateUiFromConfig() +{ +} + +void CubeEffectConfig::updateUiFromDefaultConfig() +{ +} + +void CubeEffectConfig::updateUnmanagedState() +{ +} + +#include "cubeeffectkcm.moc" diff --git a/kwin/src/kcm/cubeeffectkcm.h b/kwin/src/kcm/cubeeffectkcm.h new file mode 100644 index 0000000..efe0521 --- /dev/null +++ b/kwin/src/kcm/cubeeffectkcm.h @@ -0,0 +1,33 @@ +/* + SPDX-FileCopyrightText: 2022 Vlad Zahorodnii + + SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL +*/ + +#pragma once + +#include + +#include "ui_cubeeffectkcm.h" + +class CubeEffectConfig : public KCModule +{ + Q_OBJECT + +public: + CubeEffectConfig(QObject *parent, const KPluginMetaData &data, const QVariantList &args); + ~CubeEffectConfig() override; + +public Q_SLOTS: + void load() override; + void save() override; + void defaults() override; + +private: + void updateUiFromConfig(); + void updateUiFromDefaultConfig(); + void updateConfigFromUi(); + void updateUnmanagedState(); + + ::Ui::CubeEffectConfig ui; +}; diff --git a/kwin/src/kcm/cubeeffectkcm.ui b/kwin/src/kcm/cubeeffectkcm.ui new file mode 100644 index 0000000..cb2d34f --- /dev/null +++ b/kwin/src/kcm/cubeeffectkcm.ui @@ -0,0 +1,39 @@ + + + + CubeEffectConfig + + + + 0 + 0 + 455 + 361 + + + + + 400 + 250 + + + + + + + Cube face displacement: + + + + + + + + + + + diff --git a/kwin/src/metadata.json b/kwin/src/metadata.json index 1d9d482..3eb43da 100644 --- a/kwin/src/metadata.json +++ b/kwin/src/metadata.json @@ -8,7 +8,7 @@ } ], "Category": "Tools", - "Description": "Breezy Desktop XR Effect", + "Description": "Breezy Desktop XR Effect 2", "EnabledByDefault": true, "License": "GPL", "Name": "Breezy Desktop XR", @@ -16,5 +16,6 @@ "KWin/Effect" ] }, - "X-Plasma-API-Minimum-Version": "6.0" + "X-Plasma-API-Minimum-Version": "6.0", + "X-KDE-ConfigModule": "breezy_desktop_config" } diff --git a/kwin/src/qml/main.qml b/kwin/src/qml/main.qml index a48a8ee..a763e5a 100644 --- a/kwin/src/qml/main.qml +++ b/kwin/src/qml/main.qml @@ -24,6 +24,35 @@ Item { id: view anchors.fill: parent + Loader { + id: colorSceneEnvironment + active: effect.backgroundMode == CubeEffect.BackgroundMode.Color + sourceComponent: SceneEnvironment { + clearColor: effect.backgroundColor + backgroundMode: SceneEnvironment.Color + } + } + + Loader { + id: skyboxSceneEnvironment + active: effect.backgroundMode == CubeEffect.BackgroundMode.Skybox + sourceComponent: SceneEnvironment { + backgroundMode: SceneEnvironment.SkyBox + lightProbe: Texture { + source: effect.skybox + } + } + } + + environment: { + switch (effect.backgroundMode) { + case CubeEffect.BackgroundMode.Skybox: + return skyboxSceneEnvironment.item; + case CubeEffect.BackgroundMode.Color: + return colorSceneEnvironment.item; + } + } + PerspectiveCamera { id: camera fieldOfView: 22.55