From d9191788a49e0f2c1ec6c091eec7aecc12197425 Mon Sep 17 00:00:00 2001 From: supersaiyansubtlety Date: Sat, 8 Nov 2025 15:21:54 -0800 Subject: [PATCH 1/4] fix crash when Vec2i configs lacked components --- .../main/java/org/quiltmc/enigma/gui/config/Config.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/enigma-swing/src/main/java/org/quiltmc/enigma/gui/config/Config.java b/enigma-swing/src/main/java/org/quiltmc/enigma/gui/config/Config.java index dbb64fbc3..97c43f8d2 100644 --- a/enigma-swing/src/main/java/org/quiltmc/enigma/gui/config/Config.java +++ b/enigma-swing/src/main/java/org/quiltmc/enigma/gui/config/Config.java @@ -32,6 +32,7 @@ import java.awt.Point; import java.nio.file.Path; import java.nio.file.Paths; +import java.util.Objects; /** * Enigma config is separated into several {@value #FORMAT} files with names matching the methods used to access them: @@ -237,7 +238,11 @@ public static Vec2i fromPoint(Point point) { @Override public Vec2i convertFrom(ValueMap representation) { - return new Vec2i(representation.get("x"), representation.get("y")); + final int defaultValue = Objects.requireNonNullElse(representation.getDefaultValue(), 0); + return new Vec2i( + representation.getOrDefault("x", defaultValue), + representation.getOrDefault("y", defaultValue) + ); } @Override From 5357b9245ab308df0556ee72ef14651933c29371 Mon Sep 17 00:00:00 2001 From: supersaiyansubtlety Date: Sat, 8 Nov 2025 15:47:31 -0800 Subject: [PATCH 2/4] clamp window pos on open --- .../main/java/org/quiltmc/enigma/gui/Gui.java | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/enigma-swing/src/main/java/org/quiltmc/enigma/gui/Gui.java b/enigma-swing/src/main/java/org/quiltmc/enigma/gui/Gui.java index 91a69d00a..fd7589b77 100644 --- a/enigma-swing/src/main/java/org/quiltmc/enigma/gui/Gui.java +++ b/enigma-swing/src/main/java/org/quiltmc/enigma/gui/Gui.java @@ -43,6 +43,7 @@ import org.quiltmc.enigma.gui.util.ScaleUtil; import org.quiltmc.enigma.network.ServerMessage; import org.quiltmc.enigma.util.I18n; +import org.quiltmc.enigma.util.Utils; import org.quiltmc.enigma.util.validation.Message; import org.quiltmc.enigma.util.validation.ParameterizedMessage; import org.quiltmc.enigma.util.validation.ValidationContext; @@ -63,6 +64,7 @@ import java.awt.Container; import java.awt.Dimension; import java.awt.Point; +import java.awt.Toolkit; import java.nio.file.Path; import java.util.ArrayList; import java.util.Collection; @@ -77,6 +79,9 @@ import java.util.stream.Stream; public class Gui { + private static final int DEFAULT_MIN_LEFT_ON_SCREEN = 300; + private static final int DEFAULT_MIN_TOP_ON_SCREEN = 200; + private final MainWindow mainWindow; private final GuiController controller; @@ -230,7 +235,19 @@ private void setupUi() { frame.setMinimumSize(ScaleUtil.getDimension(640, 480)); frame.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE); - Point windowPos = Config.main().windowPos.value().toPoint(); + final Point windowPos = Config.main().windowPos.value().toPoint(); + final Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); + + final int clampedX = Utils.clamp(windowPos.x, 0, screenSize.width - ScaleUtil.scale(DEFAULT_MIN_LEFT_ON_SCREEN)); + final int clampedY = Utils.clamp(windowPos.y, 0, screenSize.height - ScaleUtil.scale(DEFAULT_MIN_TOP_ON_SCREEN)); + + if (windowPos.x != clampedX || windowPos.y != clampedY) { + windowPos.x = clampedX; + windowPos.y = clampedY; + + Config.main().windowPos.setValue(Config.Vec2i.fromPoint(windowPos)); + } + frame.setLocation(windowPos); this.retranslateUi(); From 089639ffaa9bd7d9b7f33cebd362b9cc240d2d73 Mon Sep 17 00:00:00 2001 From: supersaiyansubtlety Date: Sat, 8 Nov 2025 15:58:37 -0800 Subject: [PATCH 3/4] improve window pos clamping and add comments --- enigma-swing/src/main/java/org/quiltmc/enigma/gui/Gui.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/enigma-swing/src/main/java/org/quiltmc/enigma/gui/Gui.java b/enigma-swing/src/main/java/org/quiltmc/enigma/gui/Gui.java index fd7589b77..35066e6a2 100644 --- a/enigma-swing/src/main/java/org/quiltmc/enigma/gui/Gui.java +++ b/enigma-swing/src/main/java/org/quiltmc/enigma/gui/Gui.java @@ -79,7 +79,6 @@ import java.util.stream.Stream; public class Gui { - private static final int DEFAULT_MIN_LEFT_ON_SCREEN = 300; private static final int DEFAULT_MIN_TOP_ON_SCREEN = 200; private final MainWindow mainWindow; @@ -238,7 +237,9 @@ private void setupUi() { final Point windowPos = Config.main().windowPos.value().toPoint(); final Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); - final int clampedX = Utils.clamp(windowPos.x, 0, screenSize.width - ScaleUtil.scale(DEFAULT_MIN_LEFT_ON_SCREEN)); + // keep the whole width (or as much as will fit) on-screen so window controls in the title bar are accessible + final int clampedX = Utils.clamp(windowPos.x, 0, Math.max(0, screenSize.width - frame.getSize().width)); + // allow some of the bottom to be off-screen, but not the top, because of the title bar final int clampedY = Utils.clamp(windowPos.y, 0, screenSize.height - ScaleUtil.scale(DEFAULT_MIN_TOP_ON_SCREEN)); if (windowPos.x != clampedX || windowPos.y != clampedY) { From 5f02c236e5913255dc864a37455d534b708860c8 Mon Sep 17 00:00:00 2001 From: supersaiyansubtlety Date: Sat, 8 Nov 2025 16:17:36 -0800 Subject: [PATCH 4/4] use getWidth() instead of getSize().width --- enigma-swing/src/main/java/org/quiltmc/enigma/gui/Gui.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/enigma-swing/src/main/java/org/quiltmc/enigma/gui/Gui.java b/enigma-swing/src/main/java/org/quiltmc/enigma/gui/Gui.java index 35066e6a2..dc37fd791 100644 --- a/enigma-swing/src/main/java/org/quiltmc/enigma/gui/Gui.java +++ b/enigma-swing/src/main/java/org/quiltmc/enigma/gui/Gui.java @@ -238,7 +238,7 @@ private void setupUi() { final Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); // keep the whole width (or as much as will fit) on-screen so window controls in the title bar are accessible - final int clampedX = Utils.clamp(windowPos.x, 0, Math.max(0, screenSize.width - frame.getSize().width)); + final int clampedX = Utils.clamp(windowPos.x, 0, Math.max(0, screenSize.width - frame.getWidth())); // allow some of the bottom to be off-screen, but not the top, because of the title bar final int clampedY = Utils.clamp(windowPos.y, 0, screenSize.height - ScaleUtil.scale(DEFAULT_MIN_TOP_ON_SCREEN));