diff --git a/kwin/src/kcm/breezydesktopeffectkcm.cpp b/kwin/src/kcm/breezydesktopeffectkcm.cpp index 487fc5d..06ddaa5 100644 --- a/kwin/src/kcm/breezydesktopeffectkcm.cpp +++ b/kwin/src/kcm/breezydesktopeffectkcm.cpp @@ -125,6 +125,9 @@ BreezyDesktopEffectConfig::BreezyDesktopEffectConfig(QObject *parent, const KPlu connect(ui.kcfg_MirrorPhysicalDisplays, &QCheckBox::toggled, this, &BreezyDesktopEffectConfig::save); connect(ui.kcfg_RemoveVirtualDisplaysOnDisable, &QCheckBox::toggled, this, &BreezyDesktopEffectConfig::save); connect(ui.EnableMultitap, &QCheckBox::toggled, this, &BreezyDesktopEffectConfig::updateMultitapEnabled); + connect(ui.SmoothFollowTrackYaw, &QCheckBox::toggled, this, &BreezyDesktopEffectConfig::updateSmoothFollowTrackYaw); + connect(ui.SmoothFollowTrackPitch, &QCheckBox::toggled, this, &BreezyDesktopEffectConfig::updateSmoothFollowTrackPitch); + connect(ui.SmoothFollowTrackRoll, &QCheckBox::toggled, this, &BreezyDesktopEffectConfig::updateSmoothFollowTrackRoll); if (auto label = widget()->findChild("labelAppNameVersion")) { label->setText(QStringLiteral("Breezy Desktop - v%1").arg(QLatin1String(BREEZY_DESKTOP_VERSION_STR))); @@ -473,6 +476,16 @@ void BreezyDesktopEffectConfig::pollDriverState() bool multitap = multitapEnabled(configJsonOpt); if (ui.EnableMultitap->isChecked() != multitap) ui.EnableMultitap->setChecked(multitap); + const bool trackYaw = smoothFollowTrackYawEnabled(configJsonOpt); + if (ui.SmoothFollowTrackYaw->isChecked() != trackYaw) + ui.SmoothFollowTrackYaw->setChecked(trackYaw); + const bool trackPitch = smoothFollowTrackPitchEnabled(configJsonOpt); + if (ui.SmoothFollowTrackPitch->isChecked() != trackPitch) + ui.SmoothFollowTrackPitch->setChecked(trackPitch); + const bool trackRoll = smoothFollowTrackRollEnabled(configJsonOpt); + if (ui.SmoothFollowTrackRoll->isChecked() != trackRoll) + ui.SmoothFollowTrackRoll->setChecked(trackRoll); + refreshLicenseUi(stateJson); m_driverStateInitialized = true; @@ -519,6 +532,60 @@ void BreezyDesktopEffectConfig::updateSmoothFollowEnabled() XRDriverIPC::instance().writeControlFlags(flags); } +bool BreezyDesktopEffectConfig::smoothFollowTrackYawEnabled(std::optional configJsonOpt) +{ + if (!configJsonOpt) return true; // fallback if config missing entirely + return configJsonOpt->value(QStringLiteral("smooth_follow_track_yaw")).toBool(); +} + +bool BreezyDesktopEffectConfig::smoothFollowTrackPitchEnabled(std::optional configJsonOpt) +{ + if (!configJsonOpt) return true; // fallback if config missing entirely + return configJsonOpt->value(QStringLiteral("smooth_follow_track_pitch")).toBool(); +} + +bool BreezyDesktopEffectConfig::smoothFollowTrackRollEnabled(std::optional configJsonOpt) +{ + if (!configJsonOpt) return false; // fallback if config missing entirely + return configJsonOpt->value(QStringLiteral("smooth_follow_track_roll")).toBool(); +} + +void BreezyDesktopEffectConfig::updateSmoothFollowTrackYaw() +{ + auto configJsonOpt = XRDriverIPC::instance().retrieveConfig(); + const bool current = smoothFollowTrackYawEnabled(configJsonOpt); + const bool desired = ui.SmoothFollowTrackYaw->isChecked(); + if (current == desired) return; + + QJsonObject newConfig = configJsonOpt ? configJsonOpt.value() : QJsonObject(); + newConfig.insert(QStringLiteral("smooth_follow_track_yaw"), desired); + XRDriverIPC::instance().writeConfig(newConfig); +} + +void BreezyDesktopEffectConfig::updateSmoothFollowTrackPitch() +{ + auto configJsonOpt = XRDriverIPC::instance().retrieveConfig(); + const bool current = smoothFollowTrackPitchEnabled(configJsonOpt); + const bool desired = ui.SmoothFollowTrackPitch->isChecked(); + if (current == desired) return; + + QJsonObject newConfig = configJsonOpt ? configJsonOpt.value() : QJsonObject(); + newConfig.insert(QStringLiteral("smooth_follow_track_pitch"), desired); + XRDriverIPC::instance().writeConfig(newConfig); +} + +void BreezyDesktopEffectConfig::updateSmoothFollowTrackRoll() +{ + auto configJsonOpt = XRDriverIPC::instance().retrieveConfig(); + const bool current = smoothFollowTrackRollEnabled(configJsonOpt); + const bool desired = ui.SmoothFollowTrackRoll->isChecked(); + if (current == desired) return; + + QJsonObject newConfig = configJsonOpt ? configJsonOpt.value() : QJsonObject(); + newConfig.insert(QStringLiteral("smooth_follow_track_roll"), desired); + XRDriverIPC::instance().writeConfig(newConfig); +} + void BreezyDesktopEffectConfig::showStatus(QLabel *label, bool success, const QString &message) { if (!label) return; QPalette pal = label->palette(); diff --git a/kwin/src/kcm/breezydesktopeffectkcm.h b/kwin/src/kcm/breezydesktopeffectkcm.h index c027890..28b82e4 100644 --- a/kwin/src/kcm/breezydesktopeffectkcm.h +++ b/kwin/src/kcm/breezydesktopeffectkcm.h @@ -31,6 +31,9 @@ private: void updateDriverEnabled(); void updateMultitapEnabled(); void updateSmoothFollowEnabled(); + void updateSmoothFollowTrackYaw(); + void updateSmoothFollowTrackPitch(); + void updateSmoothFollowTrackRoll(); void updateUiFromConfig(); void updateUiFromDefaultConfig(); void updateConfigFromUi(); @@ -38,6 +41,9 @@ private: bool driverEnabled(std::optional configJsonOpt); bool multitapEnabled(std::optional configJsonOpt); bool smoothFollowEnabled(std::optional stateJsonOpt); + bool smoothFollowTrackYawEnabled(std::optional configJsonOpt); + bool smoothFollowTrackPitchEnabled(std::optional configJsonOpt); + bool smoothFollowTrackRollEnabled(std::optional configJsonOpt); void pollDriverState(); void refreshLicenseUi(const QJsonObject &rootObj); void checkEffectLoaded(); diff --git a/kwin/src/kcm/breezydesktopeffectkcm.ui b/kwin/src/kcm/breezydesktopeffectkcm.ui index f3d42bc..5ed8c98 100644 --- a/kwin/src/kcm/breezydesktopeffectkcm.ui +++ b/kwin/src/kcm/breezydesktopeffectkcm.ui @@ -325,13 +325,60 @@ + + + Smooth follow tracking: + + + + + + + 0 + 0 + 0 + 0 + + + + Yaw + + + true + + + + + + + Pitch + + + true + + + + + + + Roll + + + false + + + + + + + Display Horizontal Offset: - + 2 @@ -353,14 +400,14 @@ - + Display Vertical Offset: - + 2 @@ -382,14 +429,14 @@ - + Movement look-ahead (ms): - + QSlider::NoTicks @@ -408,7 +455,7 @@ - + false @@ -422,7 +469,7 @@ true - + Mirror physical displays (may impact performance) @@ -430,7 +477,7 @@ false - + Enable multi-tap detection