diff --git a/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/themes/AbstractThemeManager.java b/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/themes/AbstractThemeManager.java index 373ab4bf5..2ccdd38a4 100644 --- a/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/themes/AbstractThemeManager.java +++ b/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/themes/AbstractThemeManager.java @@ -54,7 +54,7 @@ public ITheme[] getThemes() { @Override public ITheme getDefaultTheme() { - return getDefaultTheme(UI.isDarkEclipseTheme()); + return getDefaultTheme(UI.runSync(UI::isDarkEclipseTheme)); } @Override @@ -87,7 +87,7 @@ public ITheme[] getThemes(final boolean dark) { @Override public ITheme getThemeForScope(final String scopeName) { - return getThemeForScope(scopeName, UI.isDarkEclipseTheme()); + return getThemeForScope(scopeName, UI.runSync(UI::isDarkEclipseTheme)); } @Override diff --git a/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/utils/UI.java b/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/utils/UI.java index 3b4a0cbc2..f0bdfa69b 100644 --- a/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/utils/UI.java +++ b/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/utils/UI.java @@ -11,12 +11,16 @@ *******************************************************************************/ package org.eclipse.tm4e.ui.internal.utils; +import java.util.concurrent.atomic.AtomicReference; +import java.util.function.Supplier; + import org.eclipse.jdt.annotation.Nullable; import org.eclipse.jface.dialogs.Dialog; import org.eclipse.jface.resource.JFaceResources; import org.eclipse.jface.text.ITextViewer; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.jface.viewers.TableViewer; +import org.eclipse.swt.SWTException; import org.eclipse.swt.events.ModifyEvent; import org.eclipse.swt.events.ModifyListener; import org.eclipse.swt.graphics.Color; @@ -176,6 +180,36 @@ public static boolean isDarkEclipseTheme() { return isDarkColor(shell.getBackground()); } + public static boolean isUIThread() { + return Display.getCurrent() != null; + } + + /** + * Runs the given runnable synchronously on the UI thread + * + * @throws SWTException if the {@link Display} has been disposed + */ + public static T runSync(final Supplier runnable) { + if (isUIThread()) + return runnable.get(); + + final var resultRef = new AtomicReference(); + final var exRef = new AtomicReference<@Nullable RuntimeException>(); + getDisplay().syncExec(() -> { + try { + resultRef.set(runnable.get()); + } catch (final RuntimeException ex) { + exRef.set(ex); + } + }); + + final @Nullable RuntimeException ex = exRef.get(); + if (ex != null) { + throw ex; + } + return resultRef.get(); + } + private UI() { } }