From 40475736c1f5455eaebe3a66c56620584becbdf9 Mon Sep 17 00:00:00 2001
From: wheaney <42350981+wheaney@users.noreply.github.com>
Date: Thu, 11 Sep 2025 11:46:47 -0700
Subject: [PATCH] Add support for enabling/disabling physical screen mirroring
Option to turn physical displays off not implemented yet
---
kwin/src/breezydesktopconfig.kcfg | 7 +++++
kwin/src/breezydesktopeffect.cpp | 6 +++++
kwin/src/breezydesktopeffect.h | 4 +++
kwin/src/kcm/breezydesktopeffectkcm.cpp | 2 ++
kwin/src/kcm/breezydesktopeffectkcm.ui | 34 ++++++++++++++++++++++---
kwin/src/qml/BreezyDesktop.qml | 25 ++++++++++++++----
kwin/src/qml/CameraController.qml | 7 ++---
kwin/src/qml/Displays.qml | 2 +-
kwin/src/qml/main.qml | 15 ++++++-----
9 files changed, 81 insertions(+), 21 deletions(-)
diff --git a/kwin/src/breezydesktopconfig.kcfg b/kwin/src/breezydesktopconfig.kcfg
index 2a8ec8b..17d6b9a 100644
--- a/kwin/src/breezydesktopconfig.kcfg
+++ b/kwin/src/breezydesktopconfig.kcfg
@@ -57,6 +57,13 @@
0=None, 1=Medium, 2=High, 3=Very High
+
+ 1
+ 0
+ 2
+
+ How to handle the physical (built-in) monitors: 0=Off, 1=On - not mirrored in XR, 2=On - mirrored in XR (may impact performance)
+
true
diff --git a/kwin/src/breezydesktopeffect.cpp b/kwin/src/breezydesktopeffect.cpp
index e27830d..145b067 100644
--- a/kwin/src/breezydesktopeffect.cpp
+++ b/kwin/src/breezydesktopeffect.cpp
@@ -203,12 +203,14 @@ void BreezyDesktopEffect::reconfigure(ReconfigureFlags)
int wrap = BreezyDesktopConfig::displayWrappingScheme();
int aaQuality = BreezyDesktopConfig::antialiasingQuality();
bool removeVD = BreezyDesktopConfig::removeVirtualDisplaysOnDisable();
+ int physDisplaysMode = BreezyDesktopConfig::physicalDisplaysMode();
bool changed = false;
if (!qFuzzyCompare(m_displayHorizontalOffset, horiz)) { m_displayHorizontalOffset = horiz; changed = true; }
if (!qFuzzyCompare(m_displayVerticalOffset, vert)) { m_displayVerticalOffset = vert; changed = true; }
if (m_displayWrappingScheme != wrap) { m_displayWrappingScheme = wrap; Q_EMIT displayWrappingSchemeChanged(); }
if (m_antialiasingQuality != aaQuality) { m_antialiasingQuality = aaQuality; Q_EMIT antialiasingQualityChanged(); }
if (m_removeVirtualDisplaysOnDisable != removeVD) { m_removeVirtualDisplaysOnDisable = removeVD; Q_EMIT removeVirtualDisplaysOnDisableChanged(); }
+ if (m_physicalDisplaysMode != physDisplaysMode) { m_physicalDisplaysMode = physDisplaysMode; Q_EMIT physicalDisplaysModeChanged(); }
if (changed) Q_EMIT displayOffsetChanged();
}
@@ -427,6 +429,10 @@ bool BreezyDesktopEffect::removeVirtualDisplaysOnDisable() const {
return m_removeVirtualDisplaysOnDisable;
}
+int BreezyDesktopEffect::physicalDisplaysMode() const {
+ return m_physicalDisplaysMode;
+}
+
bool BreezyDesktopEffect::checkParityByte(const char* data) {
const uint8_t parityByte = static_cast(data[DataView::IMU_PARITY_BYTE[DataView::OFFSET_INDEX]]);
uint8_t parity = 0;
diff --git a/kwin/src/breezydesktopeffect.h b/kwin/src/breezydesktopeffect.h
index f49dba8..3ac3fbf 100644
--- a/kwin/src/breezydesktopeffect.h
+++ b/kwin/src/breezydesktopeffect.h
@@ -37,6 +37,7 @@ namespace KWin
Q_PROPERTY(bool customBannerEnabled READ customBannerEnabled NOTIFY devicePropertiesChanged)
Q_PROPERTY(int antialiasingQuality READ antialiasingQuality NOTIFY antialiasingQualityChanged)
Q_PROPERTY(bool removeVirtualDisplaysOnDisable READ removeVirtualDisplaysOnDisable NOTIFY removeVirtualDisplaysOnDisableChanged)
+ Q_PROPERTY(int physicalDisplaysMode READ physicalDisplaysMode NOTIFY physicalDisplaysModeChanged)
public:
@@ -75,6 +76,7 @@ namespace KWin
bool customBannerEnabled() const;
int antialiasingQuality() const;
bool removeVirtualDisplaysOnDisable() const;
+ int physicalDisplaysMode() const;
void showCursor();
void hideCursor();
@@ -104,6 +106,7 @@ namespace KWin
void devicePropertiesChanged();
void antialiasingQualityChanged();
void removeVirtualDisplaysOnDisableChanged();
+ void physicalDisplaysModeChanged();
protected:
QVariantMap initialProperties(Output *screen) override;
@@ -142,6 +145,7 @@ namespace KWin
int m_displayWrappingScheme = 0; // 0=auto,1=horizontal,2=vertical,3=flat
int m_antialiasingQuality = 3; // 0=None, 1=Medium, 2=High, 3=VeryHigh
bool m_removeVirtualDisplaysOnDisable = true;
+ int m_physicalDisplaysMode = 1; // 0=Off,1=On no mirror,2=On mirrored
QList