From 75ec4e5be3db969d24abe459bc531aeee3f06588 Mon Sep 17 00:00:00 2001 From: Alex Bates Date: Sun, 01 Feb 2026 22:40:50 +0000 Subject: [PATCH] Logger.broadcast: use invokeLater when not event dispatch thread Many Logger listeners try to do Swing things, so run them on the event dispatch thread. Fixes a hard freeze on Linux when loading some editors. --- src/main/java/util/Logger.java | 27 ++++++++++++++++++++------- 1 file(s) changed, 20 insertion(s)(+), 7 deletion(s)(-) diff --git a/src/main/java/util/Logger.java b/src/main/java/util/Logger.java --- a/src/main/java/util/Logger.java +++ b/src/main/java/util/Logger.java @@ -6,6 +6,7 @@ import java.util.Iterator; import java.util.LinkedList; import java.util.List; +import javax.swing.SwingUtilities; public abstract class Logger { @@ -99,13 +100,21 @@ switch (p) { case UPDATE: // update messages are only intended for the progress listener - if (progressListener != null) - progressListener.post(msg); + if (progressListener != null) { + if (SwingUtilities.isEventDispatchThread()) + progressListener.post(msg); + else + SwingUtilities.invokeLater(() -> progressListener.post(msg)); + } return; case MILESTONE: - // progress listener also recieves milestone messages - if (progressListener != null) - progressListener.post(msg); + // progress listener also receives milestone messages + if (progressListener != null) { + if (SwingUtilities.isEventDispatchThread()) + progressListener.post(msg); + else + SwingUtilities.invokeLater(() -> progressListener.post(msg)); + } break; case WARNING: text = "WARNING: " + text; @@ -127,8 +136,12 @@ if (p.lessThan(minListenerPriority)) return; for (ListenerReference ref : listeners) { - if (!p.lessThan(ref.priority)) - ref.listener.post(msg); + if (!p.lessThan(ref.priority)) { + if (SwingUtilities.isEventDispatchThread()) + ref.listener.post(msg); + else + SwingUtilities.invokeLater(() -> ref.listener.post(msg)); + } } } -- tangled.sh