Improve license messaging, effect toggling, and add button for rearranging displays

This commit is contained in:
wheaney 2025-09-08 12:44:26 -07:00
parent 713b9c7fc1
commit 343205f598
5 changed files with 131 additions and 21 deletions

View File

@ -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);

View File

@ -79,6 +79,7 @@ namespace KWin
void activate();
void deactivate();
void enableDriver();
void disableDriver();
void toggle();
void addVirtualDisplay(QSize size);
void updateImuRotation();

View File

@ -20,7 +20,9 @@
#include <QLabel>
#include <QJsonValue>
#include <QJsonArray>
#include <QPushButton>
#include <QDesktopServices>
#include <QUrl>
#include <QProcess>
#include <QComboBox>
#include <QDBusInterface>
#include <QDBusConnection>
@ -157,6 +159,16 @@ BreezyDesktopEffectConfig::BreezyDesktopEffectConfig(QObject *parent, const KPlu
callAddVirtualDisplay(2560, 1440);
});
}
// General tab: Open KDE Displays Settings
if (auto btnDisplays = widget()->findChild<QPushButton*>(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<QLabel*>("labelLicenseSummary");
if (!labelSummary) return;
auto donate = tab->findChild<QLabel*>("labelDonateLink");
auto globalWarn = widget()->findChild<QLabel*>("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<qint64>(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<qint64>(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"

View File

@ -25,6 +25,8 @@ public Q_SLOTS:
void defaults() override;
private:
void enableDriver();
void disableDriver();
void updateUiFromConfig();
void updateUiFromDefaultConfig();
void updateConfigFromUi();

View File

@ -20,6 +20,25 @@
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="labelGlobalLicenseWarning">
<property name="text">
<string/>
</property>
<property name="visible">
<bool>false</bool>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
<property name="alignment">
<set>Qt::AlignHCenter|Qt::AlignVCenter</set>
</property>
<property name="styleSheet">
<string notr="true">color: rgb(200,0,0); font-weight: bold;</string>
</property>
</widget>
</item>
<item>
<widget class="QTabWidget" name="tabWidget">
<property name="tabPosition">
@ -148,10 +167,17 @@
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="buttonOpenDisplaysSettings">
<property name="text">
<string>Rearrange displays</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item row="5" column="0" colspan="2">
<item row="5" column="0" colspan="2">
<widget class="KShortcutsEditor" name="shortcutsEditor" native="true">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
@ -271,6 +297,22 @@
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="labelDonateLink">
<property name="text">
<string>&lt;a href=&quot;https://ko-fi.com/wheaney&quot;&gt;Renew or support on Kofi&lt;/a&gt;</string>
</property>
<property name="openExternalLinks">
<bool>true</bool>
</property>
<property name="alignment">
<set>Qt::AlignHCenter|Qt::AlignVCenter</set>
</property>
<property name="visible">
<bool>false</bool>
</property>
</widget>
</item>
<item>
<widget class="QGroupBox" name="groupBoxEmail">
<property name="title">