diff --git a/kwin/src/breezydesktopeffect.cpp b/kwin/src/breezydesktopeffect.cpp index 7ae4f49..4e404a4 100644 --- a/kwin/src/breezydesktopeffect.cpp +++ b/kwin/src/breezydesktopeffect.cpp @@ -226,11 +226,11 @@ int BreezyDesktopEffect::requestedEffectChainPosition() const void BreezyDesktopEffect::toggle() { if (isRunning()) { - qCCritical(KWIN_XR) << "\t\t\tBreezy - toggle - deactivating"; - deactivate(); + qCCritical(KWIN_XR) << "\t\t\tBreezy - toggle - disabling"; + disableDriver(); } else { - qCCritical(KWIN_XR) << "\t\t\tBreezy - toggle - activating"; - activate(); + qCCritical(KWIN_XR) << "\t\t\tBreezy - toggle - enabling"; + enableDriver(); } } @@ -277,11 +277,17 @@ void BreezyDesktopEffect::enableDriver() XRDriverIPC::instance().writeConfig(obj); } +void BreezyDesktopEffect::disableDriver() +{ + qCCritical(KWIN_XR) << "\t\t\tBreezy - disableDriver"; + QJsonObject obj; + obj.insert(QStringLiteral("disabled"), true); + obj.insert(QStringLiteral("external_mode"), QStringLiteral("none")); + XRDriverIPC::instance().writeConfig(obj); +} + void BreezyDesktopEffect::addVirtualDisplay(QSize size) { - // QSize size(2560, 1440); - // addVirtualDisplay(size); - static int virtualDisplayCount = 0; ++virtualDisplayCount; QString name = QStringLiteral("BreezyDesktop_VirtualDisplay_%1x%2_%3").arg(size.width()).arg(size.height()).arg(virtualDisplayCount); diff --git a/kwin/src/breezydesktopeffect.h b/kwin/src/breezydesktopeffect.h index cc8daa4..674605f 100644 --- a/kwin/src/breezydesktopeffect.h +++ b/kwin/src/breezydesktopeffect.h @@ -79,6 +79,7 @@ namespace KWin void activate(); void deactivate(); void enableDriver(); + void disableDriver(); void toggle(); void addVirtualDisplay(QSize size); void updateImuRotation(); diff --git a/kwin/src/kcm/breezydesktopeffectkcm.cpp b/kwin/src/kcm/breezydesktopeffectkcm.cpp index 51c6c2f..318361d 100644 --- a/kwin/src/kcm/breezydesktopeffectkcm.cpp +++ b/kwin/src/kcm/breezydesktopeffectkcm.cpp @@ -20,7 +20,9 @@ #include #include #include -#include +#include +#include +#include #include #include #include @@ -157,6 +159,16 @@ BreezyDesktopEffectConfig::BreezyDesktopEffectConfig(QObject *parent, const KPlu callAddVirtualDisplay(2560, 1440); }); } + + // General tab: Open KDE Displays Settings + if (auto btnDisplays = widget()->findChild(QStringLiteral("buttonOpenDisplaysSettings"))) { + connect(btnDisplays, &QPushButton::clicked, this, [this]() { + // Try launching the KScreen KCM + if (!QProcess::startDetached(QStringLiteral("kcmshell6"), {QStringLiteral("kcm_kscreen")})) { + QDesktopServices::openUrl(QUrl(QStringLiteral("systemsettings://kcm_kscreen"))); + } + }); + } } BreezyDesktopEffectConfig::~BreezyDesktopEffectConfig() @@ -218,6 +230,25 @@ void BreezyDesktopEffectConfig::updateUnmanagedState() { } +void BreezyDesktopEffectConfig::enableDriver() +{ + qCCritical(KWIN_XR) << "\t\t\tBreezy config - enableDriver"; + QJsonObject obj; + obj.insert(QStringLiteral("disabled"), false); + obj.insert(QStringLiteral("output_mode"), QStringLiteral("external_only")); + obj.insert(QStringLiteral("external_mode"), QStringLiteral("breezy_desktop")); + XRDriverIPC::instance().writeConfig(obj); +} + +void BreezyDesktopEffectConfig::disableDriver() +{ + qCCritical(KWIN_XR) << "\t\t\tBreezy config - disableDriver"; + QJsonObject obj; + obj.insert(QStringLiteral("disabled"), true); + obj.insert(QStringLiteral("external_mode"), QStringLiteral("none")); + XRDriverIPC::instance().writeConfig(obj); +} + void BreezyDesktopEffectConfig::pollDriverState() { auto &bridge = XRDriverIPC::instance(); @@ -304,12 +335,15 @@ void BreezyDesktopEffectConfig::refreshLicenseUi(const QJsonObject &rootObj) { if (!tab) return; auto labelSummary = tab->findChild("labelLicenseSummary"); if (!labelSummary) return; + auto donate = tab->findChild("labelDonateLink"); + auto globalWarn = widget()->findChild("labelGlobalLicenseWarning"); QString status = tr("disabled"); QString renewalDescriptor = QStringLiteral(""); auto uiView = rootObj.value(QStringLiteral("ui_view")).toObject(); auto license = uiView.value(QStringLiteral("license")).toObject(); - bool warningState = true; + bool warningState = false; + bool expired = false; if (!license.isEmpty()) { auto tiers = license.value(QStringLiteral("tiers")).toObject(); QJsonValue prodTier = tiers.value(QStringLiteral("subscriber")); @@ -349,23 +383,48 @@ void BreezyDesktopEffectConfig::refreshLicenseUi(const QJsonObject &rootObj) { } else { QJsonValue isEnabled = prodFeatureObj.value(QStringLiteral("is_enabled")); QJsonValue isTrial = prodFeatureObj.value(QStringLiteral("is_trial")); - if (isEnabled.toBool() && isTrial.toBool()) { - status = tr("in trial"); - auto secsVal = prodFeatureObj.value(QStringLiteral("funds_needed_in_seconds")); - if (secsVal.isDouble()) { - qint64 secs = static_cast(secsVal.toDouble()); - QString remaining = secondsToRemainingString(secs); - warningState = !remaining.isEmpty(); - if (warningState) { - QString timeDescriptor = tr("%1 remaining").arg(remaining); - renewalDescriptor = tr(" (%1)").arg(timeDescriptor); + if (isEnabled.toBool()) { + if (isTrial.toBool()) { + status = tr("in trial"); + auto secsVal = prodFeatureObj.value(QStringLiteral("funds_needed_in_seconds")); + if (secsVal.isDouble()) { + qint64 secs = static_cast(secsVal.toDouble()); + QString remaining = secondsToRemainingString(secs); + warningState = !remaining.isEmpty(); + if (warningState) { + QString timeDescriptor = tr("%1 remaining").arg(remaining); + renewalDescriptor = tr(" (%1)").arg(timeDescriptor); + } } } + } else { + expired = true; } } } } - labelSummary->setText(tr("Productivity Tier features are %1%2").arg(status, renewalDescriptor)); + const QString message = tr("Productivity Tier features are %1%2").arg(status, renewalDescriptor); + labelSummary->setText(message); + + if (donate) donate->setVisible(warningState || expired); + + if (globalWarn) { + if (warningState || expired) { + globalWarn->setText(message + (expired ? tr(" — effect disabled") : QString())); + globalWarn->setVisible(true); + } else { + globalWarn->clear(); + globalWarn->setVisible(false); + } + } + + if (expired) { + if (ui.tabWidget) ui.tabWidget->setEnabled(false); + OrgKdeKwinEffectsInterface interface(QStringLiteral("org.kde.KWin"), QStringLiteral("/Effects"), QDBusConnection::sessionBus()); + interface.unloadEffect(QStringLiteral("breezy_desktop")); + } else { + if (ui.tabWidget) ui.tabWidget->setEnabled(true); + } } #include "breezydesktopeffectkcm.moc" \ No newline at end of file diff --git a/kwin/src/kcm/breezydesktopeffectkcm.h b/kwin/src/kcm/breezydesktopeffectkcm.h index d717916..3ffc66a 100644 --- a/kwin/src/kcm/breezydesktopeffectkcm.h +++ b/kwin/src/kcm/breezydesktopeffectkcm.h @@ -25,6 +25,8 @@ public Q_SLOTS: void defaults() override; private: + void enableDriver(); + void disableDriver(); void updateUiFromConfig(); void updateUiFromDefaultConfig(); void updateConfigFromUi(); diff --git a/kwin/src/kcm/breezydesktopeffectkcm.ui b/kwin/src/kcm/breezydesktopeffectkcm.ui index 5bcb098..22177f6 100644 --- a/kwin/src/kcm/breezydesktopeffectkcm.ui +++ b/kwin/src/kcm/breezydesktopeffectkcm.ui @@ -20,6 +20,25 @@ + + + + + + + false + + + true + + + Qt::AlignHCenter|Qt::AlignVCenter + + + color: rgb(200,0,0); font-weight: bold; + + + @@ -148,10 +167,17 @@ + + + + Rearrange displays + + + - + @@ -271,6 +297,22 @@ + + + + <a href="https://ko-fi.com/wheaney">Renew or support on Ko‑fi</a> + + + true + + + Qt::AlignHCenter|Qt::AlignVCenter + + + false + + +