From d57b5679080e5894eb5dda54c591333753ab1843 Mon Sep 17 00:00:00 2001 From: Sergey Malenkov Date: Wed, 7 Nov 2018 20:57:50 +0300 Subject: [PATCH] IDEA-198957: Regression: Mnemonics broken on almost all of the Window submenu items --- .../keymap/impl/IdeKeyEventDispatcher.java | 24 ++++++++++++------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/platform/platform-impl/src/com/intellij/openapi/keymap/impl/IdeKeyEventDispatcher.java b/platform/platform-impl/src/com/intellij/openapi/keymap/impl/IdeKeyEventDispatcher.java index 03e9a5d70f41..da0a234ffb8e 100644 --- a/platform/platform-impl/src/com/intellij/openapi/keymap/impl/IdeKeyEventDispatcher.java +++ b/platform/platform-impl/src/com/intellij/openapi/keymap/impl/IdeKeyEventDispatcher.java @@ -96,6 +96,7 @@ public final class IdeKeyEventDispatcher implements Disposable { * KEY_TYPED event because they are not valid. */ private boolean myPressedWasProcessed; + private boolean myIgnoreNextKeyTypedEvent; private KeyState myState = KeyState.STATE_INIT; private final PresentationFactory myPresentationFactory = new PresentationFactory(); @@ -141,6 +142,11 @@ public final class IdeKeyEventDispatcher implements Disposable { return false; } + if (myIgnoreNextKeyTypedEvent) { + if (KeyEvent.KEY_TYPED == e.getID()) return true; + myIgnoreNextKeyTypedEvent = false; + } + if (isSpeedSearchEditing(e)) { return false; } @@ -446,15 +452,10 @@ public final class IdeKeyEventDispatcher implements Disposable { return true; } - if (SystemInfo.isMac) { - boolean keyTyped = e.getID() == KeyEvent.KEY_TYPED; - boolean hasMnemonicsInWindow = e.getID() == KeyEvent.KEY_PRESSED && hasMnemonicInWindow(focusOwner, e.getKeyCode()) || - keyTyped && hasMnemonicInWindow(focusOwner, e.getKeyChar()); - boolean imEnabled = IdeEventQueue.getInstance().isInputMethodEnabled(); - - if (e.getModifiersEx() == InputEvent.ALT_DOWN_MASK && (hasMnemonicsInWindow || !imEnabled && keyTyped)) { - setPressedWasProcessed(true); - setState(KeyState.STATE_PROCESSED); + if (SystemInfo.isMac && InputEvent.ALT_DOWN_MASK == e.getModifiersEx() && Registry.is("ide.mac.alt.mnemonic.without.ctrl")) { + // the myIgnoreNextKeyTypedEvent changes event processing to support Alt-based mnemonics on Mac only + if (KeyEvent.KEY_TYPED == e.getID() && !IdeEventQueue.getInstance().isInputMethodEnabled() || hasMnemonicInWindow(focusOwner, e)) { + myIgnoreNextKeyTypedEvent = true; return false; } } @@ -537,6 +538,11 @@ public final class IdeKeyEventDispatcher implements Disposable { return secondKeyStrokes; } + private static boolean hasMnemonicInWindow(Component focusOwner, KeyEvent event) { + return KeyEvent.KEY_TYPED == event.getID() && hasMnemonicInWindow(focusOwner, event.getKeyChar()) || + KeyEvent.KEY_PRESSED == event.getID() && hasMnemonicInWindow(focusOwner, event.getKeyCode()); + } + private static boolean hasMnemonicInWindow(Component focusOwner, int keyCode) { if (keyCode == KeyEvent.VK_ALT || keyCode == 0) return false; // Optimization final Container container = focusOwner == null ? null : UIUtil.getWindow(focusOwner);