Use the shared buildFovDetails function

This commit is contained in:
wheaney 2026-05-28 15:14:40 -07:00
parent 851d972da5
commit 00ec9ed593
4 changed files with 23 additions and 85 deletions

@ -1 +1 @@
Subproject commit 6cc1d97ece687b2d71dfdb51c94eaf11c82c7fe5
Subproject commit 65376ad92e0cecfc0bf77ced15ed0d32e33c6f82

View File

@ -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() {

View File

@ -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.

@ -1 +1 @@
Subproject commit 6cc1d97ece687b2d71dfdb51c94eaf11c82c7fe5
Subproject commit 65376ad92e0cecfc0bf77ced15ed0d32e33c6f82