Path: blob/main/src/vs/platform/keybinding/common/usLayoutResolvedKeybinding.ts
3296 views
/*---------------------------------------------------------------------------------------------1* Copyright (c) Microsoft Corporation. All rights reserved.2* Licensed under the MIT License. See License.txt in the project root for license information.3*--------------------------------------------------------------------------------------------*/45import { KeyCode, KeyCodeUtils, IMMUTABLE_CODE_TO_KEY_CODE, ScanCode } from '../../../base/common/keyCodes.js';6import { SingleModifierChord, Chord, KeyCodeChord, Keybinding } from '../../../base/common/keybindings.js';7import { OperatingSystem } from '../../../base/common/platform.js';8import { BaseResolvedKeybinding } from './baseResolvedKeybinding.js';9import { toEmptyArrayIfContainsNull } from './resolvedKeybindingItem.js';1011/**12* Do not instantiate. Use KeybindingService to get a ResolvedKeybinding seeded with information about the current kb layout.13*/14export class USLayoutResolvedKeybinding extends BaseResolvedKeybinding<KeyCodeChord> {1516constructor(chords: KeyCodeChord[], os: OperatingSystem) {17super(os, chords);18}1920private _keyCodeToUILabel(keyCode: KeyCode): string {21if (this._os === OperatingSystem.Macintosh) {22switch (keyCode) {23case KeyCode.LeftArrow:24return '←';25case KeyCode.UpArrow:26return '↑';27case KeyCode.RightArrow:28return '→';29case KeyCode.DownArrow:30return '↓';31}32}33return KeyCodeUtils.toString(keyCode);34}3536protected _getLabel(chord: KeyCodeChord): string | null {37if (chord.isDuplicateModifierCase()) {38return '';39}40return this._keyCodeToUILabel(chord.keyCode);41}4243protected _getAriaLabel(chord: KeyCodeChord): string | null {44if (chord.isDuplicateModifierCase()) {45return '';46}47return KeyCodeUtils.toString(chord.keyCode);48}4950protected _getElectronAccelerator(chord: KeyCodeChord): string | null {51return KeyCodeUtils.toElectronAccelerator(chord.keyCode);52}5354protected _getUserSettingsLabel(chord: KeyCodeChord): string | null {55if (chord.isDuplicateModifierCase()) {56return '';57}58const result = KeyCodeUtils.toUserSettingsUS(chord.keyCode);59return (result ? result.toLowerCase() : result);60}6162protected _isWYSIWYG(): boolean {63return true;64}6566protected _getChordDispatch(chord: KeyCodeChord): string | null {67return USLayoutResolvedKeybinding.getDispatchStr(chord);68}6970public static getDispatchStr(chord: KeyCodeChord): string | null {71if (chord.isModifierKey()) {72return null;73}74let result = '';7576if (chord.ctrlKey) {77result += 'ctrl+';78}79if (chord.shiftKey) {80result += 'shift+';81}82if (chord.altKey) {83result += 'alt+';84}85if (chord.metaKey) {86result += 'meta+';87}88result += KeyCodeUtils.toString(chord.keyCode);8990return result;91}9293protected _getSingleModifierChordDispatch(keybinding: KeyCodeChord): SingleModifierChord | null {94if (keybinding.keyCode === KeyCode.Ctrl && !keybinding.shiftKey && !keybinding.altKey && !keybinding.metaKey) {95return 'ctrl';96}97if (keybinding.keyCode === KeyCode.Shift && !keybinding.ctrlKey && !keybinding.altKey && !keybinding.metaKey) {98return 'shift';99}100if (keybinding.keyCode === KeyCode.Alt && !keybinding.ctrlKey && !keybinding.shiftKey && !keybinding.metaKey) {101return 'alt';102}103if (keybinding.keyCode === KeyCode.Meta && !keybinding.ctrlKey && !keybinding.shiftKey && !keybinding.altKey) {104return 'meta';105}106return null;107}108109/**110* *NOTE*: Check return value for `KeyCode.Unknown`.111*/112private static _scanCodeToKeyCode(scanCode: ScanCode): KeyCode {113const immutableKeyCode = IMMUTABLE_CODE_TO_KEY_CODE[scanCode];114if (immutableKeyCode !== KeyCode.DependsOnKbLayout) {115return immutableKeyCode;116}117118switch (scanCode) {119case ScanCode.KeyA: return KeyCode.KeyA;120case ScanCode.KeyB: return KeyCode.KeyB;121case ScanCode.KeyC: return KeyCode.KeyC;122case ScanCode.KeyD: return KeyCode.KeyD;123case ScanCode.KeyE: return KeyCode.KeyE;124case ScanCode.KeyF: return KeyCode.KeyF;125case ScanCode.KeyG: return KeyCode.KeyG;126case ScanCode.KeyH: return KeyCode.KeyH;127case ScanCode.KeyI: return KeyCode.KeyI;128case ScanCode.KeyJ: return KeyCode.KeyJ;129case ScanCode.KeyK: return KeyCode.KeyK;130case ScanCode.KeyL: return KeyCode.KeyL;131case ScanCode.KeyM: return KeyCode.KeyM;132case ScanCode.KeyN: return KeyCode.KeyN;133case ScanCode.KeyO: return KeyCode.KeyO;134case ScanCode.KeyP: return KeyCode.KeyP;135case ScanCode.KeyQ: return KeyCode.KeyQ;136case ScanCode.KeyR: return KeyCode.KeyR;137case ScanCode.KeyS: return KeyCode.KeyS;138case ScanCode.KeyT: return KeyCode.KeyT;139case ScanCode.KeyU: return KeyCode.KeyU;140case ScanCode.KeyV: return KeyCode.KeyV;141case ScanCode.KeyW: return KeyCode.KeyW;142case ScanCode.KeyX: return KeyCode.KeyX;143case ScanCode.KeyY: return KeyCode.KeyY;144case ScanCode.KeyZ: return KeyCode.KeyZ;145case ScanCode.Digit1: return KeyCode.Digit1;146case ScanCode.Digit2: return KeyCode.Digit2;147case ScanCode.Digit3: return KeyCode.Digit3;148case ScanCode.Digit4: return KeyCode.Digit4;149case ScanCode.Digit5: return KeyCode.Digit5;150case ScanCode.Digit6: return KeyCode.Digit6;151case ScanCode.Digit7: return KeyCode.Digit7;152case ScanCode.Digit8: return KeyCode.Digit8;153case ScanCode.Digit9: return KeyCode.Digit9;154case ScanCode.Digit0: return KeyCode.Digit0;155case ScanCode.Minus: return KeyCode.Minus;156case ScanCode.Equal: return KeyCode.Equal;157case ScanCode.BracketLeft: return KeyCode.BracketLeft;158case ScanCode.BracketRight: return KeyCode.BracketRight;159case ScanCode.Backslash: return KeyCode.Backslash;160case ScanCode.IntlHash: return KeyCode.Unknown; // missing161case ScanCode.Semicolon: return KeyCode.Semicolon;162case ScanCode.Quote: return KeyCode.Quote;163case ScanCode.Backquote: return KeyCode.Backquote;164case ScanCode.Comma: return KeyCode.Comma;165case ScanCode.Period: return KeyCode.Period;166case ScanCode.Slash: return KeyCode.Slash;167case ScanCode.IntlBackslash: return KeyCode.IntlBackslash;168}169return KeyCode.Unknown;170}171172private static _toKeyCodeChord(chord: Chord | null): KeyCodeChord | null {173if (!chord) {174return null;175}176if (chord instanceof KeyCodeChord) {177return chord;178}179const keyCode = this._scanCodeToKeyCode(chord.scanCode);180if (keyCode === KeyCode.Unknown) {181return null;182}183return new KeyCodeChord(chord.ctrlKey, chord.shiftKey, chord.altKey, chord.metaKey, keyCode);184}185186public static resolveKeybinding(keybinding: Keybinding, os: OperatingSystem): USLayoutResolvedKeybinding[] {187const chords: KeyCodeChord[] = toEmptyArrayIfContainsNull(keybinding.chords.map(chord => this._toKeyCodeChord(chord)));188if (chords.length > 0) {189return [new USLayoutResolvedKeybinding(chords, os)];190}191return [];192}193}194195196