From f3b549e2846d389080273caadacc7ee18b9c87a8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luca=20G=C3=BCttinger?= <38906805+Luca-Guettinger@users.noreply.github.com> Date: Sat, 30 May 2026 23:55:18 +0200 Subject: [PATCH] Fix crash in PanelSyncHandler and TextFieldHandler --- .../modularui/value/sync/PanelSyncHandler.java | 5 ++++- .../modularui/widgets/textfield/TextFieldHandler.java | 8 +++++--- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/cleanroommc/modularui/value/sync/PanelSyncHandler.java b/src/main/java/com/cleanroommc/modularui/value/sync/PanelSyncHandler.java index 4d1694b7d..64d077c28 100644 --- a/src/main/java/com/cleanroommc/modularui/value/sync/PanelSyncHandler.java +++ b/src/main/java/com/cleanroommc/modularui/value/sync/PanelSyncHandler.java @@ -112,8 +112,11 @@ public void closeSubPanels() { @ApiStatus.Internal @Override public void closePanelInternal() { - getSyncManager().getModularSyncManager().close(this.panelName); this.open = false; + // Sync infrastructure may already be torn down if the screen was disposed + // (e.g. deferred PanelManager.dispose() running after ModularNetwork.closeAll()) + if (!isValid()) return; + getSyncManager().getModularSyncManager().close(this.panelName); if (getSyncManager().isClient()) { syncToServer(SYNC_CLOSE); } diff --git a/src/main/java/com/cleanroommc/modularui/widgets/textfield/TextFieldHandler.java b/src/main/java/com/cleanroommc/modularui/widgets/textfield/TextFieldHandler.java index 2259593b1..ebffeced9 100644 --- a/src/main/java/com/cleanroommc/modularui/widgets/textfield/TextFieldHandler.java +++ b/src/main/java/com/cleanroommc/modularui/widgets/textfield/TextFieldHandler.java @@ -304,8 +304,10 @@ private Point insert(List text, List insertion) { text.addAll(insertion); return new Point(text.get(text.size() - 1).length(), text.size() - 1); } - String lineStart = text.get(this.cursor.y).substring(0, this.cursor.x); - String lineEnd = text.get(this.cursor.y).substring(this.cursor.x); + String line = text.get(this.cursor.y); + int cursorX = Math.min(this.cursor.x, line.length()); + String lineStart = line.substring(0, cursorX); + String lineEnd = line.substring(cursorX); if (insertion.size() == 1 && text.size() == 1 && !test(lineStart + insertion.get(0) + lineEnd)) { return null; } @@ -315,7 +317,7 @@ private Point insert(List text, List insertion) { return null; } text.set(this.cursor.y, text.get(this.cursor.y) + lineEnd); - return new Point(this.cursor.x + insertion.get(0).length(), this.cursor.y); + return new Point(cursorX + insertion.get(0).length(), this.cursor.y); } else { text.add(this.cursor.y + 1, insertion.get(insertion.size() - 1) + lineEnd); x = insertion.get(insertion.size() - 1).length();