perform macro playback typing and action invocation in a write-safe context even when focus has already settled down (IDEA-CR-14356)

This commit is contained in:
peter
2016-10-24 09:58:00 +02:00
parent 7620508bc3
commit bfce00104a
4 changed files with 16 additions and 11 deletions
@@ -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<AnActionListener> 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;
}
@@ -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;
}
@@ -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;
}
@@ -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);
}
}