From 8b6cbc45524fd87b324fffae95e2d7bd85b979d5 Mon Sep 17 00:00:00 2001 From: Anton Tarasov Date: Tue, 10 Jan 2017 16:07:39 +0300 Subject: [PATCH] IDEA-166384 provide a utility method in IDEA to support JRE-166 --- .../src/com/intellij/ide/IdeEventQueue.java | 32 ++++++++++++++++--- 1 file changed, 28 insertions(+), 4 deletions(-) diff --git a/platform/platform-impl/src/com/intellij/ide/IdeEventQueue.java b/platform/platform-impl/src/com/intellij/ide/IdeEventQueue.java index d10c1cf87199..d4de823b8fb8 100644 --- a/platform/platform-impl/src/com/intellij/ide/IdeEventQueue.java +++ b/platform/platform-impl/src/com/intellij/ide/IdeEventQueue.java @@ -31,10 +31,7 @@ import com.intellij.openapi.keymap.impl.IdeKeyEventDispatcher; import com.intellij.openapi.keymap.impl.IdeMouseEventDispatcher; import com.intellij.openapi.keymap.impl.KeyState; import com.intellij.openapi.ui.JBPopupMenu; -import com.intellij.openapi.util.Condition; -import com.intellij.openapi.util.Disposer; -import com.intellij.openapi.util.ExpirableRunnable; -import com.intellij.openapi.util.SystemInfo; +import com.intellij.openapi.util.*; import com.intellij.openapi.util.registry.Registry; import com.intellij.openapi.wm.IdeFocusManager; import com.intellij.openapi.wm.IdeFrame; @@ -50,6 +47,7 @@ import com.intellij.util.ui.UIUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import sun.awt.AppContext; +import sun.awt.SunToolkit; import javax.swing.*; import javax.swing.plaf.basic.ComboPopup; @@ -1194,4 +1192,30 @@ public class IdeEventQueue extends EventQueue { public void addPostEventListener(@NotNull PostEventHook listener, @NotNull Disposable parentDisposable) { myPostEventListeners.addListener(listener, parentDisposable); } + + private static Ref unsafeNonBlockingExecuteRef; + + /** + * Must be called on the Event Dispatching thread. + * Executes the runnable so that it can perform a non-blocking invocation on the toolkit thread. + * Not for general-purpose usage. + * + * @param r the runnable to execute + */ + public static void unsafeNonblockingExecute(Runnable r) { + assert EventQueue.isDispatchThread(); + if (unsafeNonBlockingExecuteRef == null) { + // The method is available in JBSDK. + unsafeNonBlockingExecuteRef = Ref.create(ReflectionUtil.getDeclaredMethod(SunToolkit.class, "unsafeNonblockingExecute", Runnable.class)); + } + if (unsafeNonBlockingExecuteRef.get() != null) { + try { + unsafeNonBlockingExecuteRef.get().invoke(Toolkit.getDefaultToolkit(), r); + return; + } + catch (Exception ignore) { + } + } + r.run(); + } }