From aa5096faced2c7578fe09f075b0dae232d8ed4f8 Mon Sep 17 00:00:00 2001 From: wheaney <42350981+wheaney@users.noreply.github.com> Date: Thu, 28 May 2026 15:14:40 -0700 Subject: [PATCH] Use the shared buildFovDetails function --- gnome/src/shared | 2 +- gnome/src/virtualdisplaysactor.js | 59 +++++++------------------------ kwin/src/qml/Displays.qml | 45 +++++------------------ kwin/src/qml/shared | 2 +- 4 files changed, 23 insertions(+), 85 deletions(-) diff --git a/gnome/src/shared b/gnome/src/shared index 6cc1d97..65376ad 160000 --- a/gnome/src/shared +++ b/gnome/src/shared @@ -1 +1 @@ -Subproject commit 6cc1d97ece687b2d71dfdb51c94eaf11c82c7fe5 +Subproject commit 65376ad92e0cecfc0bf77ced15ed0d32e33c6f82 diff --git a/gnome/src/virtualdisplaysactor.js b/gnome/src/virtualdisplaysactor.js index c70e3dd..a057a63 100644 --- a/gnome/src/virtualdisplaysactor.js +++ b/gnome/src/virtualdisplaysactor.js @@ -7,8 +7,8 @@ import Shell from 'gi://Shell'; import St from 'gi://St'; import { VirtualDisplayEffect, SMOOTH_FOLLOW_SLERP_TIMELINE_MS } from './virtualdisplayeffect.js'; -import { degreeToRadian, diagonalToCrossFOVs, fovConversionFns } from './shared/math.js'; -import { findFocusedMonitor, monitorsToPlacements } from './shared/displayPlacement.js'; +import { degreeToRadian } from './shared/math.js'; +import { buildFovDetails, findFocusedMonitor, monitorsToPlacements } from './shared/displayPlacement.js'; import * as Main from 'resource:///org/gnome/shell/ui/main.js'; @@ -487,54 +487,19 @@ export const VirtualDisplaysActor = GObject.registerClass({ } _fov_details() { - const aspect = this.target_monitor.width / this.target_monitor.height; - const fovLengths = diagonalToCrossFOVs(degreeToRadian(Globals.data_stream.device_data.displayFov), aspect); const monitorWrappingScheme = this._actual_wrap_scheme(); const defaultDistance = this._display_distance_default(); - const lensDistanceComplement = 1.0 - Globals.data_stream.device_data.lensDistanceRatio; - const lensDistanceFactor = (1.0 / lensDistanceComplement) - 1.0; - const horizontalConversions = this.curved_display && monitorWrappingScheme === 'horizontal' ? fovConversionFns.curved : fovConversionFns.flat; - const verticalConversions = this.curved_display && monitorWrappingScheme === 'vertical' ? fovConversionFns.curved : fovConversionFns.flat; - - // adjust FOV to a new focal point distance while keeping screens the same size - // i.e. focus from pivot point to new screen distance, adjusted from lens at unit distance - const defaultDistanceVerticalRadians = verticalConversions.fovRadiansAtDistance( - fovLengths.verticalRadians, - fovLengths.heightUnitDistance, - defaultDistance + const fovDetails = buildFovDetails( + this.target_monitor.width, this.target_monitor.height, + degreeToRadian(Globals.data_stream.device_data.displayFov), + Globals.data_stream.device_data.lensDistanceRatio, + defaultDistance, + monitorWrappingScheme, this.curved_display ); - const defaultDistanceHorizontalRadians = horizontalConversions.fovRadiansAtDistance( - fovLengths.horizontalRadians, - fovLengths.widthUnitDistance, - defaultDistance - ); - - // distance needed for the FOV-sized monitor to fill up the screen, as measured from the lenses - const lensToUnitDistancePixels = this.target_monitor.width / fovLengths.widthUnitDistance; - - // distance from pivot point to lens - const lensDistancePixels = lensToUnitDistancePixels * lensDistanceFactor; - - // distance from pivot point to full screen (monitor at unit distance from lens) - const fullScreenDistancePixels = lensToUnitDistancePixels + lensDistancePixels; - - // distance of a display at the default (most zoomed out) distance from the pivot point - const completeScreenDistancePixels = fullScreenDistancePixels * defaultDistance; - - return { - widthPixels: this.target_monitor.width, - distanceAdjustedSize: this._distance_adjusted_size, - sizeAdjustedWidthPixels: this.target_monitor.width * this._distance_adjusted_size, - heightPixels: this.target_monitor.height, - sizeAdjustedHeightPixels: this.target_monitor.height * this._distance_adjusted_size, - defaultDistanceVerticalRadians, - defaultDistanceHorizontalRadians, - lensDistancePixels, - fullScreenDistancePixels, - completeScreenDistancePixels, - monitorWrappingScheme, - curvedDisplay: this.curved_display - }; + fovDetails.distanceAdjustedSize = this._distance_adjusted_size; + fovDetails.sizeAdjustedWidthPixels = this.target_monitor.width * this._distance_adjusted_size; + fovDetails.sizeAdjustedHeightPixels = this.target_monitor.height * this._distance_adjusted_size; + return fovDetails; } _actual_wrap_scheme() { diff --git a/kwin/src/qml/Displays.qml b/kwin/src/qml/Displays.qml index 3106a13..5bd744e 100644 --- a/kwin/src/qml/Displays.qml +++ b/kwin/src/qml/Displays.qml @@ -55,49 +55,22 @@ QtObject { } function buildFovDetails(screens, viewportWidth, viewportHeight, viewportDiagonalFOV, lensDistanceRatio, defaultDisplayDistance, wrappingChoice, distanceAdjustedSize) { - const aspect = viewportWidth / viewportHeight; - const fovLengths = SharedMath.diagonalToCrossFOVs(SharedMath.degreeToRadian(viewportDiagonalFOV), aspect); - let monitorWrappingScheme = actualWrapScheme(screens, viewportWidth, viewportHeight); if (wrappingChoice === 1) monitorWrappingScheme = 'horizontal'; else if (wrappingChoice === 2) monitorWrappingScheme = 'vertical'; else if (wrappingChoice === 3) monitorWrappingScheme = 'flat'; - const lensDistanceComplement = 1.0 - lensDistanceRatio; - const lensDistanceFactor = (1.0 / lensDistanceComplement) - 1.0; - const horizontalConversions = effect.curvedDisplay && monitorWrappingScheme === 'horizontal' ? SharedMath.fovConversionFns.curved : SharedMath.fovConversionFns.flat; - const verticalConversions = effect.curvedDisplay && monitorWrappingScheme === 'vertical' ? SharedMath.fovConversionFns.curved : SharedMath.fovConversionFns.flat; - - const defaultDistanceVerticalRadians = verticalConversions.fovRadiansAtDistance( - fovLengths.verticalRadians, - fovLengths.heightUnitDistance, - defaultDisplayDistance - ); - const defaultDistanceHorizontalRadians = horizontalConversions.fovRadiansAtDistance( - fovLengths.horizontalRadians, - fovLengths.widthUnitDistance, - defaultDisplayDistance + const fovDetails = SharedPlacement.buildFovDetails( + viewportWidth, viewportHeight, + SharedMath.degreeToRadian(viewportDiagonalFOV), + lensDistanceRatio, defaultDisplayDistance, + monitorWrappingScheme, effect.curvedDisplay ); - const lensToUnitDistancePixels = viewportWidth / fovLengths.widthUnitDistance; - const lensDistancePixels = lensToUnitDistancePixels * lensDistanceFactor; - const fullScreenDistancePixels = lensToUnitDistancePixels + lensDistancePixels; - const completeScreenDistancePixels = fullScreenDistancePixels * defaultDisplayDistance; - - return { - widthPixels: viewportWidth, - distanceAdjustedSize, - sizeAdjustedWidthPixels: viewportWidth * distanceAdjustedSize, - heightPixels: viewportHeight, - sizeAdjustedHeightPixels: viewportHeight * distanceAdjustedSize, - defaultDistanceVerticalRadians, - defaultDistanceHorizontalRadians, - lensDistancePixels, - fullScreenDistancePixels, - completeScreenDistancePixels, - monitorWrappingScheme, - curvedDisplay: effect.curvedDisplay - }; + fovDetails.distanceAdjustedSize = distanceAdjustedSize; + fovDetails.sizeAdjustedWidthPixels = viewportWidth * distanceAdjustedSize; + fovDetails.sizeAdjustedHeightPixels = viewportHeight * distanceAdjustedSize; + return fovDetails; } // Wraps SharedPlacement.monitorsToPlacements, converting plain-array vectors to Qt.vector3d. diff --git a/kwin/src/qml/shared b/kwin/src/qml/shared index 6cc1d97..65376ad 160000 --- a/kwin/src/qml/shared +++ b/kwin/src/qml/shared @@ -1 +1 @@ -Subproject commit 6cc1d97ece687b2d71dfdb51c94eaf11c82c7fe5 +Subproject commit 65376ad92e0cecfc0bf77ced15ed0d32e33c6f82