diff --git a/src/vs/workbench/services/keybinding/common/keybindingIO.ts b/src/vs/workbench/services/keybinding/common/keybindingIO.ts index f407d8196b89deab5af86f5e55f6cafe3adebb14..c9a978e3174d57a421b286cf2c592ed9535e5d8c 100644 --- a/src/vs/workbench/services/keybinding/common/keybindingIO.ts +++ b/src/vs/workbench/services/keybinding/common/keybindingIO.ts @@ -30,7 +30,7 @@ export class KeybindingIO { out.write('}'); } - public static readKeybindingItem(input: IUserFriendlyKeybinding, index: number, OS: OperatingSystem): IKeybindingItem { + public static readUserKeybindingItem(input: IUserFriendlyKeybinding, index: number, OS: OperatingSystem): IKeybindingItem { let keybinding: Keybinding = null; if (typeof input.key === 'string') { keybinding = KeybindingIO.readKeybinding(input.key, OS); diff --git a/src/vs/workbench/services/keybinding/common/keyboardMapper.ts b/src/vs/workbench/services/keybinding/common/keyboardMapper.ts index 606249d11b9b32f84edf7a93b5157c10acbb1757..c31a69a2ac3a9b336df4078f50c839ff668764f4 100644 --- a/src/vs/workbench/services/keybinding/common/keyboardMapper.ts +++ b/src/vs/workbench/services/keybinding/common/keyboardMapper.ts @@ -9,7 +9,6 @@ import { Keybinding, ResolvedKeybinding } from 'vs/base/common/keyCodes'; import { IKeyboardEvent } from 'vs/platform/keybinding/common/keybinding'; export interface IKeyboardMapper { - dumpRawDebugInfo(): string; dumpDebugInfo(): string; resolveKeybinding(keybinding: Keybinding): ResolvedKeybinding[]; resolveKeyboardEvent(keyboardEvent: IKeyboardEvent): ResolvedKeybinding; diff --git a/src/vs/workbench/services/keybinding/common/macLinuxFallbackKeyboardMapper.ts b/src/vs/workbench/services/keybinding/common/macLinuxFallbackKeyboardMapper.ts index cabe19c26116a06cfdb6a5f023b24b741dca9505..e3a6c37921e0e713d81e850e3c654276ece0677c 100644 --- a/src/vs/workbench/services/keybinding/common/macLinuxFallbackKeyboardMapper.ts +++ b/src/vs/workbench/services/keybinding/common/macLinuxFallbackKeyboardMapper.ts @@ -32,24 +32,15 @@ export interface IMacLinuxKeyboardMapping { */ export class MacLinuxFallbackKeyboardMapper implements IKeyboardMapper { - /** - * used only for debug purposes. - */ - private readonly _rawMappings: IMacLinuxKeyboardMapping; /** * OS (can be Linux or Macintosh) */ private readonly _OS: OperatingSystem; constructor(rawMappings: IMacLinuxKeyboardMapping, OS: OperatingSystem) { - this._rawMappings = rawMappings; this._OS = OS; } - public dumpRawDebugInfo(): string { - return JSON.stringify(this._rawMappings, null, '\t'); - } - public dumpDebugInfo(): string { return 'FallbackKeyboardMapper dispatching on keyCode'; } diff --git a/src/vs/workbench/services/keybinding/common/macLinuxKeyboardMapper.ts b/src/vs/workbench/services/keybinding/common/macLinuxKeyboardMapper.ts index a295a9754d96354a2a706ee7f4452428a1af570b..1ae73e72dff8f4cbb74973dc1de353f48c2188f8 100644 --- a/src/vs/workbench/services/keybinding/common/macLinuxKeyboardMapper.ts +++ b/src/vs/workbench/services/keybinding/common/macLinuxKeyboardMapper.ts @@ -7,7 +7,7 @@ import { OperatingSystem } from 'vs/base/common/platform'; import { KeyCode, ResolvedKeybinding, KeyCodeUtils, SimpleKeybinding, Keybinding, KeybindingType, USER_SETTINGS } from 'vs/base/common/keyCodes'; -import { ScanCode, ScanCodeUtils, IMMUTABLE_CODE_TO_KEY_CODE } from 'vs/workbench/services/keybinding/common/scanCode'; +import { ScanCode, ScanCodeUtils, IMMUTABLE_CODE_TO_KEY_CODE, ScanCodeBinding } from 'vs/workbench/services/keybinding/common/scanCode'; import { CharCode } from 'vs/base/common/charCode'; import { IHTMLContentElement } from 'vs/base/common/htmlContent'; import { UILabelProvider, AriaLabelProvider, UserSettingsLabelProvider, ElectronAcceleratorLabelProvider } from 'vs/platform/keybinding/common/keybindingLabels'; @@ -73,30 +73,14 @@ function log(str: string): void { */ const CHAR_CODE_TO_KEY_CODE: { keyCode: KeyCode; shiftKey: boolean }[] = []; -export class ScanCodePress { - public readonly ctrlKey: boolean; - public readonly shiftKey: boolean; - public readonly altKey: boolean; - public readonly metaKey: boolean; - public readonly scanCode: ScanCode; - - constructor(ctrlKey: boolean, shiftKey: boolean, altKey: boolean, metaKey: boolean, scanCode: ScanCode) { - this.ctrlKey = ctrlKey; - this.shiftKey = shiftKey; - this.altKey = altKey; - this.metaKey = metaKey; - this.scanCode = scanCode; - } -} - export class NativeResolvedKeybinding extends ResolvedKeybinding { private readonly _mapper: MacLinuxKeyboardMapper; private readonly _OS: OperatingSystem; - private readonly _firstPart: ScanCodePress; - private readonly _chordPart: ScanCodePress; + private readonly _firstPart: ScanCodeBinding; + private readonly _chordPart: ScanCodeBinding; - constructor(mapper: MacLinuxKeyboardMapper, OS: OperatingSystem, firstPart: ScanCodePress, chordPart: ScanCodePress) { + constructor(mapper: MacLinuxKeyboardMapper, OS: OperatingSystem, firstPart: ScanCodeBinding, chordPart: ScanCodeBinding) { super(); this._mapper = mapper; this._OS = OS; @@ -171,8 +155,8 @@ export class NativeResolvedKeybinding extends ResolvedKeybinding { } public getDispatchParts(): [string, string] { - let firstPart = this._firstPart ? this._mapper.getDispatchStrForScanCodePress(this._firstPart) : null; - let chordPart = this._chordPart ? this._mapper.getDispatchStrForScanCodePress(this._chordPart) : null; + let firstPart = this._firstPart ? this._mapper.getDispatchStrForScanCodeBinding(this._firstPart) : null; + let chordPart = this._chordPart ? this._mapper.getDispatchStrForScanCodeBinding(this._chordPart) : null; return [firstPart, chordPart]; } } @@ -453,10 +437,6 @@ class ScanCodeKeyCodeMapper { export class MacLinuxKeyboardMapper implements IKeyboardMapper { - /** - * used only for debug purposes. - */ - private readonly _rawMappings: IMacLinuxKeyboardMapping; /** * OS (can be Linux or Macintosh) */ @@ -479,7 +459,6 @@ export class MacLinuxKeyboardMapper implements IKeyboardMapper { private readonly _scanCodeToDispatch: string[] = []; constructor(rawMappings: IMacLinuxKeyboardMapping, OS: OperatingSystem) { - this._rawMappings = rawMappings; this._OS = OS; this._codeInfo = []; this._scanCodeKeyCodeMapper = new ScanCodeKeyCodeMapper(); @@ -590,10 +569,6 @@ export class MacLinuxKeyboardMapper implements IKeyboardMapper { this._scanCodeKeyCodeMapper.registrationComplete(); } - public dumpRawDebugInfo(): string { - return JSON.stringify(this._rawMappings, null, '\t'); - } - public dumpDebugInfo(): string { let result: string[] = []; @@ -773,15 +748,15 @@ export class MacLinuxKeyboardMapper implements IKeyboardMapper { ); } - public simpleKeybindingToScanCodePress(keybinding: SimpleKeybinding): ScanCodePress[] { + public simpleKeybindingToScanCodeBinding(keybinding: SimpleKeybinding): ScanCodeBinding[] { const scanCodeCombos = this._scanCodeKeyCodeMapper.lookupKeyCodeCombo( new KeyCodeCombo(keybinding.ctrlKey, keybinding.shiftKey, keybinding.altKey, keybinding.keyCode) ); - let result: ScanCodePress[] = []; + let result: ScanCodeBinding[] = []; for (let i = 0, len = scanCodeCombos.length; i < len; i++) { const scanCodeCombo = scanCodeCombos[i]; - result[i] = new ScanCodePress(scanCodeCombo.ctrlKey, scanCodeCombo.shiftKey, scanCodeCombo.altKey, keybinding.metaKey, scanCodeCombo.scanCode); + result[i] = new ScanCodeBinding(scanCodeCombo.ctrlKey, scanCodeCombo.shiftKey, scanCodeCombo.altKey, keybinding.metaKey, scanCodeCombo.scanCode); } return result; } @@ -806,7 +781,7 @@ export class MacLinuxKeyboardMapper implements IKeyboardMapper { return this._scanCodeToLabel[scanCode]; } - public getDispatchStrForScanCodePress(keypress: ScanCodePress): string { + public getDispatchStrForScanCodeBinding(keypress: ScanCodeBinding): string { const codeDispatch = this._scanCodeToDispatch[keypress.scanCode]; if (!codeDispatch) { return null; @@ -885,8 +860,8 @@ export class MacLinuxKeyboardMapper implements IKeyboardMapper { let result: NativeResolvedKeybinding[] = [], resultLen = 0; if (keybinding.type === KeybindingType.Chord) { - const firstParts = this.simpleKeybindingToScanCodePress(keybinding.firstPart); - const chordParts = this.simpleKeybindingToScanCodePress(keybinding.chordPart); + const firstParts = this.simpleKeybindingToScanCodeBinding(keybinding.firstPart); + const chordParts = this.simpleKeybindingToScanCodeBinding(keybinding.chordPart); for (let i = 0, len = firstParts.length; i < len; i++) { const firstPart = firstParts[i]; @@ -897,7 +872,7 @@ export class MacLinuxKeyboardMapper implements IKeyboardMapper { } } } else { - const firstParts = this.simpleKeybindingToScanCodePress(keybinding); + const firstParts = this.simpleKeybindingToScanCodeBinding(keybinding); for (let i = 0, len = firstParts.length; i < len; i++) { const firstPart = firstParts[i]; @@ -910,7 +885,7 @@ export class MacLinuxKeyboardMapper implements IKeyboardMapper { } public resolveKeyboardEvent(keyboardEvent: IKeyboardEvent): NativeResolvedKeybinding { - const keypress = new ScanCodePress(keyboardEvent.ctrlKey, keyboardEvent.shiftKey, keyboardEvent.altKey, keyboardEvent.metaKey, ScanCodeUtils.toEnum(keyboardEvent.code)); + const keypress = new ScanCodeBinding(keyboardEvent.ctrlKey, keyboardEvent.shiftKey, keyboardEvent.altKey, keyboardEvent.metaKey, ScanCodeUtils.toEnum(keyboardEvent.code)); return new NativeResolvedKeybinding(this, this._OS, keypress, null); } diff --git a/src/vs/workbench/services/keybinding/common/scanCode.ts b/src/vs/workbench/services/keybinding/common/scanCode.ts index f593476e920790f14952e0179467741e0f215f61..c8d769ae775700113f5ad87cca49347cbd151675 100644 --- a/src/vs/workbench/services/keybinding/common/scanCode.ts +++ b/src/vs/workbench/services/keybinding/common/scanCode.ts @@ -7,214 +7,6 @@ import { KeyCode } from 'vs/base/common/keyCodes'; -const scanCodeIntToStr: string[] = []; -const scanCodeStrToInt: { [code: string]: number; } = Object.create(null); - -export const ScanCodeUtils = { - toEnum: (scanCode: string) => scanCodeStrToInt[scanCode] || ScanCode.None, - toString: (scanCode: ScanCode) => scanCodeIntToStr[scanCode] || 'None' -}; - -function d(intScanCode: ScanCode, strScanCode: string): void { - scanCodeIntToStr[intScanCode] = strScanCode; - scanCodeStrToInt[strScanCode] = intScanCode; -} -(function () { - d(ScanCode.None, 'None'); - d(ScanCode.Hyper, 'Hyper'); - d(ScanCode.Super, 'Super'); - d(ScanCode.Fn, 'Fn'); - d(ScanCode.FnLock, 'FnLock'); - d(ScanCode.Suspend, 'Suspend'); - d(ScanCode.Resume, 'Resume'); - d(ScanCode.Turbo, 'Turbo'); - d(ScanCode.Sleep, 'Sleep'); - d(ScanCode.WakeUp, 'WakeUp'); - d(ScanCode.KeyA, 'KeyA'); - d(ScanCode.KeyB, 'KeyB'); - d(ScanCode.KeyC, 'KeyC'); - d(ScanCode.KeyD, 'KeyD'); - d(ScanCode.KeyE, 'KeyE'); - d(ScanCode.KeyF, 'KeyF'); - d(ScanCode.KeyG, 'KeyG'); - d(ScanCode.KeyH, 'KeyH'); - d(ScanCode.KeyI, 'KeyI'); - d(ScanCode.KeyJ, 'KeyJ'); - d(ScanCode.KeyK, 'KeyK'); - d(ScanCode.KeyL, 'KeyL'); - d(ScanCode.KeyM, 'KeyM'); - d(ScanCode.KeyN, 'KeyN'); - d(ScanCode.KeyO, 'KeyO'); - d(ScanCode.KeyP, 'KeyP'); - d(ScanCode.KeyQ, 'KeyQ'); - d(ScanCode.KeyR, 'KeyR'); - d(ScanCode.KeyS, 'KeyS'); - d(ScanCode.KeyT, 'KeyT'); - d(ScanCode.KeyU, 'KeyU'); - d(ScanCode.KeyV, 'KeyV'); - d(ScanCode.KeyW, 'KeyW'); - d(ScanCode.KeyX, 'KeyX'); - d(ScanCode.KeyY, 'KeyY'); - d(ScanCode.KeyZ, 'KeyZ'); - d(ScanCode.Digit1, 'Digit1'); - d(ScanCode.Digit2, 'Digit2'); - d(ScanCode.Digit3, 'Digit3'); - d(ScanCode.Digit4, 'Digit4'); - d(ScanCode.Digit5, 'Digit5'); - d(ScanCode.Digit6, 'Digit6'); - d(ScanCode.Digit7, 'Digit7'); - d(ScanCode.Digit8, 'Digit8'); - d(ScanCode.Digit9, 'Digit9'); - d(ScanCode.Digit0, 'Digit0'); - d(ScanCode.Enter, 'Enter'); - d(ScanCode.Escape, 'Escape'); - d(ScanCode.Backspace, 'Backspace'); - d(ScanCode.Tab, 'Tab'); - d(ScanCode.Space, 'Space'); - d(ScanCode.Minus, 'Minus'); - d(ScanCode.Equal, 'Equal'); - d(ScanCode.BracketLeft, 'BracketLeft'); - d(ScanCode.BracketRight, 'BracketRight'); - d(ScanCode.Backslash, 'Backslash'); - d(ScanCode.IntlHash, 'IntlHash'); - d(ScanCode.Semicolon, 'Semicolon'); - d(ScanCode.Quote, 'Quote'); - d(ScanCode.Backquote, 'Backquote'); - d(ScanCode.Comma, 'Comma'); - d(ScanCode.Period, 'Period'); - d(ScanCode.Slash, 'Slash'); - d(ScanCode.CapsLock, 'CapsLock'); - d(ScanCode.F1, 'F1'); - d(ScanCode.F2, 'F2'); - d(ScanCode.F3, 'F3'); - d(ScanCode.F4, 'F4'); - d(ScanCode.F5, 'F5'); - d(ScanCode.F6, 'F6'); - d(ScanCode.F7, 'F7'); - d(ScanCode.F8, 'F8'); - d(ScanCode.F9, 'F9'); - d(ScanCode.F10, 'F10'); - d(ScanCode.F11, 'F11'); - d(ScanCode.F12, 'F12'); - d(ScanCode.PrintScreen, 'PrintScreen'); - d(ScanCode.ScrollLock, 'ScrollLock'); - d(ScanCode.Pause, 'Pause'); - d(ScanCode.Insert, 'Insert'); - d(ScanCode.Home, 'Home'); - d(ScanCode.PageUp, 'PageUp'); - d(ScanCode.Delete, 'Delete'); - d(ScanCode.End, 'End'); - d(ScanCode.PageDown, 'PageDown'); - d(ScanCode.ArrowRight, 'ArrowRight'); - d(ScanCode.ArrowLeft, 'ArrowLeft'); - d(ScanCode.ArrowDown, 'ArrowDown'); - d(ScanCode.ArrowUp, 'ArrowUp'); - d(ScanCode.NumLock, 'NumLock'); - d(ScanCode.NumpadDivide, 'NumpadDivide'); - d(ScanCode.NumpadMultiply, 'NumpadMultiply'); - d(ScanCode.NumpadSubtract, 'NumpadSubtract'); - d(ScanCode.NumpadAdd, 'NumpadAdd'); - d(ScanCode.NumpadEnter, 'NumpadEnter'); - d(ScanCode.Numpad1, 'Numpad1'); - d(ScanCode.Numpad2, 'Numpad2'); - d(ScanCode.Numpad3, 'Numpad3'); - d(ScanCode.Numpad4, 'Numpad4'); - d(ScanCode.Numpad5, 'Numpad5'); - d(ScanCode.Numpad6, 'Numpad6'); - d(ScanCode.Numpad7, 'Numpad7'); - d(ScanCode.Numpad8, 'Numpad8'); - d(ScanCode.Numpad9, 'Numpad9'); - d(ScanCode.Numpad0, 'Numpad0'); - d(ScanCode.NumpadDecimal, 'NumpadDecimal'); - d(ScanCode.IntlBackslash, 'IntlBackslash'); - d(ScanCode.ContextMenu, 'ContextMenu'); - d(ScanCode.Power, 'Power'); - d(ScanCode.NumpadEqual, 'NumpadEqual'); - d(ScanCode.F13, 'F13'); - d(ScanCode.F14, 'F14'); - d(ScanCode.F15, 'F15'); - d(ScanCode.F16, 'F16'); - d(ScanCode.F17, 'F17'); - d(ScanCode.F18, 'F18'); - d(ScanCode.F19, 'F19'); - d(ScanCode.F20, 'F20'); - d(ScanCode.F21, 'F21'); - d(ScanCode.F22, 'F22'); - d(ScanCode.F23, 'F23'); - d(ScanCode.F24, 'F24'); - d(ScanCode.Open, 'Open'); - d(ScanCode.Help, 'Help'); - d(ScanCode.Select, 'Select'); - d(ScanCode.Again, 'Again'); - d(ScanCode.Undo, 'Undo'); - d(ScanCode.Cut, 'Cut'); - d(ScanCode.Copy, 'Copy'); - d(ScanCode.Paste, 'Paste'); - d(ScanCode.Find, 'Find'); - d(ScanCode.AudioVolumeMute, 'AudioVolumeMute'); - d(ScanCode.AudioVolumeUp, 'AudioVolumeUp'); - d(ScanCode.AudioVolumeDown, 'AudioVolumeDown'); - d(ScanCode.NumpadComma, 'NumpadComma'); - d(ScanCode.IntlRo, 'IntlRo'); - d(ScanCode.KanaMode, 'KanaMode'); - d(ScanCode.IntlYen, 'IntlYen'); - d(ScanCode.Convert, 'Convert'); - d(ScanCode.NonConvert, 'NonConvert'); - d(ScanCode.Lang1, 'Lang1'); - d(ScanCode.Lang2, 'Lang2'); - d(ScanCode.Lang3, 'Lang3'); - d(ScanCode.Lang4, 'Lang4'); - d(ScanCode.Lang5, 'Lang5'); - d(ScanCode.Abort, 'Abort'); - d(ScanCode.Props, 'Props'); - d(ScanCode.NumpadParenLeft, 'NumpadParenLeft'); - d(ScanCode.NumpadParenRight, 'NumpadParenRight'); - d(ScanCode.NumpadBackspace, 'NumpadBackspace'); - d(ScanCode.NumpadMemoryStore, 'NumpadMemoryStore'); - d(ScanCode.NumpadMemoryRecall, 'NumpadMemoryRecall'); - d(ScanCode.NumpadMemoryClear, 'NumpadMemoryClear'); - d(ScanCode.NumpadMemoryAdd, 'NumpadMemoryAdd'); - d(ScanCode.NumpadMemorySubtract, 'NumpadMemorySubtract'); - d(ScanCode.NumpadClear, 'NumpadClear'); - d(ScanCode.NumpadClearEntry, 'NumpadClearEntry'); - d(ScanCode.ControlLeft, 'ControlLeft'); - d(ScanCode.ShiftLeft, 'ShiftLeft'); - d(ScanCode.AltLeft, 'AltLeft'); - d(ScanCode.MetaLeft, 'MetaLeft'); - d(ScanCode.ControlRight, 'ControlRight'); - d(ScanCode.ShiftRight, 'ShiftRight'); - d(ScanCode.AltRight, 'AltRight'); - d(ScanCode.MetaRight, 'MetaRight'); - d(ScanCode.BrightnessUp, 'BrightnessUp'); - d(ScanCode.BrightnessDown, 'BrightnessDown'); - d(ScanCode.MediaPlay, 'MediaPlay'); - d(ScanCode.MediaRecord, 'MediaRecord'); - d(ScanCode.MediaFastForward, 'MediaFastForward'); - d(ScanCode.MediaRewind, 'MediaRewind'); - d(ScanCode.MediaTrackNext, 'MediaTrackNext'); - d(ScanCode.MediaTrackPrevious, 'MediaTrackPrevious'); - d(ScanCode.MediaStop, 'MediaStop'); - d(ScanCode.Eject, 'Eject'); - d(ScanCode.MediaPlayPause, 'MediaPlayPause'); - d(ScanCode.MediaSelect, 'MediaSelect'); - d(ScanCode.LaunchMail, 'LaunchMail'); - d(ScanCode.LaunchApp2, 'LaunchApp2'); - d(ScanCode.LaunchApp1, 'LaunchApp1'); - d(ScanCode.SelectTask, 'SelectTask'); - d(ScanCode.LaunchScreenSaver, 'LaunchScreenSaver'); - d(ScanCode.BrowserSearch, 'BrowserSearch'); - d(ScanCode.BrowserHome, 'BrowserHome'); - d(ScanCode.BrowserBack, 'BrowserBack'); - d(ScanCode.BrowserForward, 'BrowserForward'); - d(ScanCode.BrowserStop, 'BrowserStop'); - d(ScanCode.BrowserRefresh, 'BrowserRefresh'); - d(ScanCode.BrowserFavorites, 'BrowserFavorites'); - d(ScanCode.ZoomToggle, 'ZoomToggle'); - d(ScanCode.MailReply, 'MailReply'); - d(ScanCode.MailForward, 'MailForward'); - d(ScanCode.MailSend, 'MailSend'); -})(); - /** * keyboardEvent.code */ @@ -417,11 +209,238 @@ export const enum ScanCode { MAX_VALUE } +const scanCodeIntToStr: string[] = []; +const scanCodeStrToInt: { [code: string]: number; } = Object.create(null); +const scanCodeLowerCaseStrToInt: { [code: string]: number; } = Object.create(null); + +export const ScanCodeUtils = { + lowerCaseToEnum: (scanCode: string) => scanCodeLowerCaseStrToInt[scanCode] || ScanCode.None, + toEnum: (scanCode: string) => scanCodeStrToInt[scanCode] || ScanCode.None, + toString: (scanCode: ScanCode) => scanCodeIntToStr[scanCode] || 'None' +}; + /** * -1 if a HwCode => KeyCode mapping depends on kb layout. */ export const IMMUTABLE_CODE_TO_KEY_CODE: KeyCode[] = []; +export class ScanCodeBinding { + public readonly ctrlKey: boolean; + public readonly shiftKey: boolean; + public readonly altKey: boolean; + public readonly metaKey: boolean; + public readonly scanCode: ScanCode; + + constructor(ctrlKey: boolean, shiftKey: boolean, altKey: boolean, metaKey: boolean, scanCode: ScanCode) { + this.ctrlKey = ctrlKey; + this.shiftKey = shiftKey; + this.altKey = altKey; + this.metaKey = metaKey; + this.scanCode = scanCode; + } +} + +(function () { + function d(intScanCode: ScanCode, strScanCode: string): void { + scanCodeIntToStr[intScanCode] = strScanCode; + scanCodeStrToInt[strScanCode] = intScanCode; + scanCodeLowerCaseStrToInt[strScanCode.toLowerCase()] = intScanCode; + } + d(ScanCode.None, 'None'); + d(ScanCode.Hyper, 'Hyper'); + d(ScanCode.Super, 'Super'); + d(ScanCode.Fn, 'Fn'); + d(ScanCode.FnLock, 'FnLock'); + d(ScanCode.Suspend, 'Suspend'); + d(ScanCode.Resume, 'Resume'); + d(ScanCode.Turbo, 'Turbo'); + d(ScanCode.Sleep, 'Sleep'); + d(ScanCode.WakeUp, 'WakeUp'); + d(ScanCode.KeyA, 'KeyA'); + d(ScanCode.KeyB, 'KeyB'); + d(ScanCode.KeyC, 'KeyC'); + d(ScanCode.KeyD, 'KeyD'); + d(ScanCode.KeyE, 'KeyE'); + d(ScanCode.KeyF, 'KeyF'); + d(ScanCode.KeyG, 'KeyG'); + d(ScanCode.KeyH, 'KeyH'); + d(ScanCode.KeyI, 'KeyI'); + d(ScanCode.KeyJ, 'KeyJ'); + d(ScanCode.KeyK, 'KeyK'); + d(ScanCode.KeyL, 'KeyL'); + d(ScanCode.KeyM, 'KeyM'); + d(ScanCode.KeyN, 'KeyN'); + d(ScanCode.KeyO, 'KeyO'); + d(ScanCode.KeyP, 'KeyP'); + d(ScanCode.KeyQ, 'KeyQ'); + d(ScanCode.KeyR, 'KeyR'); + d(ScanCode.KeyS, 'KeyS'); + d(ScanCode.KeyT, 'KeyT'); + d(ScanCode.KeyU, 'KeyU'); + d(ScanCode.KeyV, 'KeyV'); + d(ScanCode.KeyW, 'KeyW'); + d(ScanCode.KeyX, 'KeyX'); + d(ScanCode.KeyY, 'KeyY'); + d(ScanCode.KeyZ, 'KeyZ'); + d(ScanCode.Digit1, 'Digit1'); + d(ScanCode.Digit2, 'Digit2'); + d(ScanCode.Digit3, 'Digit3'); + d(ScanCode.Digit4, 'Digit4'); + d(ScanCode.Digit5, 'Digit5'); + d(ScanCode.Digit6, 'Digit6'); + d(ScanCode.Digit7, 'Digit7'); + d(ScanCode.Digit8, 'Digit8'); + d(ScanCode.Digit9, 'Digit9'); + d(ScanCode.Digit0, 'Digit0'); + d(ScanCode.Enter, 'Enter'); + d(ScanCode.Escape, 'Escape'); + d(ScanCode.Backspace, 'Backspace'); + d(ScanCode.Tab, 'Tab'); + d(ScanCode.Space, 'Space'); + d(ScanCode.Minus, 'Minus'); + d(ScanCode.Equal, 'Equal'); + d(ScanCode.BracketLeft, 'BracketLeft'); + d(ScanCode.BracketRight, 'BracketRight'); + d(ScanCode.Backslash, 'Backslash'); + d(ScanCode.IntlHash, 'IntlHash'); + d(ScanCode.Semicolon, 'Semicolon'); + d(ScanCode.Quote, 'Quote'); + d(ScanCode.Backquote, 'Backquote'); + d(ScanCode.Comma, 'Comma'); + d(ScanCode.Period, 'Period'); + d(ScanCode.Slash, 'Slash'); + d(ScanCode.CapsLock, 'CapsLock'); + d(ScanCode.F1, 'F1'); + d(ScanCode.F2, 'F2'); + d(ScanCode.F3, 'F3'); + d(ScanCode.F4, 'F4'); + d(ScanCode.F5, 'F5'); + d(ScanCode.F6, 'F6'); + d(ScanCode.F7, 'F7'); + d(ScanCode.F8, 'F8'); + d(ScanCode.F9, 'F9'); + d(ScanCode.F10, 'F10'); + d(ScanCode.F11, 'F11'); + d(ScanCode.F12, 'F12'); + d(ScanCode.PrintScreen, 'PrintScreen'); + d(ScanCode.ScrollLock, 'ScrollLock'); + d(ScanCode.Pause, 'Pause'); + d(ScanCode.Insert, 'Insert'); + d(ScanCode.Home, 'Home'); + d(ScanCode.PageUp, 'PageUp'); + d(ScanCode.Delete, 'Delete'); + d(ScanCode.End, 'End'); + d(ScanCode.PageDown, 'PageDown'); + d(ScanCode.ArrowRight, 'ArrowRight'); + d(ScanCode.ArrowLeft, 'ArrowLeft'); + d(ScanCode.ArrowDown, 'ArrowDown'); + d(ScanCode.ArrowUp, 'ArrowUp'); + d(ScanCode.NumLock, 'NumLock'); + d(ScanCode.NumpadDivide, 'NumpadDivide'); + d(ScanCode.NumpadMultiply, 'NumpadMultiply'); + d(ScanCode.NumpadSubtract, 'NumpadSubtract'); + d(ScanCode.NumpadAdd, 'NumpadAdd'); + d(ScanCode.NumpadEnter, 'NumpadEnter'); + d(ScanCode.Numpad1, 'Numpad1'); + d(ScanCode.Numpad2, 'Numpad2'); + d(ScanCode.Numpad3, 'Numpad3'); + d(ScanCode.Numpad4, 'Numpad4'); + d(ScanCode.Numpad5, 'Numpad5'); + d(ScanCode.Numpad6, 'Numpad6'); + d(ScanCode.Numpad7, 'Numpad7'); + d(ScanCode.Numpad8, 'Numpad8'); + d(ScanCode.Numpad9, 'Numpad9'); + d(ScanCode.Numpad0, 'Numpad0'); + d(ScanCode.NumpadDecimal, 'NumpadDecimal'); + d(ScanCode.IntlBackslash, 'IntlBackslash'); + d(ScanCode.ContextMenu, 'ContextMenu'); + d(ScanCode.Power, 'Power'); + d(ScanCode.NumpadEqual, 'NumpadEqual'); + d(ScanCode.F13, 'F13'); + d(ScanCode.F14, 'F14'); + d(ScanCode.F15, 'F15'); + d(ScanCode.F16, 'F16'); + d(ScanCode.F17, 'F17'); + d(ScanCode.F18, 'F18'); + d(ScanCode.F19, 'F19'); + d(ScanCode.F20, 'F20'); + d(ScanCode.F21, 'F21'); + d(ScanCode.F22, 'F22'); + d(ScanCode.F23, 'F23'); + d(ScanCode.F24, 'F24'); + d(ScanCode.Open, 'Open'); + d(ScanCode.Help, 'Help'); + d(ScanCode.Select, 'Select'); + d(ScanCode.Again, 'Again'); + d(ScanCode.Undo, 'Undo'); + d(ScanCode.Cut, 'Cut'); + d(ScanCode.Copy, 'Copy'); + d(ScanCode.Paste, 'Paste'); + d(ScanCode.Find, 'Find'); + d(ScanCode.AudioVolumeMute, 'AudioVolumeMute'); + d(ScanCode.AudioVolumeUp, 'AudioVolumeUp'); + d(ScanCode.AudioVolumeDown, 'AudioVolumeDown'); + d(ScanCode.NumpadComma, 'NumpadComma'); + d(ScanCode.IntlRo, 'IntlRo'); + d(ScanCode.KanaMode, 'KanaMode'); + d(ScanCode.IntlYen, 'IntlYen'); + d(ScanCode.Convert, 'Convert'); + d(ScanCode.NonConvert, 'NonConvert'); + d(ScanCode.Lang1, 'Lang1'); + d(ScanCode.Lang2, 'Lang2'); + d(ScanCode.Lang3, 'Lang3'); + d(ScanCode.Lang4, 'Lang4'); + d(ScanCode.Lang5, 'Lang5'); + d(ScanCode.Abort, 'Abort'); + d(ScanCode.Props, 'Props'); + d(ScanCode.NumpadParenLeft, 'NumpadParenLeft'); + d(ScanCode.NumpadParenRight, 'NumpadParenRight'); + d(ScanCode.NumpadBackspace, 'NumpadBackspace'); + d(ScanCode.NumpadMemoryStore, 'NumpadMemoryStore'); + d(ScanCode.NumpadMemoryRecall, 'NumpadMemoryRecall'); + d(ScanCode.NumpadMemoryClear, 'NumpadMemoryClear'); + d(ScanCode.NumpadMemoryAdd, 'NumpadMemoryAdd'); + d(ScanCode.NumpadMemorySubtract, 'NumpadMemorySubtract'); + d(ScanCode.NumpadClear, 'NumpadClear'); + d(ScanCode.NumpadClearEntry, 'NumpadClearEntry'); + d(ScanCode.ControlLeft, 'ControlLeft'); + d(ScanCode.ShiftLeft, 'ShiftLeft'); + d(ScanCode.AltLeft, 'AltLeft'); + d(ScanCode.MetaLeft, 'MetaLeft'); + d(ScanCode.ControlRight, 'ControlRight'); + d(ScanCode.ShiftRight, 'ShiftRight'); + d(ScanCode.AltRight, 'AltRight'); + d(ScanCode.MetaRight, 'MetaRight'); + d(ScanCode.BrightnessUp, 'BrightnessUp'); + d(ScanCode.BrightnessDown, 'BrightnessDown'); + d(ScanCode.MediaPlay, 'MediaPlay'); + d(ScanCode.MediaRecord, 'MediaRecord'); + d(ScanCode.MediaFastForward, 'MediaFastForward'); + d(ScanCode.MediaRewind, 'MediaRewind'); + d(ScanCode.MediaTrackNext, 'MediaTrackNext'); + d(ScanCode.MediaTrackPrevious, 'MediaTrackPrevious'); + d(ScanCode.MediaStop, 'MediaStop'); + d(ScanCode.Eject, 'Eject'); + d(ScanCode.MediaPlayPause, 'MediaPlayPause'); + d(ScanCode.MediaSelect, 'MediaSelect'); + d(ScanCode.LaunchMail, 'LaunchMail'); + d(ScanCode.LaunchApp2, 'LaunchApp2'); + d(ScanCode.LaunchApp1, 'LaunchApp1'); + d(ScanCode.SelectTask, 'SelectTask'); + d(ScanCode.LaunchScreenSaver, 'LaunchScreenSaver'); + d(ScanCode.BrowserSearch, 'BrowserSearch'); + d(ScanCode.BrowserHome, 'BrowserHome'); + d(ScanCode.BrowserBack, 'BrowserBack'); + d(ScanCode.BrowserForward, 'BrowserForward'); + d(ScanCode.BrowserStop, 'BrowserStop'); + d(ScanCode.BrowserRefresh, 'BrowserRefresh'); + d(ScanCode.BrowserFavorites, 'BrowserFavorites'); + d(ScanCode.ZoomToggle, 'ZoomToggle'); + d(ScanCode.MailReply, 'MailReply'); + d(ScanCode.MailForward, 'MailForward'); + d(ScanCode.MailSend, 'MailSend'); +})(); + (function () { for (let i = 0; i <= ScanCode.MAX_VALUE; i++) { IMMUTABLE_CODE_TO_KEY_CODE[i] = -1; diff --git a/src/vs/workbench/services/keybinding/common/windowsKeyboardMapper.ts b/src/vs/workbench/services/keybinding/common/windowsKeyboardMapper.ts index 34f29888c567644ea355a926e7a76b52654b2f7c..9bb8e3d97b534a3969de89911dd68f906bcf48a7 100644 --- a/src/vs/workbench/services/keybinding/common/windowsKeyboardMapper.ts +++ b/src/vs/workbench/services/keybinding/common/windowsKeyboardMapper.ts @@ -212,14 +212,12 @@ export class WindowsNativeResolvedKeybinding extends ResolvedKeybinding { export class WindowsKeyboardMapper implements IKeyboardMapper { - private readonly _rawMappings: IWindowsKeyboardMapping; private readonly _codeInfo: IHardwareCodeMapping[]; private readonly _hwToKb: KeyCode[]; private readonly _kbToLabel: string[] = []; private readonly _kbExists: boolean[]; constructor(rawMappings: IWindowsKeyboardMapping) { - this._rawMappings = rawMappings; this._hwToKb = []; this._kbToLabel = []; this._kbExists = []; @@ -278,10 +276,6 @@ export class WindowsKeyboardMapper implements IKeyboardMapper { } } - public dumpRawDebugInfo(): string { - return JSON.stringify(this._rawMappings, null, '\t'); - } - public dumpDebugInfo(): string { let result: string[] = []; diff --git a/src/vs/workbench/services/keybinding/electron-browser/keybindingService.ts b/src/vs/workbench/services/keybinding/electron-browser/keybindingService.ts index 600cd3d72632e85f2a829d9d60609569b47c6b2b..bd422064647fa5e8ec07c4e70c22b722c207ce41 100644 --- a/src/vs/workbench/services/keybinding/electron-browser/keybindingService.ts +++ b/src/vs/workbench/services/keybinding/electron-browser/keybindingService.ts @@ -41,6 +41,7 @@ export class KeyboardMapperFactory { private _layoutInfo: nativeKeymap.IKeyboardLayoutInfo; private _rawMapping: nativeKeymap.IKeyboardMapping; private _keyboardMapper: IKeyboardMapper; + private _initialized: boolean; private _onDidChangeKeyboardMapper: Emitter = new Emitter(); public onDidChangeKeyboardMapper: Event = this._onDidChangeKeyboardMapper.event; @@ -49,29 +50,46 @@ export class KeyboardMapperFactory { this._layoutInfo = null; this._rawMapping = null; this._keyboardMapper = null; + this._initialized = false; } public _onKeyboardLayoutChanged(): void { - if (this._keyboardMapper) { + if (this._initialized) { this._setKeyboardData(nativeKeymap.getCurrentKeyboardLayout(), nativeKeymap.getKeyMap()); } } public getKeyboardMapper(): IKeyboardMapper { - if (!this._keyboardMapper) { + if (!this._initialized) { this._setKeyboardData(nativeKeymap.getCurrentKeyboardLayout(), nativeKeymap.getKeyMap()); } return this._keyboardMapper; } + public getCurrentKeyboardLayout(): nativeKeymap.IKeyboardLayoutInfo { + if (!this._initialized) { + this._setKeyboardData(nativeKeymap.getCurrentKeyboardLayout(), nativeKeymap.getKeyMap()); + } + return this._layoutInfo; + } + + public getRawKeyboardMapping(): nativeKeymap.IKeyboardMapping { + if (!this._initialized) { + this._setKeyboardData(nativeKeymap.getCurrentKeyboardLayout(), nativeKeymap.getKeyMap()); + } + return this._rawMapping; + } + private _setKeyboardData(layoutInfo: nativeKeymap.IKeyboardLayoutInfo, rawMapping: nativeKeymap.IKeyboardMapping): void { this._layoutInfo = layoutInfo; - if (this._keyboardMapper && KeyboardMapperFactory._equals(this._rawMapping, rawMapping)) { + if (this._initialized && KeyboardMapperFactory._equals(this._rawMapping, rawMapping)) { // nothing to do... return; } + this._initialized = true; + this._rawMapping = rawMapping; this._keyboardMapper = KeyboardMapperFactory._createKeyboardMapper(this._rawMapping); this._onDidChangeKeyboardMapper.fire(); @@ -241,14 +259,17 @@ export class WorkbenchKeybindingService extends AbstractKeybindingService { })); keybindingsTelemetry(telemetryService, this); - let data = nativeKeymap.getCurrentKeyboardLayout(); + let data = KeyboardMapperFactory.INSTANCE.getCurrentKeyboardLayout(); telemetryService.publicLog('keyboardLayout', { currentKeyboardLayout: data }); } public dumpDebugInfo(): string { - return this._keyboardMapper.dumpDebugInfo() + `\n\n\nraw info: \n` + this._keyboardMapper.dumpRawDebugInfo(); + const layoutInfo = JSON.stringify(KeyboardMapperFactory.INSTANCE.getCurrentKeyboardLayout(), null, '\t'); + const mapperInfo = this._keyboardMapper.dumpDebugInfo(); + const rawMapping = JSON.stringify(KeyboardMapperFactory.INSTANCE.getRawKeyboardMapping(), null, '\t'); + return `Layout info:\n${layoutInfo}\n${mapperInfo}\n\nRaw mapping:\n${rawMapping}`; } private _safeGetConfig(): IUserFriendlyKeybinding[] { @@ -310,7 +331,7 @@ export class WorkbenchKeybindingService extends AbstractKeybindingService { }); } - return extraUserKeybindings.map((k, i) => KeybindingIO.readKeybindingItem(k, i, OS)); + return extraUserKeybindings.map((k, i) => KeybindingIO.readUserKeybindingItem(k, i, OS)); } public resolveKeybinding(kb: Keybinding): ResolvedKeybinding[] { diff --git a/src/vs/workbench/services/keybinding/test/keybindingIO.test.ts b/src/vs/workbench/services/keybinding/test/keybindingIO.test.ts index 356dc9a5e1f528ee648869f2c63b8fb9b2da4885..908e93f77c4e2b79065f7348611227bc0571fafd 100644 --- a/src/vs/workbench/services/keybinding/test/keybindingIO.test.ts +++ b/src/vs/workbench/services/keybinding/test/keybindingIO.test.ts @@ -156,28 +156,35 @@ suite('keybindingIO', () => { test('issue #10452 - invalid command', () => { let strJSON = `[{ "key": "ctrl+k ctrl+f", "command": ["firstcommand", "seccondcommand"] }]`; let userKeybinding = JSON.parse(strJSON)[0]; - let keybindingItem = KeybindingIO.readKeybindingItem(userKeybinding, 0, OS); + let keybindingItem = KeybindingIO.readUserKeybindingItem(userKeybinding, 0, OS); assert.equal(keybindingItem.command, null); }); test('issue #10452 - invalid when', () => { let strJSON = `[{ "key": "ctrl+k ctrl+f", "command": "firstcommand", "when": [] }]`; let userKeybinding = JSON.parse(strJSON)[0]; - let keybindingItem = KeybindingIO.readKeybindingItem(userKeybinding, 0, OS); + let keybindingItem = KeybindingIO.readUserKeybindingItem(userKeybinding, 0, OS); assert.equal(keybindingItem.when, null); }); test('issue #10452 - invalid key', () => { let strJSON = `[{ "key": [], "command": "firstcommand" }]`; let userKeybinding = JSON.parse(strJSON)[0]; - let keybindingItem = KeybindingIO.readKeybindingItem(userKeybinding, 0, OS); + let keybindingItem = KeybindingIO.readUserKeybindingItem(userKeybinding, 0, OS); + assert.equal(keybindingItem.keybinding, null); + }); + + test('issue #10452 - invalid key 2', () => { + let strJSON = `[{ "key": "", "command": "firstcommand" }]`; + let userKeybinding = JSON.parse(strJSON)[0]; + let keybindingItem = KeybindingIO.readUserKeybindingItem(userKeybinding, 0, OS); assert.equal(keybindingItem.keybinding, null); }); test('test commands args', () => { let strJSON = `[{ "key": "ctrl+k ctrl+f", "command": "firstcommand", "when": [], "args": { "text": "theText" } }]`; let userKeybinding = JSON.parse(strJSON)[0]; - let keybindingItem = KeybindingIO.readKeybindingItem(userKeybinding, 0, OS); + let keybindingItem = KeybindingIO.readUserKeybindingItem(userKeybinding, 0, OS); assert.equal(keybindingItem.commandArgs.text, 'theText'); }); }); diff --git a/src/vs/workbench/services/keybinding/test/macLinuxKeyboardMapper.test.ts b/src/vs/workbench/services/keybinding/test/macLinuxKeyboardMapper.test.ts index cbae86e2721b6bffd0256d672880b1d937c5a81b..631f9ad76c3d4cd08358e2b4df24135dba6433da 100644 --- a/src/vs/workbench/services/keybinding/test/macLinuxKeyboardMapper.test.ts +++ b/src/vs/workbench/services/keybinding/test/macLinuxKeyboardMapper.test.ts @@ -1111,7 +1111,7 @@ function _assertKeybindingTranslation(mapper: MacLinuxKeyboardMapper, OS: Operat const keybindingLabel = new USLayoutResolvedKeybinding(runtimeKeybinding, OS).getUserSettingsLabel(); - const actualHardwareKeypresses = mapper.simpleKeybindingToScanCodePress(runtimeKeybinding); + const actualHardwareKeypresses = mapper.simpleKeybindingToScanCodeBinding(runtimeKeybinding); if (actualHardwareKeypresses.length === 0) { assert.deepEqual([], expected, `simpleKeybindingToHardwareKeypress -- "${keybindingLabel}" -- actual: "[]" -- expected: "${expected}"`); return;