From b20aed0d3cdfbd40c39965e899b8cee20a7fec53 Mon Sep 17 00:00:00 2001 From: crschnick Date: Sat, 4 Apr 2026 00:44:39 +0000 Subject: [PATCH] Fix concurrent modification possibility for validators --- .../app/core/AppConfigurationDialog.java | 54 ++++++++++--------- 1 file changed, 29 insertions(+), 25 deletions(-) diff --git a/app/src/main/java/io/xpipe/app/core/AppConfigurationDialog.java b/app/src/main/java/io/xpipe/app/core/AppConfigurationDialog.java index c3c1a50d8..a217d3fcf 100644 --- a/app/src/main/java/io/xpipe/app/core/AppConfigurationDialog.java +++ b/app/src/main/java/io/xpipe/app/core/AppConfigurationDialog.java @@ -11,6 +11,7 @@ import io.xpipe.app.prefs.PersonalizationCategory; import io.xpipe.app.prefs.TerminalCategory; import io.xpipe.app.util.DocumentationLink; +import javafx.application.Platform; import javafx.scene.layout.Region; public class AppConfigurationDialog { @@ -20,32 +21,35 @@ public class AppConfigurationDialog { return; } - var options = new OptionsBuilder() - .sub(PersonalizationCategory.languageChoice()) - .sub(PersonalizationCategory.themeChoice()) - .sub(TerminalCategory.terminalChoice(false)) - .sub(EditorCategory.editorChoice()) - .sub(PasswordManagerCategory.passwordManagerChoice()) - .buildComp(); - options.style("initial-setup"); - options.style("prefs-container"); + // Enforce that everything is created on the platform thread to align with prefs comp + Platform.runLater(() -> { + var options = new OptionsBuilder() + .sub(PersonalizationCategory.languageChoice()) + .sub(PersonalizationCategory.themeChoice()) + .sub(TerminalCategory.terminalChoice(false)) + .sub(EditorCategory.editorChoice()) + .sub(PasswordManagerCategory.passwordManagerChoice()) + .buildComp(); + options.style("initial-setup"); + options.style("prefs-container"); - var scroll = new ScrollComp(options); - scroll.apply(struc -> { - struc.prefHeightProperty().bind(((Region) struc.getContent()).heightProperty()); + var scroll = new ScrollComp(options); + scroll.apply(struc -> { + struc.prefHeightProperty().bind(((Region) struc.getContent()).heightProperty()); + }); + scroll.minWidth(650); + scroll.prefWidth(650); + + var modal = ModalOverlay.of("initialSetup", scroll); + modal.addButton(new ModalButton( + "docs", + () -> { + DocumentationLink.INTRO.open(); + }, + false, + false)); + modal.addButton(ModalButton.ok()); + AppDialog.show(modal); }); - scroll.minWidth(650); - scroll.prefWidth(650); - - var modal = ModalOverlay.of("initialSetup", scroll); - modal.addButton(new ModalButton( - "docs", - () -> { - DocumentationLink.INTRO.open(); - }, - false, - false)); - modal.addButton(ModalButton.ok()); - AppDialog.show(modal); } }