diff --git a/kwin/src/breezydesktopeffect.cpp b/kwin/src/breezydesktopeffect.cpp index aa1c7a5..0ae5596 100644 --- a/kwin/src/breezydesktopeffect.cpp +++ b/kwin/src/breezydesktopeffect.cpp @@ -301,7 +301,7 @@ qreal BreezyDesktopEffect::focusedDisplayDistance() const { void BreezyDesktopEffect::setFocusedDisplayDistance(qreal distance) { if (distance != m_focusedDisplayDistance) { m_focusedDisplayDistance = std::clamp(distance, 0.2, m_allDisplaysDistance); - Q_EMIT displayDistanceChanged(); + Q_EMIT focusedDisplayDistanceChanged(); } } @@ -312,7 +312,7 @@ qreal BreezyDesktopEffect::allDisplaysDistance() const { void BreezyDesktopEffect::setAllDisplaysDistance(qreal distance) { if (distance != m_allDisplaysDistance) { m_allDisplaysDistance = std::clamp(distance, m_focusedDisplayDistance, 2.5); - Q_EMIT displayDistanceChanged(); + Q_EMIT allDisplaysDistanceChanged(); } } diff --git a/kwin/src/breezydesktopeffect.h b/kwin/src/breezydesktopeffect.h index ba3dee7..4f232b5 100644 --- a/kwin/src/breezydesktopeffect.h +++ b/kwin/src/breezydesktopeffect.h @@ -24,8 +24,8 @@ namespace KWin Q_PROPERTY(QPointF cursorPos READ cursorPos NOTIFY cursorPosChanged) Q_PROPERTY(QList lookAheadConfig READ lookAheadConfig NOTIFY devicePropertiesChanged) Q_PROPERTY(QList displayResolution READ displayResolution NOTIFY devicePropertiesChanged) - Q_PROPERTY(qreal focusedDisplayDistance READ focusedDisplayDistance NOTIFY displayDistanceChanged) - Q_PROPERTY(qreal allDisplaysDistance READ allDisplaysDistance NOTIFY displayDistanceChanged) + 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 diagonalFOV READ diagonalFOV NOTIFY devicePropertiesChanged) Q_PROPERTY(qreal lensDistanceRatio READ lensDistanceRatio NOTIFY devicePropertiesChanged) @@ -77,7 +77,8 @@ namespace KWin void updateCursorPos(); Q_SIGNALS: - void displayDistanceChanged(); + void focusedDisplayDistanceChanged(); + void allDisplaysDistanceChanged(); void displaySpacingChanged(); void enabledStateChanged(); void zoomOnFocusChanged(); diff --git a/kwin/src/qml/BreezyDesktop.qml b/kwin/src/qml/BreezyDesktop.qml index 8ffa052..6fbb3be 100644 --- a/kwin/src/qml/BreezyDesktop.qml +++ b/kwin/src/qml/BreezyDesktop.qml @@ -25,10 +25,10 @@ Node { Repeater3D { id: breezyDesktopDisplays - model: screens.length + model: breezyDesktop.screens.length delegate: BreezyDesktopDisplay { - screen: screens[index] - monitorPlacement: monitorPlacements[index] + screen: breezyDesktop.screens[index] + monitorPlacement: breezyDesktop.monitorPlacements[index] property real monitorDistance: effect.allDisplaysDistance property real targetDistance: effect.allDisplaysDistance property real screenRotationY: displays.radianToDegree(monitorPlacement.rotationAngleRadians.y) @@ -81,30 +81,45 @@ Node { ); } - const focusedDisplay = focusedIndex !== -1 ? breezyDesktop.displayAtIndex(focusedIndex) : null; if (focusedIndex !== breezyDesktop.focusedMonitorIndex) { + const unfocusedIndex = breezyDesktop.focusedMonitorIndex; + const focusedDisplay = focusedIndex !== -1 ? breezyDesktop.displayAtIndex(focusedIndex) : null; + const allDisplaysDistanceBinding = Qt.binding(function() { return effect.allDisplaysDistance; }); + const focusedDisplayDistanceBinding = Qt.binding(function() { return effect.focusedDisplayDistance; }); if (focusedDisplay === null) { - zoomOutAnimation.target = breezyDesktop.displayAtIndex(breezyDesktop.focusedMonitorIndex); - zoomOutAnimation.target.targetDistance = zoomOutAnimation.to; + const unfocusedDisplay = breezyDesktop.displayAtIndex(unfocusedIndex); + zoomOutAnimation.target = unfocusedDisplay; + zoomOutAnimation.target.targetDistance = effect.allDisplaysDistance; + zoomOutAnimation.onFinished.connect(function() { + unfocusedDisplay.monitorDistance = allDisplaysDistanceBinding; + }); zoomOutAnimation.start(); } else { - if (breezyDesktop.focusedMonitorIndex === -1) { + if (unfocusedIndex === -1) { zoomInAnimation.target = focusedDisplay; - focusedDisplay.targetDistance = zoomInAnimation.to; + focusedDisplay.targetDistance = effect.focusedDisplayDistance; + zoomInAnimation.onFinished.connect(function() { + focusedDisplay.monitorDistance = focusedDisplayDistanceBinding; + }); zoomInAnimation.start(); } else { + const focusedDisplay = breezyDesktop.displayAtIndex(focusedIndex); zoomInSeqAnimation.target = focusedDisplay; - focusedDisplay.targetDistance = zoomInSeqAnimation.to; - zoomOutSeqAnimation.target = breezyDesktop.displayAtIndex(breezyDesktop.focusedMonitorIndex); - zoomOutSeqAnimation.target.targetDistance = zoomOutSeqAnimation.to; + focusedDisplay.targetDistance = effect.focusedDisplayDistance; + + const unfocusedDisplay = breezyDesktop.displayAtIndex(unfocusedIndex); + zoomOutSeqAnimation.target = unfocusedDisplay; + zoomOutSeqAnimation.target.targetDistance = effect.allDisplaysDistance; + + zoomOnFocusSequence.onFinished.connect(function() { + focusedDisplay.monitorDistance = focusedDisplayDistanceBinding; + unfocusedDisplay.monitorDistance = allDisplaysDistanceBinding; + }); + zoomOnFocusSequence.start(); } } breezyDesktop.focusedMonitorIndex = focusedIndex; - } else if (focusedDisplay !== null && focusedDisplay.targetDistance !== effect.focusedDisplayDistance) { - // user is changing the focused display distance setting, so just move it to match - focusedDisplay.monitorDistance = effect.focusedDisplayDistance; - focusedDisplay.targetDistance = effect.focusedDisplayDistance; } } } diff --git a/kwin/src/qml/Displays.qml b/kwin/src/qml/Displays.qml index 69e79af..53d1dbf 100644 --- a/kwin/src/qml/Displays.qml +++ b/kwin/src/qml/Displays.qml @@ -48,11 +48,11 @@ QtObject { } } - function fovDetails(screens, viewportWidth, viewportHeight, viewportDiagonalFOV, lensDistanceRatio) { + function fovDetails(screens, viewportWidth, viewportHeight, viewportDiagonalFOV, lensDistanceRatio, defaultDisplayDistanace) { const aspect = viewportWidth / viewportHeight; const fovRadians = diagonalToCrossFOVs(degreeToRadian(viewportDiagonalFOV), aspect); - const defaultDistanceVerticalRadians = 2 * Math.atan(Math.tan(fovRadians.vertical / 2) / effect.allDisplaysDistance); - const defaultDistanceHorizontalRadians = 2 * Math.atan(Math.tan(fovRadians.horizontal / 2) / effect.allDisplaysDistance); + const defaultDistanceVerticalRadians = 2 * Math.atan(Math.tan(fovRadians.vertical / 2) / defaultDisplayDistanace); + const defaultDistanceHorizontalRadians = 2 * Math.atan(Math.tan(fovRadians.horizontal / 2) / defaultDisplayDistanace); // distance needed for the FOV-sized monitor to fill up the screen const fullScreenDistance = viewportHeight / 2 / Math.tan(fovRadians.vertical / 2); diff --git a/kwin/src/qml/main.qml b/kwin/src/qml/main.qml index d2ad25a..983cc67 100644 --- a/kwin/src/qml/main.qml +++ b/kwin/src/qml/main.qml @@ -61,7 +61,7 @@ Item { id: displays } - property var fovDetails: displays.fovDetails(screens, viewportResolution[0], viewportResolution[1], viewportDiagonalFOVDegrees, effect.lensDistanceRatio) + property var fovDetails: displays.fovDetails(screens, viewportResolution[0], viewportResolution[1], viewportDiagonalFOVDegrees, effect.lensDistanceRatio, effect.allDisplaysDistance) property var monitorPlacements: { const adjustedGeometries = screens.map(screen => {