IDEA-166384 provide a utility method in IDEA to support JRE-166

This commit is contained in:
Anton Tarasov
2017-01-10 16:08:56 +03:00
parent afa542fcb6
commit 8b6cbc4552
@@ -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<Method> 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();
}
}