From 0cbe0f4cc85b07db9665293ed4311881ef3ac2ce Mon Sep 17 00:00:00 2001 From: crschnick Date: Wed, 11 Feb 2026 06:14:20 +0000 Subject: [PATCH] Fix terminal dock for mixed display scales --- .../app/terminal/TerminalDockBrowserComp.java | 15 +++++++++++---- .../xpipe/app/terminal/TerminalDockHubComp.java | 11 +++++++++-- .../app/terminal/TerminalDockHubManager.java | 6 ------ .../io/xpipe/app/terminal/TerminalDockView.java | 15 +++++++++++++++ 4 files changed, 35 insertions(+), 12 deletions(-) diff --git a/app/src/main/java/io/xpipe/app/terminal/TerminalDockBrowserComp.java b/app/src/main/java/io/xpipe/app/terminal/TerminalDockBrowserComp.java index dce7f986a..43993f316 100644 --- a/app/src/main/java/io/xpipe/app/terminal/TerminalDockBrowserComp.java +++ b/app/src/main/java/io/xpipe/app/terminal/TerminalDockBrowserComp.java @@ -5,6 +5,7 @@ import io.xpipe.app.comp.base.LoadingIconComp; import io.xpipe.app.core.AppFontSizes; import io.xpipe.app.core.AppI18n; import io.xpipe.app.core.window.AppMainWindow; +import io.xpipe.app.platform.NativeWinWindowControl; import io.xpipe.app.platform.PlatformThread; import io.xpipe.app.prefs.AppPrefs; import io.xpipe.app.util.GlobalTimer; @@ -157,10 +158,16 @@ public class TerminalDockBrowserComp extends SimpleRegionBuilder { var p = region.getPadding(); var sx = region.getScene().getWindow().getOutputScaleX(); var sy = region.getScene().getWindow().getOutputScaleY(); + + var scene = region.getScene(); + var windowRect = NativeWinWindowControl.MAIN_WINDOW.getBounds(); + var x = windowRect.getX() + ((p.getLeft() + scene.getX()) * sx); + var y = windowRect.getY() + ((p.getTop() + scene.getY()) * sy); + model.resizeView( - (int) Math.ceil(bounds.getMinX() * sx + p.getLeft()), - (int) Math.ceil(bounds.getMinY() * sy + p.getTop()), - (int) Math.floor(bounds.getWidth() * sx - p.getRight() - p.getLeft()), - (int) Math.floor(bounds.getHeight() * sy - p.getBottom() - p.getTop())); + (int) Math.round(x), + (int) Math.round(y), + (int) Math.round(bounds.getWidth() * sx - p.getRight() - p.getLeft()), + (int) Math.round(bounds.getHeight() * sy - p.getBottom() - p.getTop())); } } diff --git a/app/src/main/java/io/xpipe/app/terminal/TerminalDockHubComp.java b/app/src/main/java/io/xpipe/app/terminal/TerminalDockHubComp.java index 22f602d7a..5a28441fb 100644 --- a/app/src/main/java/io/xpipe/app/terminal/TerminalDockHubComp.java +++ b/app/src/main/java/io/xpipe/app/terminal/TerminalDockHubComp.java @@ -3,6 +3,7 @@ package io.xpipe.app.terminal; import io.xpipe.app.comp.SimpleRegionBuilder; import io.xpipe.app.core.window.AppMainWindow; +import io.xpipe.app.platform.NativeWinWindowControl; import io.xpipe.app.util.GlobalTimer; import javafx.application.Platform; import javafx.beans.value.ChangeListener; @@ -131,9 +132,15 @@ public class TerminalDockHubComp extends SimpleRegionBuilder { var p = region.getPadding(); var sx = region.getScene().getWindow().getOutputScaleX(); var sy = region.getScene().getWindow().getOutputScaleY(); + + var scene = region.getScene(); + var windowRect = NativeWinWindowControl.MAIN_WINDOW.getBounds(); + var x = windowRect.getX() + ((p.getLeft() + scene.getX()) * sx); + var y = windowRect.getY() + ((p.getTop() + scene.getY()) * sy); + model.resizeView( - (int) Math.round(bounds.getMinX() * sx + p.getLeft()), - (int) Math.round(bounds.getMinY() * sy + p.getTop()), + (int) Math.round(x), + (int) Math.round(y), (int) Math.round(bounds.getWidth() * sx - p.getRight() - p.getLeft()), (int) Math.round(bounds.getHeight() * sy - p.getBottom() - p.getTop())); } diff --git a/app/src/main/java/io/xpipe/app/terminal/TerminalDockHubManager.java b/app/src/main/java/io/xpipe/app/terminal/TerminalDockHubManager.java index fac77c18f..03854799e 100644 --- a/app/src/main/java/io/xpipe/app/terminal/TerminalDockHubManager.java +++ b/app/src/main/java/io/xpipe/app/terminal/TerminalDockHubManager.java @@ -59,12 +59,6 @@ public class TerminalDockHubManager { return false; } - var primaryScreen = Screen.getPrimary(); - var uniformScale = Screen.getScreens().stream().allMatch(screen -> screen.getOutputScaleX() == primaryScreen.getOutputScaleX()); - if (!uniformScale) { - return false; - } - return true; } diff --git a/app/src/main/java/io/xpipe/app/terminal/TerminalDockView.java b/app/src/main/java/io/xpipe/app/terminal/TerminalDockView.java index 27551dce0..e2094cdb4 100644 --- a/app/src/main/java/io/xpipe/app/terminal/TerminalDockView.java +++ b/app/src/main/java/io/xpipe/app/terminal/TerminalDockView.java @@ -47,7 +47,22 @@ public class TerminalDockView { public synchronized void updateCustomBounds() { terminalInstances.forEach(terminal -> { + var wasCustom = terminal.isCustomBounds(); terminal.updateBoundsState(); + + if (wasCustom && viewBounds != null) { + var currentBounds = terminal.getLastBounds(); + var targetBounds = windowBoundsFunction.apply(viewBounds); + var sum = Math.abs(targetBounds.getX() - currentBounds.getX()) + + Math.abs(targetBounds.getY() - currentBounds.getY()) + + Math.abs(targetBounds.getW() - currentBounds.getW()) + + Math.abs(targetBounds.getH() - currentBounds.getH()); + if (sum < 10) { + trackTerminal(terminal, true); + return; + } + } + if (terminal.isCustomBounds()) { terminal.disown(); }