From c266e3cbd3570e0429efb86023270cdc454b33c9 Mon Sep 17 00:00:00 2001 From: wheaney <42350981+wheaney@users.noreply.github.com> Date: Tue, 29 Jul 2025 22:22:11 -0700 Subject: [PATCH] Add automatic wrap scheme detection --- kwin/src/qml/BreezyDesktop.qml | 2 +- kwin/src/qml/Displays.qml | 17 +++++++++++++++-- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/kwin/src/qml/BreezyDesktop.qml b/kwin/src/qml/BreezyDesktop.qml index 9ee75b4..f6d4c1a 100644 --- a/kwin/src/qml/BreezyDesktop.qml +++ b/kwin/src/qml/BreezyDesktop.qml @@ -56,7 +56,7 @@ Node { } property var monitorPlacements: { - const fovDetails = displays.fovDetails(viewportResolution[0], viewportResolution[1], viewportDiagonalFOVDegrees, effect.lensDistanceRatio); + const fovDetails = displays.fovDetails(screens, viewportResolution[0], viewportResolution[1], viewportDiagonalFOVDegrees, effect.lensDistanceRatio); const monitorSpacing = 0.0; return displays.monitorsToPlacements(fovDetails, screens.map(screen => screen.geometry), monitorSpacing); } diff --git a/kwin/src/qml/Displays.qml b/kwin/src/qml/Displays.qml index bc1397d..27861fd 100644 --- a/kwin/src/qml/Displays.qml +++ b/kwin/src/qml/Displays.qml @@ -26,7 +26,20 @@ QtObject { return 1.0; } - function fovDetails(viewportWidth, viewportHeight, viewportDiagonalFOV, lensDistanceRatio) { + function actualWrapScheme(screens, viewportWidth, viewportHeight) { + const minX = Math.min(...screens.map(screen => screen.geometry.x)); + const maxX = Math.max(...screens.map(screen => screen.geometry.x + screen.geometry.width)); + const minY = Math.min(...screens.map(screen => screen.geometry.y)); + const maxY = Math.max(...screens.map(screen => screen.geometry.y + screen.geometry.height)); + + if ((maxX - minX) / viewportWidth >= (maxY - minY) / viewportHeight) { + return 'horizontal'; + } else { + return 'vertical'; + } + } + + function fovDetails(screens, viewportWidth, viewportHeight, viewportDiagonalFOV, lensDistanceRatio) { const aspect = viewportWidth / viewportHeight; const fovRadians = diagonalToCrossFOVs(degreeToRadian(viewportDiagonalFOV), aspect); const defaultDistanceVerticalRadians = 2 * Math.atan(Math.tan(fovRadians.vertical / 2) / displayDistanceDefault()); @@ -47,7 +60,7 @@ QtObject { defaultDistanceHorizontalRadians, lensDistancePixels, completeScreenDistancePixels, - monitorWrappingScheme: 'horizontal', // or 'vertical' or 'none' + monitorWrappingScheme: actualWrapScheme(screens, viewportWidth, viewportHeight), curvedDisplay: false // or true }; }