From 59ce98d9db6522efade68e1f227f64e350bd1c53 Mon Sep 17 00:00:00 2001 From: crschnick Date: Fri, 17 May 2024 10:57:59 +0000 Subject: [PATCH] Window centering fixes --- .../java/io/xpipe/app/core/AppMainWindow.java | 22 +++++++------------ .../io/xpipe/app/core/AppWindowHelper.java | 19 +++++++++++----- .../java/io/xpipe/app/util/InputHelper.java | 13 +++-------- 3 files changed, 24 insertions(+), 30 deletions(-) diff --git a/app/src/main/java/io/xpipe/app/core/AppMainWindow.java b/app/src/main/java/io/xpipe/app/core/AppMainWindow.java index c4d01aee..fc8fa23e 100644 --- a/app/src/main/java/io/xpipe/app/core/AppMainWindow.java +++ b/app/src/main/java/io/xpipe/app/core/AppMainWindow.java @@ -1,7 +1,6 @@ package io.xpipe.app.core; import io.xpipe.app.fxcomps.Comp; -import io.xpipe.app.fxcomps.util.PlatformThread; import io.xpipe.app.issue.ErrorEvent; import io.xpipe.app.issue.TrackEvent; import io.xpipe.app.prefs.AppPrefs; @@ -29,7 +28,6 @@ import java.nio.file.Path; import java.time.Duration; import java.time.Instant; import java.time.temporal.ChronoUnit; -import java.util.concurrent.atomic.AtomicBoolean; public class AppMainWindow { @@ -143,19 +141,15 @@ public class AppMainWindow { windowActive.set(false); }); - AtomicBoolean shown = new AtomicBoolean(false); stage.setOnShown(event -> { - PlatformThread.runLaterIfNeeded(() -> { - // On some platforms, e.g. KDE with wayland, the screen size is not known when the window is first shown - // This fixes the alignment in these cases - if (state == null && !shown.get()) { - Platform.runLater(() -> { - stage.centerOnScreen(); - }); - } - stage.requestFocus(); - shown.set(true); - }); + // On some platforms, e.g. KDE with wayland, the screen size is not known when the window is first shown + // This fixes the alignment in these cases + if (state == null && stage.getX() == 0 && stage.getY() == 0) { + Platform.runLater(() -> { + stage.centerOnScreen(); + }); + } + stage.requestFocus(); }); stage.setOnCloseRequest(e -> { diff --git a/app/src/main/java/io/xpipe/app/core/AppWindowHelper.java b/app/src/main/java/io/xpipe/app/core/AppWindowHelper.java index f8b75931..5f3414b0 100644 --- a/app/src/main/java/io/xpipe/app/core/AppWindowHelper.java +++ b/app/src/main/java/io/xpipe/app/core/AppWindowHelper.java @@ -154,12 +154,19 @@ public class AppWindowHelper { AppFont.normal(a.getDialogPane()); var s = (Stage) a.getDialogPane().getScene().getWindow(); s.setOnShown(event -> { - clampWindow(s).ifPresent(rectangle2D -> { - s.setX(rectangle2D.getMinX()); - s.setY(rectangle2D.getMinY()); - // Somehow we have to set max size as setting the normal size does not work? - s.setMaxWidth(rectangle2D.getWidth()); - s.setMaxHeight(rectangle2D.getHeight()); + Platform.runLater(() -> { + // On some platforms, e.g. KDE with wayland, the screen size is not known when the window is first shown + // This fixes the alignment in these cases + if (s.getX() == 0 && s.getY() == 0) { + s.centerOnScreen(); + } + clampWindow(s).ifPresent(rectangle2D -> { + s.setX(rectangle2D.getMinX()); + s.setY(rectangle2D.getMinY()); + // Somehow we have to set max size as setting the normal size does not work? + s.setMaxWidth(rectangle2D.getWidth()); + s.setMaxHeight(rectangle2D.getHeight()); + }); }); event.consume(); }); diff --git a/app/src/main/java/io/xpipe/app/util/InputHelper.java b/app/src/main/java/io/xpipe/app/util/InputHelper.java index 10296b43..99325f5b 100644 --- a/app/src/main/java/io/xpipe/app/util/InputHelper.java +++ b/app/src/main/java/io/xpipe/app/util/InputHelper.java @@ -83,19 +83,12 @@ public class InputHelper { target.addEventFilter(KeyEvent.KEY_PRESSED, event -> { var c = event.getCode(); var list = List.of( - KeyCode.LEFT, - KeyCode.RIGHT, - KeyCode.UP, - KeyCode.DOWN, KeyCode.SPACE, KeyCode.ENTER, KeyCode.SHIFT, - KeyCode.TAB, - KeyCode.NUMPAD2, - KeyCode.NUMPAD4, - KeyCode.NUMPAD6, - KeyCode.NUMPAD8); - r.accept(list.stream().anyMatch(keyCode -> keyCode == c)); + KeyCode.TAB + ); + r.accept(list.stream().anyMatch(keyCode -> keyCode == c) || event.getCode().isNavigationKey()); }); target.addEventFilter(MouseEvent.MOUSE_PRESSED, event -> { r.accept(false);