From bc959c2f4c2a8fdc2e974e4a0c3441e3f7bad2bf Mon Sep 17 00:00:00 2001
From: wheaney <42350981+wheaney@users.noreply.github.com>
Date: Tue, 2 Sep 2025 22:01:59 -0700
Subject: [PATCH] Add display offsets and wrapping scheme options
---
kwin/src/breezydesktopconfig.kcfg | 21 +++++
kwin/src/breezydesktopeffect.cpp | 20 +++++
kwin/src/breezydesktopeffect.h | 11 +++
kwin/src/kcm/breezydesktopeffectkcm.cpp | 15 ++--
kwin/src/kcm/breezydesktopeffectkcm.ui | 102 +++++++++++++++++++++---
kwin/src/qml/Displays.qml | 13 ++-
kwin/src/qml/main.qml | 16 +++-
7 files changed, 172 insertions(+), 26 deletions(-)
diff --git a/kwin/src/breezydesktopconfig.kcfg b/kwin/src/breezydesktopconfig.kcfg
index 8d0824d..3e47677 100644
--- a/kwin/src/breezydesktopconfig.kcfg
+++ b/kwin/src/breezydesktopconfig.kcfg
@@ -29,5 +29,26 @@
How far apart the displays are visually (not logically)
+
+ 0
+ -250
+ 250
+
+ Horizontal offset as a percent of the viewport width (-2.50 to 2.50)
+
+
+ 0
+ -250
+ 250
+
+ Vertical offset as a percent of the viewport height (-2.50 to 2.50)
+
+
+ 0
+ 0
+ 3
+
+ How to arrange monitors: 0=Auto, 1=Horizontal, 2=Vertical, 3=Flat
+
diff --git a/kwin/src/breezydesktopeffect.cpp b/kwin/src/breezydesktopeffect.cpp
index 0ae5596..330ece4 100644
--- a/kwin/src/breezydesktopeffect.cpp
+++ b/kwin/src/breezydesktopeffect.cpp
@@ -153,6 +153,14 @@ void BreezyDesktopEffect::reconfigure(ReconfigureFlags)
setAllDisplaysDistance(BreezyDesktopConfig::allDisplaysDistance() / 100.0f);
setDisplaySpacing(BreezyDesktopConfig::displaySpacing() / 1000.0f);
setZoomOnFocusEnabled(BreezyDesktopConfig::zoomOnFocusEnabled());
+ qreal horiz = BreezyDesktopConfig::displayHorizontalOffset() / 100.0f;
+ qreal vert = BreezyDesktopConfig::displayVerticalOffset() / 100.0f;
+ int wrap = BreezyDesktopConfig::displayWrappingScheme();
+ 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 (changed) Q_EMIT displayOffsetChanged();
}
QVariantMap BreezyDesktopEffect::initialProperties(Output *screen)
@@ -327,6 +335,18 @@ void BreezyDesktopEffect::setDisplaySpacing(qreal spacing) {
}
}
+qreal BreezyDesktopEffect::displayHorizontalOffset() const {
+ return m_displayHorizontalOffset;
+}
+
+qreal BreezyDesktopEffect::displayVerticalOffset() const {
+ return m_displayVerticalOffset;
+}
+
+int BreezyDesktopEffect::displayWrappingScheme() const {
+ return m_displayWrappingScheme;
+}
+
qreal BreezyDesktopEffect::diagonalFOV() const {
return m_diagonalFOV;
}
diff --git a/kwin/src/breezydesktopeffect.h b/kwin/src/breezydesktopeffect.h
index 4f232b5..6011c42 100644
--- a/kwin/src/breezydesktopeffect.h
+++ b/kwin/src/breezydesktopeffect.h
@@ -27,6 +27,9 @@ namespace KWin
Q_PROPERTY(qreal focusedDisplayDistance READ focusedDisplayDistance NOTIFY focusedDisplayDistanceChanged)
Q_PROPERTY(qreal allDisplaysDistance READ allDisplaysDistance NOTIFY allDisplaysDistanceChanged)
Q_PROPERTY(qreal displaySpacing READ displaySpacing NOTIFY displaySpacingChanged)
+ Q_PROPERTY(qreal displayHorizontalOffset READ displayHorizontalOffset NOTIFY displayOffsetChanged)
+ Q_PROPERTY(qreal displayVerticalOffset READ displayVerticalOffset NOTIFY displayOffsetChanged)
+ Q_PROPERTY(int displayWrappingScheme READ displayWrappingScheme NOTIFY displayWrappingSchemeChanged)
Q_PROPERTY(qreal diagonalFOV READ diagonalFOV NOTIFY devicePropertiesChanged)
Q_PROPERTY(qreal lensDistanceRatio READ lensDistanceRatio NOTIFY devicePropertiesChanged)
Q_PROPERTY(bool sbsEnabled READ sbsEnabled NOTIFY devicePropertiesChanged)
@@ -58,6 +61,9 @@ namespace KWin
void setAllDisplaysDistance(qreal distance);
qreal displaySpacing() const;
void setDisplaySpacing(qreal spacing);
+ qreal displayHorizontalOffset() const;
+ qreal displayVerticalOffset() const;
+ int displayWrappingScheme() const;
qreal diagonalFOV() const;
qreal lensDistanceRatio() const;
bool sbsEnabled() const;
@@ -80,6 +86,8 @@ namespace KWin
void focusedDisplayDistanceChanged();
void allDisplaysDistanceChanged();
void displaySpacingChanged();
+ void displayOffsetChanged();
+ void displayWrappingSchemeChanged();
void enabledStateChanged();
void zoomOnFocusChanged();
void imuRotationsChanged();
@@ -119,6 +127,9 @@ namespace KWin
qreal m_focusedDisplayDistance = 0.85;
qreal m_allDisplaysDistance = 1.05;
qreal m_displaySpacing = 0.0;
+ qreal m_displayHorizontalOffset = 0.0;
+ qreal m_displayVerticalOffset = 0.0;
+ int m_displayWrappingScheme = 0; // 0=auto,1=horizontal,2=vertical,3=flat
QList