An option to view simplified shortcuts on macOS
authorKonstantin Bulenkov <kb@jetbrains.com>
Mon, 10 Aug 2020 16:58:57 +0000 (18:58 +0200)
committerintellij-monorepo-bot <intellij-monorepo-bot-no-reply@jetbrains.com>
Mon, 10 Aug 2020 17:19:42 +0000 (17:19 +0000)
GitOrigin-RevId: 765f8cc8bf369347c4c6404c30d386f64648c164

platform/platform-api/src/com/intellij/openapi/keymap/KeymapUtil.java
platform/platform-api/src/com/intellij/openapi/keymap/MacKeymapUtil.java
platform/util/resources/misc/registry.properties

index 18f3bb918d9d6381f2f62e35d420ab8d2e96213c..64c684c6e18699c93b8e0edb25e9c6af76d1e211 100644 (file)
@@ -143,7 +143,7 @@ public final class KeymapUtil {
   @NotNull
   public static String getKeystrokeText(KeyStroke accelerator) {
     if (accelerator == null) return "";
-    if (SystemInfo.isMac) {
+    if (isNativeMacShortcuts()) {
       return MacKeymapUtil.getKeyStrokeText(accelerator);
     }
     String acceleratorText = "";
@@ -152,7 +152,8 @@ public final class KeymapUtil {
       acceleratorText = getModifiersText(modifiers);
     }
 
-    acceleratorText += getKeyText(accelerator.getKeyCode());
+    int code = accelerator.getKeyCode();
+    acceleratorText += isSimplifiedMacShortcuts() ? getSimplifiedMacKeyText(code) : getKeyText(code);
     return acceleratorText.trim();
   }
 
@@ -171,14 +172,22 @@ public final class KeymapUtil {
       case KeyEvent.VK_EQUALS:         return "=";
     }
 
-    String result = SystemInfo.isMac ? MacKeymapUtil.getKeyText(code) : KeyEvent.getKeyText(code);
+    String result = isNativeMacShortcuts() ? MacKeymapUtil.getKeyText(code) : KeyEvent.getKeyText(code);
     // [vova] this is dirty fix for bug #35092
     return CANCEL_KEY_TEXT.equals(result) ? BREAK_KEY_TEXT : result;
   }
 
+  private static boolean isNativeMacShortcuts() {
+    return SystemInfo.isMac && !isSimplifiedMacShortcuts();
+  }
+  
+  private static boolean isSimplifiedMacShortcuts() {
+    return SystemInfo.isMac && Registry.is("ide.macos.disable.native.shortcut.symbols", false);
+  }
+
   @NotNull
   private static String getModifiersText(@JdkConstants.InputEventMask int modifiers) {
-    if (SystemInfo.isMac) {
+    if (isNativeMacShortcuts()) {
       //try {
       //  Class appleLaf = Class.forName(APPLE_LAF_AQUA_LOOK_AND_FEEL_CLASS_NAME);
       //  Method getModifiers = appleLaf.getMethod(GET_KEY_MODIFIERS_TEXT_METHOD, int.class, boolean.class);
@@ -194,10 +203,27 @@ public final class KeymapUtil {
       return MacKeymapUtil.getModifiersText(modifiers);
     }
 
-    final String keyModifiersText = KeyEvent.getKeyModifiersText(modifiers);
+    final String keyModifiersText = isSimplifiedMacShortcuts() ? getSimplifiedMacKeyModifiersText(modifiers)
+                                                               : KeyEvent.getKeyModifiersText(modifiers);
+
     return keyModifiersText.isEmpty() ? keyModifiersText : keyModifiersText + "+";
   }
 
+  private static String getSimplifiedMacKeyModifiersText(int modifiers) {
+    StringBuilder buf = new StringBuilder();
+
+    if ((modifiers & InputEvent.META_MASK) != 0)      buf.append("Command+");
+    if ((modifiers & InputEvent.CTRL_MASK) != 0)      buf.append("Control+");
+    if ((modifiers & InputEvent.ALT_MASK) != 0)       buf.append( "Option+");
+    if ((modifiers & InputEvent.SHIFT_MASK) != 0)     buf.append( "Shift+");
+    if ((modifiers & InputEvent.ALT_GRAPH_MASK) != 0) buf.append("Alt Graph+");
+    if ((modifiers & InputEvent.BUTTON1_MASK) != 0)   buf.append("Button1+");
+
+    if (buf.length() > 0) buf.setLength(buf.length() - 1);
+
+    return buf.toString();
+  }
+
   @NotNull
   public static ShortcutSet getActiveKeymapShortcuts(@Nullable @NonNls String actionId) {
     KeymapManager keymapManager = KeymapManager.getInstance();
@@ -207,6 +233,87 @@ public final class KeymapUtil {
     return new CustomShortcutSet(keymapManager.getActiveKeymap().getShortcuts(actionId));
   }
 
+  private static String getSimplifiedMacKeyText(int code) {
+    switch(code) {
+      case KeyEvent.VK_ENTER: return "Enter";
+      case KeyEvent.VK_BACK_SPACE: return "Backspace";
+      case KeyEvent.VK_TAB: return "Tab";
+      case KeyEvent.VK_CANCEL: return "Cancel";
+      case KeyEvent.VK_CLEAR: return "Clear";
+      case KeyEvent.VK_COMPOSE: return "Compose";
+      case KeyEvent.VK_PAUSE: return "Pause";
+      case KeyEvent.VK_CAPS_LOCK: return "Caps Lock";
+      case KeyEvent.VK_ESCAPE: return "Escape";
+      case KeyEvent.VK_SPACE: return "Space";
+      case KeyEvent.VK_PAGE_UP: return "Page Up";
+      case KeyEvent.VK_PAGE_DOWN: return "Page Down";
+      case KeyEvent.VK_END: return "End";
+      case KeyEvent.VK_HOME: return "Home";
+      case KeyEvent.VK_LEFT: return "Left";
+      case KeyEvent.VK_UP: return "Up";
+      case KeyEvent.VK_RIGHT: return "Right";
+      case KeyEvent.VK_DOWN: return "Down";
+      case KeyEvent.VK_BEGIN: return "Begin";
+
+      // modifiers
+      case KeyEvent.VK_SHIFT: return "Shift";
+      case KeyEvent.VK_CONTROL: return "Control";
+      case KeyEvent.VK_ALT: return "Alt";
+      case KeyEvent.VK_META: return "Meta";
+      case KeyEvent.VK_ALT_GRAPH: return "Alt Graph";
+
+      // numpad numeric keys handled below
+      case KeyEvent.VK_MULTIPLY: return "NumPad *";
+      case KeyEvent.VK_ADD: return "NumPad +";
+      case KeyEvent.VK_SEPARATOR: return "NumPad ,";
+      case KeyEvent.VK_SUBTRACT: return "NumPad -";
+      case KeyEvent.VK_DECIMAL: return "NumPad .";
+      case KeyEvent.VK_DIVIDE: return "NumPad /";
+      case KeyEvent.VK_DELETE: return "Delete";
+      case KeyEvent.VK_NUM_LOCK: return "Num Lock";
+      case KeyEvent.VK_SCROLL_LOCK: return "Scroll Lock";
+
+      case KeyEvent.VK_WINDOWS: return "Windows";
+      case KeyEvent.VK_CONTEXT_MENU: return "Context Menu";
+
+      case KeyEvent.VK_F1: return "F1";
+      case KeyEvent.VK_F2: return "F2";
+      case KeyEvent.VK_F3: return "F3";
+      case KeyEvent.VK_F4: return "F4";
+      case KeyEvent.VK_F5: return "F5";
+      case KeyEvent.VK_F6: return "F6";
+      case KeyEvent.VK_F7: return "F7";
+      case KeyEvent.VK_F8: return "F8";
+      case KeyEvent.VK_F9: return "F9";
+      case KeyEvent.VK_F10: return "F10";
+      case KeyEvent.VK_F11: return "F11";
+      case KeyEvent.VK_F12: return "F12";
+      case KeyEvent.VK_F13: return "F13";
+      case KeyEvent.VK_F14: return "F14";
+      case KeyEvent.VK_F15: return "F15";
+      case KeyEvent.VK_F16: return "F16";
+      case KeyEvent.VK_F17: return "F17";
+      case KeyEvent.VK_F18: return "F18";
+      case KeyEvent.VK_F19: return "F19";
+      case KeyEvent.VK_F20: return "F20";
+      case KeyEvent.VK_F21: return "F21";
+      case KeyEvent.VK_F22: return "F22";
+      case KeyEvent.VK_F23: return "F23";
+      case KeyEvent.VK_F24: return "F24";
+
+      case KeyEvent.VK_PRINTSCREEN: return "Print Screen";
+      case KeyEvent.VK_INSERT: return "Insert";
+      case KeyEvent.VK_HELP: return "Help";
+
+      case KeyEvent.VK_KP_UP: return "Up";
+      case KeyEvent.VK_KP_DOWN: return "Down";
+      case KeyEvent.VK_KP_LEFT: return "Left";
+      case KeyEvent.VK_KP_RIGHT: return "Right";
+    }
+
+    return getKeyText(code);
+  }
+
   /**
    * @param actionId action to find the shortcut for
    * @return first keyboard shortcut that activates given action in active keymap; null if not found
index 57ef0c2948d996019b8ccefd73b2d371bfc7292f..322d998bbc2d3d1920a569745381df8d67cbb72d 100644 (file)
@@ -1,6 +1,7 @@
 // Copyright 2000-2020 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
 package com.intellij.openapi.keymap;
 
+import com.intellij.openapi.util.registry.Registry;
 import com.intellij.util.ui.UIUtil;
 import org.intellij.lang.annotations.JdkConstants;
 import org.jetbrains.annotations.NotNull;
@@ -60,41 +61,43 @@ public final class MacKeymapUtil {
 
   @NotNull
   public static String getKeyText(int code) {
-    switch (code) {
-      case KeyEvent.VK_BACK_SPACE:     return get(BACKSPACE, "Backspace");
-      case KeyEvent.VK_ESCAPE:         return get(ESCAPE, "Escape");
-      case KeyEvent.VK_CAPS_LOCK:      return get(CAPS_LOCK, "Caps Lock");
-      case KeyEvent.VK_TAB:            return get(TAB, "Tab");
-      case KeyEvent.VK_SPACE:          return "Space";
-      case KeyEvent.VK_DELETE:         return get(DELETE, "Delete");
-      case KeyEvent.VK_HOME:           return get(HOME, "Home");
-      case KeyEvent.VK_END:            return get(END, "End");
-      case KeyEvent.VK_PAGE_UP:        return get(PAGE_UP, "Page Up");
-      case KeyEvent.VK_PAGE_DOWN:      return get(PAGE_DOWN, "Page Down");
-      case KeyEvent.VK_UP:             return get(UP, "Up Arrow");
-      case KeyEvent.VK_DOWN:           return get(DOWN, "Down Arrow");
-      case KeyEvent.VK_LEFT:           return get(LEFT, "Left Arrow");
-      case KeyEvent.VK_RIGHT:          return get(RIGHT, "Right Arrow");
-      case KeyEvent.VK_NUM_LOCK:       return get(NUMBER_LOCK, "Num Lock");
-      case KeyEvent.VK_ENTER:          return get(RETURN, "Return");
-      case KeyEvent.VK_NUMBER_SIGN:    return get(NUM_PAD, "NumPad");
-      case KeyEvent.VK_MULTIPLY:       return get(NUM_PAD, "NumPad") + " *";
-      case KeyEvent.VK_SUBTRACT:       return "-";
-      case KeyEvent.VK_ADD:            return "+";
-      case KeyEvent.VK_MINUS:          return "-";
-      case KeyEvent.VK_PLUS:           return "+";
-      case KeyEvent.VK_DIVIDE:         return get(NUM_PAD, "NumPad") + "/";
-      case KeyEvent.VK_NUMPAD0:        return get(NUM_PAD, "NumPad") + "0";
-      case KeyEvent.VK_NUMPAD1:        return get(NUM_PAD, "NumPad") + "1";
-      case KeyEvent.VK_NUMPAD2:        return get(NUM_PAD, "NumPad") + "2";
-      case KeyEvent.VK_NUMPAD3:        return get(NUM_PAD, "NumPad") + "3";
-      case KeyEvent.VK_NUMPAD4:        return get(NUM_PAD, "NumPad") + "4";
-      case KeyEvent.VK_NUMPAD5:        return get(NUM_PAD, "NumPad") + "5";
-      case KeyEvent.VK_NUMPAD6:        return get(NUM_PAD, "NumPad") + "6";
-      case KeyEvent.VK_NUMPAD7:        return get(NUM_PAD, "NumPad") + "7";
-      case KeyEvent.VK_NUMPAD8:        return get(NUM_PAD, "NumPad") + "8";
-      case KeyEvent.VK_NUMPAD9:        return get(NUM_PAD, "NumPad") + "9";
-      case 0:                          return "fn";
+    if (!Registry.is("ide.macos.disable.native.shortcut.symbols")) {
+      switch (code) {
+        case KeyEvent.VK_BACK_SPACE:     return get(BACKSPACE, "Backspace");
+        case KeyEvent.VK_ESCAPE:         return get(ESCAPE, "Escape");
+        case KeyEvent.VK_CAPS_LOCK:      return get(CAPS_LOCK, "Caps Lock");
+        case KeyEvent.VK_TAB:            return get(TAB, "Tab");
+        case KeyEvent.VK_SPACE:          return "Space";
+        case KeyEvent.VK_DELETE:         return get(DELETE, "Delete");
+        case KeyEvent.VK_HOME:           return get(HOME, "Home");
+        case KeyEvent.VK_END:            return get(END, "End");
+        case KeyEvent.VK_PAGE_UP:        return get(PAGE_UP, "Page Up");
+        case KeyEvent.VK_PAGE_DOWN:      return get(PAGE_DOWN, "Page Down");
+        case KeyEvent.VK_UP:             return get(UP, "Up Arrow");
+        case KeyEvent.VK_DOWN:           return get(DOWN, "Down Arrow");
+        case KeyEvent.VK_LEFT:           return get(LEFT, "Left Arrow");
+        case KeyEvent.VK_RIGHT:          return get(RIGHT, "Right Arrow");
+        case KeyEvent.VK_NUM_LOCK:       return get(NUMBER_LOCK, "Num Lock");
+        case KeyEvent.VK_ENTER:          return get(RETURN, "Return");
+        case KeyEvent.VK_NUMBER_SIGN:    return get(NUM_PAD, "NumPad");
+        case KeyEvent.VK_MULTIPLY:       return get(NUM_PAD, "NumPad") + " *";
+        case KeyEvent.VK_SUBTRACT:       return "-";
+        case KeyEvent.VK_ADD:            return "+";
+        case KeyEvent.VK_MINUS:          return "-";
+        case KeyEvent.VK_PLUS:           return "+";
+        case KeyEvent.VK_DIVIDE:         return get(NUM_PAD, "NumPad") + "/";
+        case KeyEvent.VK_NUMPAD0:        return get(NUM_PAD, "NumPad") + "0";
+        case KeyEvent.VK_NUMPAD1:        return get(NUM_PAD, "NumPad") + "1";
+        case KeyEvent.VK_NUMPAD2:        return get(NUM_PAD, "NumPad") + "2";
+        case KeyEvent.VK_NUMPAD3:        return get(NUM_PAD, "NumPad") + "3";
+        case KeyEvent.VK_NUMPAD4:        return get(NUM_PAD, "NumPad") + "4";
+        case KeyEvent.VK_NUMPAD5:        return get(NUM_PAD, "NumPad") + "5";
+        case KeyEvent.VK_NUMPAD6:        return get(NUM_PAD, "NumPad") + "6";
+        case KeyEvent.VK_NUMPAD7:        return get(NUM_PAD, "NumPad") + "7";
+        case KeyEvent.VK_NUMPAD8:        return get(NUM_PAD, "NumPad") + "8";
+        case KeyEvent.VK_NUMPAD9:        return get(NUM_PAD, "NumPad") + "9";
+        case 0:                          return "fn";
+      }
     }
     return KeyEvent.getKeyText(code);
   }
@@ -108,6 +111,9 @@ public final class MacKeymapUtil {
 
   @NotNull
   private static String get(@NotNull String value, @NotNull String replacement) {
+    if (Registry.is("ide.macos.disable.native.shortcut.symbols")) {
+      return replacement;
+    }
     Font font = UIUtil.getLabelFont();
     return font == null || font.canDisplayUpTo(value) == -1 ? value : replacement;
   }
index 0d09d0167c6dbfd285eb8fd1fa9035ae9a174b21..49af97c6827217cd6f4ac4944629b9e3d9df8cfc 100644 (file)
@@ -183,6 +183,8 @@ ide.tree.painter.compact.default.description=Enables default version of compact
 
 ide.macos.main.menu.alignment.options=[Native*|Aligned|Aligned in group|No icons]
 ide.macos.main.menu.align.description=Native - align menu items as macOS does, Aligned - align menu items vertically inside a group, No icons - hide icons
+ide.macos.disable.native.shortcut.symbols=false
+ide.macos.disable.native.shortcut.symbols.description=Change shortcut symbols \u238B, \u232B, \u2325, and others to Esc, Backspace, Option, etc
 ide.splitter.mouseZone=6
 
 ide.autoscroll.from.source.delay=100