From 7200ac95f5d65f3b0e0ee797f675bdd7b8b4774d Mon Sep 17 00:00:00 2001 From: wheaney <42350981+wheaney@users.noreply.github.com> Date: Wed, 20 Aug 2025 14:18:26 -0700 Subject: [PATCH] Add virtual display creation logic, with support for custom resolutions --- kwin/src/breezydesktopeffect.cpp | 24 +++++++++++++++++++++++- kwin/src/breezydesktopeffect.h | 2 ++ 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/kwin/src/breezydesktopeffect.cpp b/kwin/src/breezydesktopeffect.cpp index 3ae15f9..dede417 100644 --- a/kwin/src/breezydesktopeffect.cpp +++ b/kwin/src/breezydesktopeffect.cpp @@ -7,6 +7,9 @@ #include "core/rendertarget.h" #include "core/renderviewport.h" +#include +#include + #include #include #include @@ -194,6 +197,11 @@ void BreezyDesktopEffect::deactivate() m_cursorUpdateTimer->stop(); showCursor(); + for (auto output : m_virtualOutputs) { + KWin::kwinApp()->outputBackend()->removeVirtualOutput(output); + } + m_virtualOutputs.clear(); + // this triggers realDeactivate with a delay so if it's triggered from QML it gives the QML function time to // exit, avoiding a crash m_shutdownTimer->start(250); @@ -207,7 +215,6 @@ void BreezyDesktopEffect::realDeactivate() void BreezyDesktopEffect::recenter() { - qCCritical(KWIN_XR) << "\t\t\tBreezy - recenter"; QFile controlFile(QStringLiteral("/dev/shm/xr_driver_control")); if (controlFile.open(QIODevice::WriteOnly | QIODevice::Truncate)) { controlFile.write("recenter_screen=true\n"); @@ -215,6 +222,21 @@ void BreezyDesktopEffect::recenter() } } +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); + QString description = QStringLiteral("Breezy Display %1x%2 (%3)").arg(size.width()).arg(size.height()).arg(virtualDisplayCount); + auto output = KWin::kwinApp()->outputBackend()->createVirtualOutput(name, description, size, 1.0); + if (output) { + m_virtualOutputs.append(output); + } +} + bool BreezyDesktopEffect::isEnabled() const { return m_enabled; } diff --git a/kwin/src/breezydesktopeffect.h b/kwin/src/breezydesktopeffect.h index ef038ad..f68316b 100644 --- a/kwin/src/breezydesktopeffect.h +++ b/kwin/src/breezydesktopeffect.h @@ -65,6 +65,7 @@ namespace KWin void deactivate(); void toggle(); void recenter(); + void addVirtualDisplay(QSize size); void updateImuRotation(); void updateCursorImage(); void updateCursorPos(); @@ -106,6 +107,7 @@ namespace KWin QTimer *m_cursorUpdateTimer = nullptr; qreal m_focusedDisplayDistance = 0.85; qreal m_allDisplaysDistance = 1.05; + QList m_virtualOutputs; }; } // namespace KWin