diff --git a/kwin/src/breezydesktopeffect.cpp b/kwin/src/breezydesktopeffect.cpp index 0807139..e27830d 100644 --- a/kwin/src/breezydesktopeffect.cpp +++ b/kwin/src/breezydesktopeffect.cpp @@ -273,20 +273,27 @@ void BreezyDesktopEffect::deactivate() void BreezyDesktopEffect::enableDriver() { qCCritical(KWIN_XR) << "\t\t\tBreezy - 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); + QJsonObject newConfig = QJsonObject(); + auto configJsonOpt = XRDriverIPC::instance().retrieveConfig(); + if (configJsonOpt) { + newConfig = configJsonOpt.value(); + } + newConfig.insert(QStringLiteral("disabled"), false); + newConfig.insert(QStringLiteral("output_mode"), QStringLiteral("external_only")); + newConfig.insert(QStringLiteral("external_mode"), QStringLiteral("breezy_desktop")); + XRDriverIPC::instance().writeConfig(newConfig); } 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); + QJsonObject newConfig = QJsonObject(); + auto configJsonOpt = XRDriverIPC::instance().retrieveConfig(); + if (configJsonOpt) { + newConfig = configJsonOpt.value(); + } + newConfig.insert(QStringLiteral("external_mode"), QStringLiteral("none")); + XRDriverIPC::instance().writeConfig(newConfig); } void BreezyDesktopEffect::addVirtualDisplay(QSize size) diff --git a/kwin/src/kcm/breezydesktopeffectkcm.cpp b/kwin/src/kcm/breezydesktopeffectkcm.cpp index 038779d..a3b62e4 100644 --- a/kwin/src/kcm/breezydesktopeffectkcm.cpp +++ b/kwin/src/kcm/breezydesktopeffectkcm.cpp @@ -242,24 +242,43 @@ void BreezyDesktopEffectConfig::updateUnmanagedState() void BreezyDesktopEffectConfig::updateDriverEnabled() { - QJsonObject obj; - if (ui.kcfg_EffectEnabled->isChecked()) { - obj.insert(QStringLiteral("disabled"), false); - obj.insert(QStringLiteral("output_mode"), QStringLiteral("external_only")); - obj.insert(QStringLiteral("external_mode"), QStringLiteral("breezy_desktop")); - } else { - obj.insert(QStringLiteral("disabled"), true); - obj.insert(QStringLiteral("external_mode"), QStringLiteral("none")); + if (driverEnabled() == ui.kcfg_EffectEnabled->isChecked()) { + return; } - XRDriverIPC::instance().writeConfig(obj); + + QJsonObject newConfig = QJsonObject(); + auto configJsonOpt = XRDriverIPC::instance().retrieveConfig(); + if (configJsonOpt) { + newConfig = configJsonOpt.value(); + } + if (ui.kcfg_EffectEnabled->isChecked()) { + newConfig.insert(QStringLiteral("disabled"), false); + newConfig.insert(QStringLiteral("output_mode"), QStringLiteral("external_only")); + newConfig.insert(QStringLiteral("external_mode"), QStringLiteral("breezy_desktop")); + } else { + newConfig.insert(QStringLiteral("external_mode"), QStringLiteral("none")); + } + XRDriverIPC::instance().writeConfig(newConfig); +} + +bool BreezyDesktopEffectConfig::driverEnabled() +{ + auto configJsonOpt = XRDriverIPC::instance().retrieveConfig(); + if (!configJsonOpt) return false; + auto configJson = configJsonOpt.value(); + bool driverDisabled = configJson.value(QStringLiteral("disabled")).toBool(); + QString driverOutputMode = configJson.value(QStringLiteral("output_mode")).toString(); + QJsonArray driverExternalMode = configJson.value(QStringLiteral("external_mode")).toArray(); + return !driverDisabled && + driverOutputMode == QStringLiteral("external_only") && + driverExternalMode.contains(QJsonValue(QStringLiteral("breezy_desktop"))); } void BreezyDesktopEffectConfig::pollDriverState() { auto &bridge = XRDriverIPC::instance(); auto stateJsonOpt = bridge.retrieveDriverState(); - auto configJsonOpt = bridge.retrieveConfig(); - if (!stateJsonOpt || !configJsonOpt) return; + if (!stateJsonOpt) return; auto stateJson = stateJsonOpt.value(); m_connectedDeviceBrand = stateJson.value(QStringLiteral("connected_device_brand")).toString(); m_connectedDeviceModel = stateJson.value(QStringLiteral("connected_device_model")).toString(); @@ -272,13 +291,7 @@ void BreezyDesktopEffectConfig::pollDriverState() QStringLiteral("No device connected")); } - auto configJson = configJsonOpt.value(); - bool driverDisabled = configJson.value(QStringLiteral("disabled")).toBool(); - QString driverOutputMode = configJson.value(QStringLiteral("output_mode")).toString(); - QJsonArray driverExternalMode = configJson.value(QStringLiteral("external_mode")).toArray(); - bool effectEnabled = !driverDisabled && - driverOutputMode == QStringLiteral("external_only") && - driverExternalMode.contains(QJsonValue(QStringLiteral("breezy_desktop"))); + bool effectEnabled = driverEnabled(); if (ui.kcfg_EffectEnabled->isChecked() != effectEnabled) ui.kcfg_EffectEnabled->setChecked(effectEnabled); refreshLicenseUi(stateJson); diff --git a/kwin/src/kcm/breezydesktopeffectkcm.h b/kwin/src/kcm/breezydesktopeffectkcm.h index c42eb51..1a54f4b 100644 --- a/kwin/src/kcm/breezydesktopeffectkcm.h +++ b/kwin/src/kcm/breezydesktopeffectkcm.h @@ -30,6 +30,7 @@ private: void updateUiFromDefaultConfig(); void updateConfigFromUi(); void updateUnmanagedState(); + bool driverEnabled(); void pollDriverState(); void refreshLicenseUi(const QJsonObject &rootObj); void showStatus(QLabel *label, bool success, const QString &message); diff --git a/kwin/src/xrdriveripc/xrdriveripc.cpp b/kwin/src/xrdriveripc/xrdriveripc.cpp index 168043d..4508f3d 100644 --- a/kwin/src/xrdriveripc/xrdriveripc.cpp +++ b/kwin/src/xrdriveripc/xrdriveripc.cpp @@ -68,7 +68,7 @@ QByteArray XRDriverIPC::invokePython(const QString &method, } std::optional XRDriverIPC::retrieveConfig() { - QByteArray out = invokePython(QStringLiteral("retrieve_config"), {}, QStringLiteral("1")); + QByteArray out = invokePython(QStringLiteral("retrieve_config"), {}, QStringLiteral("0")); if (out.isEmpty()) return std::nullopt; QJsonParseError err; auto doc = QJsonDocument::fromJson(out, &err); if (err.error != QJsonParseError::NoError || !doc.isObject()) return std::nullopt; diff --git a/modules/XRLinuxDriver b/modules/XRLinuxDriver index 69d3603..09c6627 160000 --- a/modules/XRLinuxDriver +++ b/modules/XRLinuxDriver @@ -1 +1 @@ -Subproject commit 69d3603ef9c931a0f66777279501d4c6dfe20f09 +Subproject commit 09c6627d2a60985a4f8dde86be70d0e797d62f45