diff options
Diffstat (limited to 'platform/platform-impl/src/com/intellij/ide/IdeEventQueue.java')
-rw-r--r-- | platform/platform-impl/src/com/intellij/ide/IdeEventQueue.java | 26 |
1 files changed, 24 insertions, 2 deletions
diff --git a/platform/platform-impl/src/com/intellij/ide/IdeEventQueue.java b/platform/platform-impl/src/com/intellij/ide/IdeEventQueue.java index e92f80ffc95c..1bbd74984fcc 100644 --- a/platform/platform-impl/src/com/intellij/ide/IdeEventQueue.java +++ b/platform/platform-impl/src/com/intellij/ide/IdeEventQueue.java @@ -44,6 +44,7 @@ import com.intellij.util.ReflectionUtil; import com.intellij.util.containers.ContainerUtil; import com.intellij.util.containers.HashMap; import com.intellij.util.ui.UIUtil; +import com.sun.java.swing.plaf.windows.WindowsLookAndFeel; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -53,6 +54,7 @@ import java.awt.*; import java.awt.event.*; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; +import java.lang.reflect.Field; import java.lang.reflect.Method; import java.util.*; import java.util.List; @@ -731,9 +733,29 @@ public class IdeEventQueue extends EventQueue { } } + private static Field stickyAltField; //IDEA-17359 private static void fixStickyAlt(AWTEvent e) { - if (SystemInfo.isWindowsXP && e instanceof KeyEvent && ((KeyEvent)e).getKeyCode() == KeyEvent.VK_ALT) { + if (Registry.is("actionSystem.win.suppressAlt.new")) { + if (SystemInfo.isWindows + && UIManager.getLookAndFeel() instanceof WindowsLookAndFeel + && e instanceof InputEvent + && (((InputEvent)e).getModifiers() & (InputEvent.ALT_MASK | InputEvent.ALT_DOWN_MASK)) != 0 + && !(e instanceof KeyEvent && ((KeyEvent)e).getKeyCode() == KeyEvent.VK_ALT)) { + try { + if (stickyAltField == null) { + stickyAltField = Class + .forName("com.sun.java.swing.plaf.windows.WindowsRootPaneUI$AltProcessor") + .getDeclaredField("menuCanceledOnPress"); + stickyAltField.setAccessible(true); + } + stickyAltField.set(null, true); + } + catch (Exception exception) { + LOG.error(exception); + } + } + } else if (SystemInfo.isWindowsXP && e instanceof KeyEvent && ((KeyEvent)e).getKeyCode() == KeyEvent.VK_ALT) { ((KeyEvent)e).consume(); } } @@ -940,7 +962,7 @@ public class IdeEventQueue extends EventQueue { @Override public boolean dispatch(AWTEvent e) { boolean dispatch = true; - if (e instanceof KeyEvent) { + if (!Registry.is("actionSystem.win.suppressAlt.new") && e instanceof KeyEvent) { KeyEvent ke = (KeyEvent)e; final Component component = ke.getComponent(); final Window window = component == null ? null : SwingUtilities.windowForComponent(component); |