From bfce00104a2be6a3153635c783acbce1a9d81f8a Mon Sep 17 00:00:00 2001 From: peter Date: Mon, 24 Oct 2016 09:57:21 +0200 Subject: [PATCH] perform macro playback typing and action invocation in a write-safe context even when focus has already settled down (IDEA-CR-14356) --- .../openapi/ui/playback/commands/ActionCommand.java | 5 ++--- .../ui/playback/commands/AlphaNumericTypeCommand.java | 6 ++---- .../ui/playback/commands/KeyCodeTypeCommand.java | 6 ++---- .../openapi/ui/playback/commands/TypeCommand.java | 10 ++++++++++ 4 files changed, 16 insertions(+), 11 deletions(-) diff --git a/platform/platform-impl/src/com/intellij/openapi/ui/playback/commands/ActionCommand.java b/platform/platform-impl/src/com/intellij/openapi/ui/playback/commands/ActionCommand.java index 38e1e071653c..5a0257289d7c 100644 --- a/platform/platform-impl/src/com/intellij/openapi/ui/playback/commands/ActionCommand.java +++ b/platform/platform-impl/src/com/intellij/openapi/ui/playback/commands/ActionCommand.java @@ -25,7 +25,6 @@ import com.intellij.openapi.util.ActionCallback; import com.intellij.openapi.util.Ref; import com.intellij.openapi.util.TimedOutCallback; import com.intellij.openapi.util.registry.Registry; -import com.intellij.openapi.wm.IdeFocusManager; import javax.swing.*; import java.awt.event.InputEvent; @@ -76,7 +75,7 @@ public class ActionCommand extends TypeCommand { final KeyStroke finalStroke = stroke; - IdeFocusManager.getGlobalInstance().doWhenFocusSettlesDown(() -> { + inWriteSafeContext(() -> { final Ref listener = new Ref<>(); listener.set(new AnActionListener.Adapter() { @@ -99,7 +98,7 @@ public class ActionCommand extends TypeCommand { am.addAnActionListener(listener.get()); context.runPooledThread(() -> type(context.getRobot(), finalStroke)); - }, ModalityState.current()); + }); return result; } diff --git a/platform/platform-impl/src/com/intellij/openapi/ui/playback/commands/AlphaNumericTypeCommand.java b/platform/platform-impl/src/com/intellij/openapi/ui/playback/commands/AlphaNumericTypeCommand.java index 4d7edfeefcfb..e91506b900e6 100644 --- a/platform/platform-impl/src/com/intellij/openapi/ui/playback/commands/AlphaNumericTypeCommand.java +++ b/platform/platform-impl/src/com/intellij/openapi/ui/playback/commands/AlphaNumericTypeCommand.java @@ -16,11 +16,9 @@ package com.intellij.openapi.ui.playback.commands; import com.intellij.openapi.application.ApplicationManager; -import com.intellij.openapi.application.ModalityState; import com.intellij.openapi.ui.TypingTarget; import com.intellij.openapi.ui.playback.PlaybackContext; import com.intellij.openapi.util.ActionCallback; -import com.intellij.openapi.wm.IdeFocusManager; import org.jetbrains.annotations.Nullable; import javax.swing.*; @@ -40,14 +38,14 @@ public class AlphaNumericTypeCommand extends TypeCommand { protected ActionCallback type(final PlaybackContext context, final String text) { final ActionCallback result = new ActionCallback(); - IdeFocusManager.getGlobalInstance().doWhenFocusSettlesDown(() -> { + inWriteSafeContext(() -> { TypingTarget typingTarget = findTarget(context); if (typingTarget != null) { typingTarget.type(text).doWhenDone(result.createSetDoneRunnable()).doWhenRejected(() -> typeByRobot(context.getRobot(), text).notify(result)); } else { typeByRobot(context.getRobot(), text).notify(result); } - }, ModalityState.current()); + }); return result; } diff --git a/platform/platform-impl/src/com/intellij/openapi/ui/playback/commands/KeyCodeTypeCommand.java b/platform/platform-impl/src/com/intellij/openapi/ui/playback/commands/KeyCodeTypeCommand.java index 60e70e47fefd..25f3afaa49b9 100644 --- a/platform/platform-impl/src/com/intellij/openapi/ui/playback/commands/KeyCodeTypeCommand.java +++ b/platform/platform-impl/src/com/intellij/openapi/ui/playback/commands/KeyCodeTypeCommand.java @@ -16,12 +16,10 @@ package com.intellij.openapi.ui.playback.commands; import com.intellij.openapi.application.ApplicationManager; -import com.intellij.openapi.application.ModalityState; import com.intellij.openapi.ui.TypingTarget; import com.intellij.openapi.ui.playback.PlaybackContext; import com.intellij.openapi.util.ActionCallback; import com.intellij.openapi.util.Couple; -import com.intellij.openapi.wm.IdeFocusManager; import javax.swing.*; import java.awt.*; @@ -61,14 +59,14 @@ public class KeyCodeTypeCommand extends AlphaNumericTypeCommand { final ActionCallback result = new ActionCallback(); - IdeFocusManager.getGlobalInstance().doWhenFocusSettlesDown(() -> { + inWriteSafeContext(() -> { TypingTarget typingTarget = findTarget(context); if (typingTarget != null) { typingTarget.type(unicode).doWhenDone(result.createSetDoneRunnable()).doWhenRejected(() -> typeCodes(context, context.getRobot(), codes).notify(result)); } else { typeCodes(context, context.getRobot(), codes).notify(result); } - }, ModalityState.current()); + }); return result; } diff --git a/platform/platform-impl/src/com/intellij/openapi/ui/playback/commands/TypeCommand.java b/platform/platform-impl/src/com/intellij/openapi/ui/playback/commands/TypeCommand.java index 34aeb1ab615b..155e6f2cec17 100644 --- a/platform/platform-impl/src/com/intellij/openapi/ui/playback/commands/TypeCommand.java +++ b/platform/platform-impl/src/com/intellij/openapi/ui/playback/commands/TypeCommand.java @@ -15,7 +15,10 @@ */ package com.intellij.openapi.ui.playback.commands; +import com.intellij.openapi.application.ApplicationManager; +import com.intellij.openapi.application.ModalityState; import com.intellij.openapi.util.registry.Registry; +import com.intellij.openapi.wm.IdeFocusManager; import org.intellij.lang.annotations.JdkConstants; import javax.swing.*; @@ -102,4 +105,11 @@ public abstract class TypeCommand extends AbstractCommand { return false; } + + static void inWriteSafeContext(Runnable runnable) { + ModalityState modality = ModalityState.current(); + ApplicationManager.getApplication().invokeLater( + () -> IdeFocusManager.getGlobalInstance().doWhenFocusSettlesDown(runnable, modality), + modality); + } }