From d3d0b7a81164b50e5d73a5d6657b7e4e8325c058 Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Fri, 17 Mar 2017 09:41:51 +0100 Subject: [PATCH] Add WindowsKeyboardMapper --- .../keybinding/common/keyboardEventCode.ts | 214 +++- .../keybinding/common/keyboardMapper.ts | 210 +--- .../common/windowsKeyboardMapper.ts | 357 ++++++ .../services/keybinding/test/win_de_ch.js | 1093 +++++++++++++++++ .../services/keybinding/test/win_de_ch.txt | 227 ++++ .../test/windowsKeyboardMapper.test.ts | 92 ++ 6 files changed, 1983 insertions(+), 210 deletions(-) create mode 100644 src/vs/workbench/services/keybinding/common/windowsKeyboardMapper.ts create mode 100644 src/vs/workbench/services/keybinding/test/win_de_ch.js create mode 100644 src/vs/workbench/services/keybinding/test/win_de_ch.txt create mode 100644 src/vs/workbench/services/keybinding/test/windowsKeyboardMapper.test.ts diff --git a/src/vs/workbench/services/keybinding/common/keyboardEventCode.ts b/src/vs/workbench/services/keybinding/common/keyboardEventCode.ts index f24c6873f28..168a684c754 100644 --- a/src/vs/workbench/services/keybinding/common/keyboardEventCode.ts +++ b/src/vs/workbench/services/keybinding/common/keyboardEventCode.ts @@ -2,8 +2,11 @@ * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ + 'use strict'; +import { KeyCode } from 'vs/base/common/keyCodes'; + const codeIntToStr: string[] = []; const codeStrToInt: { [code: string]: number; } = Object.create(null); @@ -412,4 +415,213 @@ export const enum KeyboardEventCode { MailSend, MAX_VALUE -} \ No newline at end of file +} + +/** + * -1 if a HwCode => KeyCode mapping depends on kb layout. + */ +export const IMMUTABLE_CODE_TO_KEY_CODE: KeyCode[] = []; + +(function () { + for (let i = 0; i <= KeyboardEventCode.MAX_VALUE; i++) { + IMMUTABLE_CODE_TO_KEY_CODE[i] = -1; + } + + function define(code: KeyboardEventCode, keyCode: KeyCode): void { + IMMUTABLE_CODE_TO_KEY_CODE[code] = keyCode; + } + + define(KeyboardEventCode.None, KeyCode.Unknown); + define(KeyboardEventCode.Hyper, KeyCode.Unknown); + define(KeyboardEventCode.Super, KeyCode.Unknown); + define(KeyboardEventCode.Fn, KeyCode.Unknown); + define(KeyboardEventCode.FnLock, KeyCode.Unknown); + define(KeyboardEventCode.Suspend, KeyCode.Unknown); + define(KeyboardEventCode.Resume, KeyCode.Unknown); + define(KeyboardEventCode.Turbo, KeyCode.Unknown); + define(KeyboardEventCode.Sleep, KeyCode.Unknown); + define(KeyboardEventCode.WakeUp, KeyCode.Unknown); + // define(KeyboardEventCode.KeyA, KeyCode.Unknown); + // define(KeyboardEventCode.KeyB, KeyCode.Unknown); + // define(KeyboardEventCode.KeyC, KeyCode.Unknown); + // define(KeyboardEventCode.KeyD, KeyCode.Unknown); + // define(KeyboardEventCode.KeyE, KeyCode.Unknown); + // define(KeyboardEventCode.KeyF, KeyCode.Unknown); + // define(KeyboardEventCode.KeyG, KeyCode.Unknown); + // define(KeyboardEventCode.KeyH, KeyCode.Unknown); + // define(KeyboardEventCode.KeyI, KeyCode.Unknown); + // define(KeyboardEventCode.KeyJ, KeyCode.Unknown); + // define(KeyboardEventCode.KeyK, KeyCode.Unknown); + // define(KeyboardEventCode.KeyL, KeyCode.Unknown); + // define(KeyboardEventCode.KeyM, KeyCode.Unknown); + // define(KeyboardEventCode.KeyN, KeyCode.Unknown); + // define(KeyboardEventCode.KeyO, KeyCode.Unknown); + // define(KeyboardEventCode.KeyP, KeyCode.Unknown); + // define(KeyboardEventCode.KeyQ, KeyCode.Unknown); + // define(KeyboardEventCode.KeyR, KeyCode.Unknown); + // define(KeyboardEventCode.KeyS, KeyCode.Unknown); + // define(KeyboardEventCode.KeyT, KeyCode.Unknown); + // define(KeyboardEventCode.KeyU, KeyCode.Unknown); + // define(KeyboardEventCode.KeyV, KeyCode.Unknown); + // define(KeyboardEventCode.KeyW, KeyCode.Unknown); + // define(KeyboardEventCode.KeyX, KeyCode.Unknown); + // define(KeyboardEventCode.KeyY, KeyCode.Unknown); + // define(KeyboardEventCode.KeyZ, KeyCode.Unknown); + // define(KeyboardEventCode.Digit1, KeyCode.Unknown); + // define(KeyboardEventCode.Digit2, KeyCode.Unknown); + // define(KeyboardEventCode.Digit3, KeyCode.Unknown); + // define(KeyboardEventCode.Digit4, KeyCode.Unknown); + // define(KeyboardEventCode.Digit5, KeyCode.Unknown); + // define(KeyboardEventCode.Digit6, KeyCode.Unknown); + // define(KeyboardEventCode.Digit7, KeyCode.Unknown); + // define(KeyboardEventCode.Digit8, KeyCode.Unknown); + // define(KeyboardEventCode.Digit9, KeyCode.Unknown); + // define(KeyboardEventCode.Digit0, KeyCode.Unknown); + define(KeyboardEventCode.Enter, KeyCode.Enter); + define(KeyboardEventCode.Escape, KeyCode.Escape); + define(KeyboardEventCode.Backspace, KeyCode.Backspace); + define(KeyboardEventCode.Tab, KeyCode.Tab); + define(KeyboardEventCode.Space, KeyCode.Space); + // define(KeyboardEventCode.Minus, KeyCode.Unknown); + // define(KeyboardEventCode.Equal, KeyCode.Unknown); + // define(KeyboardEventCode.BracketLeft, KeyCode.Unknown); + // define(KeyboardEventCode.BracketRight, KeyCode.Unknown); + // define(KeyboardEventCode.Backslash, KeyCode.Unknown); + // define(KeyboardEventCode.IntlHash, KeyCode.Unknown); + // define(KeyboardEventCode.Semicolon, KeyCode.Unknown); + // define(KeyboardEventCode.Quote, KeyCode.Unknown); + // define(KeyboardEventCode.Backquote, KeyCode.Unknown); + // define(KeyboardEventCode.Comma, KeyCode.Unknown); + // define(KeyboardEventCode.Period, KeyCode.Unknown); + // define(KeyboardEventCode.Slash, KeyCode.Unknown); + define(KeyboardEventCode.CapsLock, KeyCode.CapsLock); + define(KeyboardEventCode.F1, KeyCode.F1); + define(KeyboardEventCode.F2, KeyCode.F2); + define(KeyboardEventCode.F3, KeyCode.F3); + define(KeyboardEventCode.F4, KeyCode.F4); + define(KeyboardEventCode.F5, KeyCode.F5); + define(KeyboardEventCode.F6, KeyCode.F6); + define(KeyboardEventCode.F7, KeyCode.F7); + define(KeyboardEventCode.F8, KeyCode.F8); + define(KeyboardEventCode.F9, KeyCode.F9); + define(KeyboardEventCode.F10, KeyCode.F10); + define(KeyboardEventCode.F11, KeyCode.F11); + define(KeyboardEventCode.F12, KeyCode.F12); + define(KeyboardEventCode.PrintScreen, KeyCode.Unknown); + define(KeyboardEventCode.ScrollLock, KeyCode.ScrollLock); + define(KeyboardEventCode.Pause, KeyCode.PauseBreak); + define(KeyboardEventCode.Insert, KeyCode.Insert); + define(KeyboardEventCode.Home, KeyCode.Home); + define(KeyboardEventCode.PageUp, KeyCode.PageUp); + define(KeyboardEventCode.Delete, KeyCode.Delete); + define(KeyboardEventCode.End, KeyCode.End); + define(KeyboardEventCode.PageDown, KeyCode.PageDown); + define(KeyboardEventCode.ArrowRight, KeyCode.RightArrow); + define(KeyboardEventCode.ArrowLeft, KeyCode.LeftArrow); + define(KeyboardEventCode.ArrowDown, KeyCode.DownArrow); + define(KeyboardEventCode.ArrowUp, KeyCode.UpArrow); + define(KeyboardEventCode.NumLock, KeyCode.NumLock); + define(KeyboardEventCode.NumpadDivide, KeyCode.NUMPAD_DIVIDE); + define(KeyboardEventCode.NumpadMultiply, KeyCode.NUMPAD_MULTIPLY); + define(KeyboardEventCode.NumpadSubtract, KeyCode.NUMPAD_SUBTRACT); + define(KeyboardEventCode.NumpadAdd, KeyCode.NUMPAD_ADD); + define(KeyboardEventCode.NumpadEnter, KeyCode.Enter); // TODO + define(KeyboardEventCode.Numpad1, KeyCode.NUMPAD_1); + define(KeyboardEventCode.Numpad2, KeyCode.NUMPAD_2); + define(KeyboardEventCode.Numpad3, KeyCode.NUMPAD_3); + define(KeyboardEventCode.Numpad4, KeyCode.NUMPAD_4); + define(KeyboardEventCode.Numpad5, KeyCode.NUMPAD_5); + define(KeyboardEventCode.Numpad6, KeyCode.NUMPAD_6); + define(KeyboardEventCode.Numpad7, KeyCode.NUMPAD_7); + define(KeyboardEventCode.Numpad8, KeyCode.NUMPAD_8); + define(KeyboardEventCode.Numpad9, KeyCode.NUMPAD_9); + define(KeyboardEventCode.Numpad0, KeyCode.NUMPAD_0); + define(KeyboardEventCode.NumpadDecimal, KeyCode.NUMPAD_DECIMAL); + // define(KeyboardEventCode.IntlBackslash, KeyCode.Unknown); + define(KeyboardEventCode.ContextMenu, KeyCode.ContextMenu); + define(KeyboardEventCode.Power, KeyCode.Unknown); + define(KeyboardEventCode.NumpadEqual, KeyCode.Unknown); + define(KeyboardEventCode.F13, KeyCode.F13); + define(KeyboardEventCode.F14, KeyCode.F14); + define(KeyboardEventCode.F15, KeyCode.F15); + define(KeyboardEventCode.F16, KeyCode.F16); + define(KeyboardEventCode.F17, KeyCode.F17); + define(KeyboardEventCode.F18, KeyCode.F18); + define(KeyboardEventCode.F19, KeyCode.F19); + define(KeyboardEventCode.F20, KeyCode.Unknown); + define(KeyboardEventCode.F21, KeyCode.Unknown); + define(KeyboardEventCode.F22, KeyCode.Unknown); + define(KeyboardEventCode.F23, KeyCode.Unknown); + define(KeyboardEventCode.F24, KeyCode.Unknown); + define(KeyboardEventCode.Open, KeyCode.Unknown); + define(KeyboardEventCode.Help, KeyCode.Unknown); + define(KeyboardEventCode.Select, KeyCode.Unknown); + define(KeyboardEventCode.Again, KeyCode.Unknown); + define(KeyboardEventCode.Undo, KeyCode.Unknown); + define(KeyboardEventCode.Cut, KeyCode.Unknown); + define(KeyboardEventCode.Copy, KeyCode.Unknown); + define(KeyboardEventCode.Paste, KeyCode.Unknown); + define(KeyboardEventCode.Find, KeyCode.Unknown); + define(KeyboardEventCode.AudioVolumeMute, KeyCode.Unknown); + define(KeyboardEventCode.AudioVolumeUp, KeyCode.Unknown); + define(KeyboardEventCode.AudioVolumeDown, KeyCode.Unknown); + define(KeyboardEventCode.NumpadComma, KeyCode.NUMPAD_SEPARATOR); + define(KeyboardEventCode.IntlRo, KeyCode.Unknown); + define(KeyboardEventCode.KanaMode, KeyCode.Unknown); + define(KeyboardEventCode.IntlYen, KeyCode.Unknown); + define(KeyboardEventCode.Convert, KeyCode.Unknown); + define(KeyboardEventCode.NonConvert, KeyCode.Unknown); + define(KeyboardEventCode.Lang1, KeyCode.Unknown); + define(KeyboardEventCode.Lang2, KeyCode.Unknown); + define(KeyboardEventCode.Lang3, KeyCode.Unknown); + define(KeyboardEventCode.Lang4, KeyCode.Unknown); + define(KeyboardEventCode.Lang5, KeyCode.Unknown); + define(KeyboardEventCode.Abort, KeyCode.Unknown); + define(KeyboardEventCode.Props, KeyCode.Unknown); + define(KeyboardEventCode.NumpadParenLeft, KeyCode.Unknown); + define(KeyboardEventCode.NumpadParenRight, KeyCode.Unknown); + define(KeyboardEventCode.NumpadBackspace, KeyCode.Unknown); + define(KeyboardEventCode.NumpadMemoryStore, KeyCode.Unknown); + define(KeyboardEventCode.NumpadMemoryRecall, KeyCode.Unknown); + define(KeyboardEventCode.NumpadMemoryClear, KeyCode.Unknown); + define(KeyboardEventCode.NumpadMemoryAdd, KeyCode.Unknown); + define(KeyboardEventCode.NumpadMemorySubtract, KeyCode.Unknown); + define(KeyboardEventCode.NumpadClear, KeyCode.Unknown); + define(KeyboardEventCode.NumpadClearEntry, KeyCode.Unknown); + define(KeyboardEventCode.ControlLeft, KeyCode.Ctrl); // TODO + define(KeyboardEventCode.ShiftLeft, KeyCode.Shift); // TODO + define(KeyboardEventCode.AltLeft, KeyCode.Alt); // TODO + define(KeyboardEventCode.MetaLeft, KeyCode.Meta); // TODO + define(KeyboardEventCode.ControlRight, KeyCode.Ctrl); // TODO + define(KeyboardEventCode.ShiftRight, KeyCode.Shift); // TODO + define(KeyboardEventCode.AltRight, KeyCode.Alt); // TODO + define(KeyboardEventCode.MetaRight, KeyCode.Meta); // TODO + define(KeyboardEventCode.BrightnessUp, KeyCode.Unknown); + define(KeyboardEventCode.BrightnessDown, KeyCode.Unknown); + define(KeyboardEventCode.MediaPlay, KeyCode.Unknown); + define(KeyboardEventCode.MediaRecord, KeyCode.Unknown); + define(KeyboardEventCode.MediaFastForward, KeyCode.Unknown); + define(KeyboardEventCode.MediaRewind, KeyCode.Unknown); + define(KeyboardEventCode.MediaTrackNext, KeyCode.Unknown); + define(KeyboardEventCode.MediaTrackPrevious, KeyCode.Unknown); + define(KeyboardEventCode.MediaStop, KeyCode.Unknown); + define(KeyboardEventCode.Eject, KeyCode.Unknown); + define(KeyboardEventCode.MediaPlayPause, KeyCode.Unknown); + define(KeyboardEventCode.MediaSelect, KeyCode.Unknown); + define(KeyboardEventCode.LaunchMail, KeyCode.Unknown); + define(KeyboardEventCode.LaunchApp2, KeyCode.Unknown); + define(KeyboardEventCode.LaunchApp1, KeyCode.Unknown); + define(KeyboardEventCode.SelectTask, KeyCode.Unknown); + define(KeyboardEventCode.LaunchScreenSaver, KeyCode.Unknown); + define(KeyboardEventCode.BrowserSearch, KeyCode.Unknown); + define(KeyboardEventCode.BrowserHome, KeyCode.Unknown); + define(KeyboardEventCode.BrowserBack, KeyCode.Unknown); + define(KeyboardEventCode.BrowserForward, KeyCode.Unknown); + define(KeyboardEventCode.BrowserStop, KeyCode.Unknown); + define(KeyboardEventCode.BrowserRefresh, KeyCode.Unknown); + define(KeyboardEventCode.BrowserFavorites, KeyCode.Unknown); + define(KeyboardEventCode.ZoomToggle, KeyCode.Unknown); + define(KeyboardEventCode.MailReply, KeyCode.Unknown); + define(KeyboardEventCode.MailForward, KeyCode.Unknown); + define(KeyboardEventCode.MailSend, KeyCode.Unknown); +})(); diff --git a/src/vs/workbench/services/keybinding/common/keyboardMapper.ts b/src/vs/workbench/services/keybinding/common/keyboardMapper.ts index 888335df43f..c6406e8226c 100644 --- a/src/vs/workbench/services/keybinding/common/keyboardMapper.ts +++ b/src/vs/workbench/services/keybinding/common/keyboardMapper.ts @@ -7,7 +7,7 @@ import { OperatingSystem } from 'vs/base/common/platform'; import { SimpleKeybinding, KeyCode, ResolvedKeybinding, Keybinding, KeyCodeUtils, KeyMod } from 'vs/base/common/keyCodes'; -import { KeyboardEventCode, KeyboardEventCodeUtils } from 'vs/workbench/services/keybinding/common/keyboardEventCode'; +import { KeyboardEventCode, KeyboardEventCodeUtils, IMMUTABLE_CODE_TO_KEY_CODE } from 'vs/workbench/services/keybinding/common/keyboardEventCode'; import { CharCode } from 'vs/base/common/charCode'; import { IHTMLContentElement } from 'vs/base/common/htmlContent'; import { PrintableKeypress, UILabelProvider, AriaLabelProvider } from 'vs/platform/keybinding/common/keybindingLabels'; @@ -35,10 +35,6 @@ function log(str: string): void { } } -/** - * -1 if a HwCode => KeyCode mapping depends on kb layout. - */ -const IMMUTABLE_CODE_TO_KEY_CODE: KeyCode[] = []; const CHAR_CODE_TO_KEY_CODE: { keyCode: KeyCode; shiftKey: boolean }[] = []; export class HardwareKeypress { @@ -575,210 +571,6 @@ export class KeyboardMapper { } } -(function () { - for (let i = 0; i <= KeyboardEventCode.MAX_VALUE; i++) { - IMMUTABLE_CODE_TO_KEY_CODE[i] = -1; - } - - function define(code: KeyboardEventCode, keyCode: KeyCode): void { - IMMUTABLE_CODE_TO_KEY_CODE[code] = keyCode; - } - - define(KeyboardEventCode.None, KeyCode.Unknown); - define(KeyboardEventCode.Hyper, KeyCode.Unknown); - define(KeyboardEventCode.Super, KeyCode.Unknown); - define(KeyboardEventCode.Fn, KeyCode.Unknown); - define(KeyboardEventCode.FnLock, KeyCode.Unknown); - define(KeyboardEventCode.Suspend, KeyCode.Unknown); - define(KeyboardEventCode.Resume, KeyCode.Unknown); - define(KeyboardEventCode.Turbo, KeyCode.Unknown); - define(KeyboardEventCode.Sleep, KeyCode.Unknown); - define(KeyboardEventCode.WakeUp, KeyCode.Unknown); - // define(KeyboardEventCode.KeyA, KeyCode.Unknown); - // define(KeyboardEventCode.KeyB, KeyCode.Unknown); - // define(KeyboardEventCode.KeyC, KeyCode.Unknown); - // define(KeyboardEventCode.KeyD, KeyCode.Unknown); - // define(KeyboardEventCode.KeyE, KeyCode.Unknown); - // define(KeyboardEventCode.KeyF, KeyCode.Unknown); - // define(KeyboardEventCode.KeyG, KeyCode.Unknown); - // define(KeyboardEventCode.KeyH, KeyCode.Unknown); - // define(KeyboardEventCode.KeyI, KeyCode.Unknown); - // define(KeyboardEventCode.KeyJ, KeyCode.Unknown); - // define(KeyboardEventCode.KeyK, KeyCode.Unknown); - // define(KeyboardEventCode.KeyL, KeyCode.Unknown); - // define(KeyboardEventCode.KeyM, KeyCode.Unknown); - // define(KeyboardEventCode.KeyN, KeyCode.Unknown); - // define(KeyboardEventCode.KeyO, KeyCode.Unknown); - // define(KeyboardEventCode.KeyP, KeyCode.Unknown); - // define(KeyboardEventCode.KeyQ, KeyCode.Unknown); - // define(KeyboardEventCode.KeyR, KeyCode.Unknown); - // define(KeyboardEventCode.KeyS, KeyCode.Unknown); - // define(KeyboardEventCode.KeyT, KeyCode.Unknown); - // define(KeyboardEventCode.KeyU, KeyCode.Unknown); - // define(KeyboardEventCode.KeyV, KeyCode.Unknown); - // define(KeyboardEventCode.KeyW, KeyCode.Unknown); - // define(KeyboardEventCode.KeyX, KeyCode.Unknown); - // define(KeyboardEventCode.KeyY, KeyCode.Unknown); - // define(KeyboardEventCode.KeyZ, KeyCode.Unknown); - // define(KeyboardEventCode.Digit1, KeyCode.Unknown); - // define(KeyboardEventCode.Digit2, KeyCode.Unknown); - // define(KeyboardEventCode.Digit3, KeyCode.Unknown); - // define(KeyboardEventCode.Digit4, KeyCode.Unknown); - // define(KeyboardEventCode.Digit5, KeyCode.Unknown); - // define(KeyboardEventCode.Digit6, KeyCode.Unknown); - // define(KeyboardEventCode.Digit7, KeyCode.Unknown); - // define(KeyboardEventCode.Digit8, KeyCode.Unknown); - // define(KeyboardEventCode.Digit9, KeyCode.Unknown); - // define(KeyboardEventCode.Digit0, KeyCode.Unknown); - define(KeyboardEventCode.Enter, KeyCode.Enter); - define(KeyboardEventCode.Escape, KeyCode.Escape); - define(KeyboardEventCode.Backspace, KeyCode.Backspace); - define(KeyboardEventCode.Tab, KeyCode.Tab); - define(KeyboardEventCode.Space, KeyCode.Space); - // define(KeyboardEventCode.Minus, KeyCode.Unknown); - // define(KeyboardEventCode.Equal, KeyCode.Unknown); - // define(KeyboardEventCode.BracketLeft, KeyCode.Unknown); - // define(KeyboardEventCode.BracketRight, KeyCode.Unknown); - // define(KeyboardEventCode.Backslash, KeyCode.Unknown); - // define(KeyboardEventCode.IntlHash, KeyCode.Unknown); - // define(KeyboardEventCode.Semicolon, KeyCode.Unknown); - // define(KeyboardEventCode.Quote, KeyCode.Unknown); - // define(KeyboardEventCode.Backquote, KeyCode.Unknown); - // define(KeyboardEventCode.Comma, KeyCode.Unknown); - // define(KeyboardEventCode.Period, KeyCode.Unknown); - // define(KeyboardEventCode.Slash, KeyCode.Unknown); - define(KeyboardEventCode.CapsLock, KeyCode.CapsLock); - define(KeyboardEventCode.F1, KeyCode.F1); - define(KeyboardEventCode.F2, KeyCode.F2); - define(KeyboardEventCode.F3, KeyCode.F3); - define(KeyboardEventCode.F4, KeyCode.F4); - define(KeyboardEventCode.F5, KeyCode.F5); - define(KeyboardEventCode.F6, KeyCode.F6); - define(KeyboardEventCode.F7, KeyCode.F7); - define(KeyboardEventCode.F8, KeyCode.F8); - define(KeyboardEventCode.F9, KeyCode.F9); - define(KeyboardEventCode.F10, KeyCode.F10); - define(KeyboardEventCode.F11, KeyCode.F11); - define(KeyboardEventCode.F12, KeyCode.F12); - define(KeyboardEventCode.PrintScreen, KeyCode.Unknown); - define(KeyboardEventCode.ScrollLock, KeyCode.ScrollLock); - define(KeyboardEventCode.Pause, KeyCode.PauseBreak); - define(KeyboardEventCode.Insert, KeyCode.Insert); - define(KeyboardEventCode.Home, KeyCode.Home); - define(KeyboardEventCode.PageUp, KeyCode.PageUp); - define(KeyboardEventCode.Delete, KeyCode.Delete); - define(KeyboardEventCode.End, KeyCode.End); - define(KeyboardEventCode.PageDown, KeyCode.PageDown); - define(KeyboardEventCode.ArrowRight, KeyCode.RightArrow); - define(KeyboardEventCode.ArrowLeft, KeyCode.LeftArrow); - define(KeyboardEventCode.ArrowDown, KeyCode.DownArrow); - define(KeyboardEventCode.ArrowUp, KeyCode.UpArrow); - define(KeyboardEventCode.NumLock, KeyCode.NumLock); - define(KeyboardEventCode.NumpadDivide, KeyCode.NUMPAD_DIVIDE); - define(KeyboardEventCode.NumpadMultiply, KeyCode.NUMPAD_MULTIPLY); - define(KeyboardEventCode.NumpadSubtract, KeyCode.NUMPAD_SUBTRACT); - define(KeyboardEventCode.NumpadAdd, KeyCode.NUMPAD_ADD); - define(KeyboardEventCode.NumpadEnter, KeyCode.Enter); // TODO - define(KeyboardEventCode.Numpad1, KeyCode.NUMPAD_1); - define(KeyboardEventCode.Numpad2, KeyCode.NUMPAD_2); - define(KeyboardEventCode.Numpad3, KeyCode.NUMPAD_3); - define(KeyboardEventCode.Numpad4, KeyCode.NUMPAD_4); - define(KeyboardEventCode.Numpad5, KeyCode.NUMPAD_5); - define(KeyboardEventCode.Numpad6, KeyCode.NUMPAD_6); - define(KeyboardEventCode.Numpad7, KeyCode.NUMPAD_7); - define(KeyboardEventCode.Numpad8, KeyCode.NUMPAD_8); - define(KeyboardEventCode.Numpad9, KeyCode.NUMPAD_9); - define(KeyboardEventCode.Numpad0, KeyCode.NUMPAD_0); - define(KeyboardEventCode.NumpadDecimal, KeyCode.NUMPAD_DECIMAL); - // define(KeyboardEventCode.IntlBackslash, KeyCode.Unknown); - define(KeyboardEventCode.ContextMenu, KeyCode.ContextMenu); - define(KeyboardEventCode.Power, KeyCode.Unknown); - define(KeyboardEventCode.NumpadEqual, KeyCode.Unknown); - define(KeyboardEventCode.F13, KeyCode.F13); - define(KeyboardEventCode.F14, KeyCode.F14); - define(KeyboardEventCode.F15, KeyCode.F15); - define(KeyboardEventCode.F16, KeyCode.F16); - define(KeyboardEventCode.F17, KeyCode.F17); - define(KeyboardEventCode.F18, KeyCode.F18); - define(KeyboardEventCode.F19, KeyCode.F19); - define(KeyboardEventCode.F20, KeyCode.Unknown); - define(KeyboardEventCode.F21, KeyCode.Unknown); - define(KeyboardEventCode.F22, KeyCode.Unknown); - define(KeyboardEventCode.F23, KeyCode.Unknown); - define(KeyboardEventCode.F24, KeyCode.Unknown); - define(KeyboardEventCode.Open, KeyCode.Unknown); - define(KeyboardEventCode.Help, KeyCode.Unknown); - define(KeyboardEventCode.Select, KeyCode.Unknown); - define(KeyboardEventCode.Again, KeyCode.Unknown); - define(KeyboardEventCode.Undo, KeyCode.Unknown); - define(KeyboardEventCode.Cut, KeyCode.Unknown); - define(KeyboardEventCode.Copy, KeyCode.Unknown); - define(KeyboardEventCode.Paste, KeyCode.Unknown); - define(KeyboardEventCode.Find, KeyCode.Unknown); - define(KeyboardEventCode.AudioVolumeMute, KeyCode.Unknown); - define(KeyboardEventCode.AudioVolumeUp, KeyCode.Unknown); - define(KeyboardEventCode.AudioVolumeDown, KeyCode.Unknown); - define(KeyboardEventCode.NumpadComma, KeyCode.NUMPAD_SEPARATOR); - define(KeyboardEventCode.IntlRo, KeyCode.Unknown); - define(KeyboardEventCode.KanaMode, KeyCode.Unknown); - define(KeyboardEventCode.IntlYen, KeyCode.Unknown); - define(KeyboardEventCode.Convert, KeyCode.Unknown); - define(KeyboardEventCode.NonConvert, KeyCode.Unknown); - define(KeyboardEventCode.Lang1, KeyCode.Unknown); - define(KeyboardEventCode.Lang2, KeyCode.Unknown); - define(KeyboardEventCode.Lang3, KeyCode.Unknown); - define(KeyboardEventCode.Lang4, KeyCode.Unknown); - define(KeyboardEventCode.Lang5, KeyCode.Unknown); - define(KeyboardEventCode.Abort, KeyCode.Unknown); - define(KeyboardEventCode.Props, KeyCode.Unknown); - define(KeyboardEventCode.NumpadParenLeft, KeyCode.Unknown); - define(KeyboardEventCode.NumpadParenRight, KeyCode.Unknown); - define(KeyboardEventCode.NumpadBackspace, KeyCode.Unknown); - define(KeyboardEventCode.NumpadMemoryStore, KeyCode.Unknown); - define(KeyboardEventCode.NumpadMemoryRecall, KeyCode.Unknown); - define(KeyboardEventCode.NumpadMemoryClear, KeyCode.Unknown); - define(KeyboardEventCode.NumpadMemoryAdd, KeyCode.Unknown); - define(KeyboardEventCode.NumpadMemorySubtract, KeyCode.Unknown); - define(KeyboardEventCode.NumpadClear, KeyCode.Unknown); - define(KeyboardEventCode.NumpadClearEntry, KeyCode.Unknown); - define(KeyboardEventCode.ControlLeft, KeyCode.Ctrl); // TODO - define(KeyboardEventCode.ShiftLeft, KeyCode.Shift); // TODO - define(KeyboardEventCode.AltLeft, KeyCode.Alt); // TODO - define(KeyboardEventCode.MetaLeft, KeyCode.Meta); // TODO - define(KeyboardEventCode.ControlRight, KeyCode.Ctrl); // TODO - define(KeyboardEventCode.ShiftRight, KeyCode.Shift); // TODO - define(KeyboardEventCode.AltRight, KeyCode.Alt); // TODO - define(KeyboardEventCode.MetaRight, KeyCode.Meta); // TODO - define(KeyboardEventCode.BrightnessUp, KeyCode.Unknown); - define(KeyboardEventCode.BrightnessDown, KeyCode.Unknown); - define(KeyboardEventCode.MediaPlay, KeyCode.Unknown); - define(KeyboardEventCode.MediaRecord, KeyCode.Unknown); - define(KeyboardEventCode.MediaFastForward, KeyCode.Unknown); - define(KeyboardEventCode.MediaRewind, KeyCode.Unknown); - define(KeyboardEventCode.MediaTrackNext, KeyCode.Unknown); - define(KeyboardEventCode.MediaTrackPrevious, KeyCode.Unknown); - define(KeyboardEventCode.MediaStop, KeyCode.Unknown); - define(KeyboardEventCode.Eject, KeyCode.Unknown); - define(KeyboardEventCode.MediaPlayPause, KeyCode.Unknown); - define(KeyboardEventCode.MediaSelect, KeyCode.Unknown); - define(KeyboardEventCode.LaunchMail, KeyCode.Unknown); - define(KeyboardEventCode.LaunchApp2, KeyCode.Unknown); - define(KeyboardEventCode.LaunchApp1, KeyCode.Unknown); - define(KeyboardEventCode.SelectTask, KeyCode.Unknown); - define(KeyboardEventCode.LaunchScreenSaver, KeyCode.Unknown); - define(KeyboardEventCode.BrowserSearch, KeyCode.Unknown); - define(KeyboardEventCode.BrowserHome, KeyCode.Unknown); - define(KeyboardEventCode.BrowserBack, KeyCode.Unknown); - define(KeyboardEventCode.BrowserForward, KeyCode.Unknown); - define(KeyboardEventCode.BrowserStop, KeyCode.Unknown); - define(KeyboardEventCode.BrowserRefresh, KeyCode.Unknown); - define(KeyboardEventCode.BrowserFavorites, KeyCode.Unknown); - define(KeyboardEventCode.ZoomToggle, KeyCode.Unknown); - define(KeyboardEventCode.MailReply, KeyCode.Unknown); - define(KeyboardEventCode.MailForward, KeyCode.Unknown); - define(KeyboardEventCode.MailSend, KeyCode.Unknown); -})(); - (function () { function define(charCode: number, keyCode: KeyCode, shiftKey: boolean): void { for (let i = CHAR_CODE_TO_KEY_CODE.length; i < charCode; i++) { diff --git a/src/vs/workbench/services/keybinding/common/windowsKeyboardMapper.ts b/src/vs/workbench/services/keybinding/common/windowsKeyboardMapper.ts new file mode 100644 index 00000000000..ac0d9af60a5 --- /dev/null +++ b/src/vs/workbench/services/keybinding/common/windowsKeyboardMapper.ts @@ -0,0 +1,357 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +'use strict'; + +import { KeyCode, KeyCodeUtils } from 'vs/base/common/keyCodes'; +import { KeyboardEventCode, KeyboardEventCodeUtils, IMMUTABLE_CODE_TO_KEY_CODE } from 'vs/workbench/services/keybinding/common/keyboardEventCode'; +import { CharCode } from 'vs/base/common/charCode'; + +export interface IKeyMapping { + vkey: string; + value: string; + withShift: string; + withAltGr: string; + withShiftAltGr: string; +} + +export interface IKeyboardMapping { + [code: string]: IKeyMapping; +} + +const LOG = false; +function log(str: string): void { + if (LOG) { + console.info(str); + } +} + +const NATIVE_KEY_CODE_TO_KEY_CODE: { [nativeKeyCode: string]: KeyCode; } = _getNativeMap(); + +interface IHardwareCodeMapping { + code: KeyboardEventCode; + keyCode: KeyCode; + value: number; + withShift: number; + withAltGr: number; + withShiftAltGr: number; +} + +export class WindowsKeyboardMapper { + + private readonly _codeInfo: IHardwareCodeMapping[]; + private readonly _hwToKb: KeyCode[]; + private readonly _hwToLabel: string[] = []; + + constructor(rawMappings: IKeyboardMapping) { + this._hwToKb = []; + this._hwToLabel = []; + + for (let code = KeyboardEventCode.None; code < KeyboardEventCode.MAX_VALUE; code++) { + const immutableKeyCode = IMMUTABLE_CODE_TO_KEY_CODE[code]; + if (immutableKeyCode !== -1) { + this._hwToKb[code] = immutableKeyCode; + this._hwToLabel[code] = KeyCodeUtils.toString(immutableKeyCode); + } + } + + this._codeInfo = []; + for (let strCode in rawMappings) { + if (rawMappings.hasOwnProperty(strCode)) { + const code = KeyboardEventCodeUtils.toEnum(strCode); + if (code === KeyboardEventCode.None) { + log(`Unknown code ${strCode} in mapping.`); + continue; + } + if (IMMUTABLE_CODE_TO_KEY_CODE[code] !== -1) { + continue; + } + + const rawMapping = rawMappings[strCode]; + const value = WindowsKeyboardMapper._getCharCode(rawMapping.value); + const withShift = WindowsKeyboardMapper._getCharCode(rawMapping.withShift); + const withAltGr = WindowsKeyboardMapper._getCharCode(rawMapping.withAltGr); + const withShiftAltGr = WindowsKeyboardMapper._getCharCode(rawMapping.withShiftAltGr); + const keyCode = NATIVE_KEY_CODE_TO_KEY_CODE[rawMapping.vkey] || KeyCode.Unknown; + + const mapping: IHardwareCodeMapping = { + code: code, + keyCode: keyCode, + value: value, + withShift: withShift, + withAltGr: withAltGr, + withShiftAltGr: withShiftAltGr, + }; + this._codeInfo[code] = mapping; + + if (value >= CharCode.a && value <= CharCode.z) { + this._hwToLabel[code] = String.fromCharCode(CharCode.A + (value - CharCode.a)); + } else if (value) { + this._hwToLabel[code] = String.fromCharCode(value); + } else { + this._hwToLabel[code] = null; + } + this._hwToKb[code] = keyCode; + } + } + } + + public dumpDebugInfo(): string { + let result: string[] = []; + + let cnt = 0; + for (let code = KeyboardEventCode.None; code < KeyboardEventCode.MAX_VALUE; code++) { + if (IMMUTABLE_CODE_TO_KEY_CODE[code] !== -1) { + continue; + } + + if (cnt % 5 === 0) { + result.push(`--------------------------------------------------------------------------------------------------`); + result.push(`| HW Code combination | Key | KeyCode combination | UI label |`); + result.push(`--------------------------------------------------------------------------------------------------`); + } + cnt++; + + const mapping = this._codeInfo[code]; + const strCode = KeyboardEventCodeUtils.toString(code); + const uiLabel = this._hwToLabel[code]; + + let mods = [0b000, 0b010, 0b101, 0b111]; + for (let modIndex = 0; modIndex < mods.length; modIndex++) { + const mod = mods[modIndex]; + const ctrlKey = (mod & 0b001) ? true : false; + const shiftKey = (mod & 0b010) ? true : false; + const altKey = (mod & 0b100) ? true : false; + const strHw = `${ctrlKey ? 'Ctrl+' : ''}${shiftKey ? 'Shift+' : ''}${altKey ? 'Alt+' : ''}${strCode}`; + const uiHwLabel = `${ctrlKey ? 'Ctrl+' : ''}${shiftKey ? 'Shift+' : ''}${altKey ? 'Alt+' : ''}${uiLabel}`; + + let key = 0; + if (mapping) { + if (ctrlKey && shiftKey && altKey) { + key = mapping.withShiftAltGr; + } else if (ctrlKey && altKey) { + key = mapping.withAltGr; + } else if (shiftKey) { + key = mapping.withShift; + } else { + key = mapping.value; + } + } + let strKey: string = ' --- '; + if (key !== 0) { + if (key >= CharCode.U_Combining_Grave_Accent && key <= CharCode.U_Combining_Latin_Small_Letter_X) { + // combining + strKey = 'U+' + key.toString(16); + } else { + strKey = ' ' + String.fromCharCode(key) + ' '; + } + } + + const keyCode = this._hwToKb[code]; + const strKb = `${ctrlKey ? 'Ctrl+' : ''}${shiftKey ? 'Shift+' : ''}${altKey ? 'Alt+' : ''}${KeyCodeUtils.toString(keyCode)}`; + + result.push(`| ${this._leftPad(strHw, 30)} | ${strKey} | ${this._leftPad(strKb, 25)} | ${this._leftPad(uiHwLabel, 25)} |`); + } + } + + result.push(`--------------------------------------------------------------------------------------------------`); + + return result.join('\n'); + } + + private _leftPad(str: string, cnt: number): string { + while (str.length < cnt) { + str = ' ' + str; + } + return str; + } + + private static _getCharCode(char: string): number { + if (char.length === 0) { + return 0; + } + return char.charCodeAt(0); + } +} + + +// See https://msdn.microsoft.com/en-us/library/windows/desktop/dd375731(v=vs.85).aspx +// See https://github.com/Microsoft/node-native-keymap/blob/master/deps/chromium/keyboard_codes_win.h +function _getNativeMap() { + return { + VK_BACK: KeyCode.Backspace, + VK_TAB: KeyCode.Tab, + VK_CLEAR: KeyCode.Unknown, // MISSING + VK_RETURN: KeyCode.Enter, + VK_SHIFT: KeyCode.Shift, + VK_CONTROL: KeyCode.Ctrl, + VK_MENU: KeyCode.Alt, + VK_PAUSE: KeyCode.PauseBreak, + VK_CAPITAL: KeyCode.CapsLock, + VK_KANA: KeyCode.Unknown, // MISSING + VK_HANGUL: KeyCode.Unknown, // MISSING + VK_JUNJA: KeyCode.Unknown, // MISSING + VK_FINAL: KeyCode.Unknown, // MISSING + VK_HANJA: KeyCode.Unknown, // MISSING + VK_KANJI: KeyCode.Unknown, // MISSING + VK_ESCAPE: KeyCode.Escape, + VK_CONVERT: KeyCode.Unknown, // MISSING + VK_NONCONVERT: KeyCode.Unknown, // MISSING + VK_ACCEPT: KeyCode.Unknown, // MISSING + VK_MODECHANGE: KeyCode.Unknown, // MISSING + VK_SPACE: KeyCode.Space, + VK_PRIOR: KeyCode.PageUp, + VK_NEXT: KeyCode.PageDown, + VK_END: KeyCode.End, + VK_HOME: KeyCode.Home, + VK_LEFT: KeyCode.LeftArrow, + VK_UP: KeyCode.UpArrow, + VK_RIGHT: KeyCode.RightArrow, + VK_DOWN: KeyCode.DownArrow, + VK_SELECT: KeyCode.Unknown, // MISSING + VK_PRINT: KeyCode.Unknown, // MISSING + VK_EXECUTE: KeyCode.Unknown, // MISSING + VK_SNAPSHOT: KeyCode.Unknown, // MISSING + VK_INSERT: KeyCode.Insert, + VK_DELETE: KeyCode.Delete, + VK_HELP: KeyCode.Unknown, // MISSING + + VK_0: KeyCode.KEY_0, + VK_1: KeyCode.KEY_1, + VK_2: KeyCode.KEY_2, + VK_3: KeyCode.KEY_3, + VK_4: KeyCode.KEY_4, + VK_5: KeyCode.KEY_5, + VK_6: KeyCode.KEY_6, + VK_7: KeyCode.KEY_7, + VK_8: KeyCode.KEY_8, + VK_9: KeyCode.KEY_9, + VK_A: KeyCode.KEY_A, + VK_B: KeyCode.KEY_B, + VK_C: KeyCode.KEY_C, + VK_D: KeyCode.KEY_D, + VK_E: KeyCode.KEY_E, + VK_F: KeyCode.KEY_F, + VK_G: KeyCode.KEY_G, + VK_H: KeyCode.KEY_H, + VK_I: KeyCode.KEY_I, + VK_J: KeyCode.KEY_J, + VK_K: KeyCode.KEY_K, + VK_L: KeyCode.KEY_L, + VK_M: KeyCode.KEY_M, + VK_N: KeyCode.KEY_N, + VK_O: KeyCode.KEY_O, + VK_P: KeyCode.KEY_P, + VK_Q: KeyCode.KEY_Q, + VK_R: KeyCode.KEY_R, + VK_S: KeyCode.KEY_S, + VK_T: KeyCode.KEY_T, + VK_U: KeyCode.KEY_U, + VK_V: KeyCode.KEY_V, + VK_W: KeyCode.KEY_W, + VK_X: KeyCode.KEY_X, + VK_Y: KeyCode.KEY_Y, + VK_Z: KeyCode.KEY_Z, + + VK_LWIN: KeyCode.Meta, + VK_COMMAND: KeyCode.Meta, + VK_RWIN: KeyCode.Meta, + VK_APPS: KeyCode.Unknown, // MISSING + VK_SLEEP: KeyCode.Unknown, // MISSING + VK_NUMPAD0: KeyCode.NUMPAD_0, + VK_NUMPAD1: KeyCode.NUMPAD_1, + VK_NUMPAD2: KeyCode.NUMPAD_2, + VK_NUMPAD3: KeyCode.NUMPAD_3, + VK_NUMPAD4: KeyCode.NUMPAD_4, + VK_NUMPAD5: KeyCode.NUMPAD_5, + VK_NUMPAD6: KeyCode.NUMPAD_6, + VK_NUMPAD7: KeyCode.NUMPAD_7, + VK_NUMPAD8: KeyCode.NUMPAD_8, + VK_NUMPAD9: KeyCode.NUMPAD_9, + VK_MULTIPLY: KeyCode.NUMPAD_MULTIPLY, + VK_ADD: KeyCode.NUMPAD_ADD, + VK_SEPARATOR: KeyCode.NUMPAD_SEPARATOR, + VK_SUBTRACT: KeyCode.NUMPAD_SUBTRACT, + VK_DECIMAL: KeyCode.NUMPAD_DECIMAL, + VK_DIVIDE: KeyCode.NUMPAD_DIVIDE, + VK_F1: KeyCode.F1, + VK_F2: KeyCode.F2, + VK_F3: KeyCode.F3, + VK_F4: KeyCode.F4, + VK_F5: KeyCode.F5, + VK_F6: KeyCode.F6, + VK_F7: KeyCode.F7, + VK_F8: KeyCode.F8, + VK_F9: KeyCode.F9, + VK_F10: KeyCode.F10, + VK_F11: KeyCode.F11, + VK_F12: KeyCode.F12, + VK_F13: KeyCode.F13, + VK_F14: KeyCode.F14, + VK_F15: KeyCode.F15, + VK_F16: KeyCode.F16, + VK_F17: KeyCode.F17, + VK_F18: KeyCode.F18, + VK_F19: KeyCode.F19, + VK_F20: KeyCode.Unknown, // MISSING + VK_F21: KeyCode.Unknown, // MISSING + VK_F22: KeyCode.Unknown, // MISSING + VK_F23: KeyCode.Unknown, // MISSING + VK_F24: KeyCode.Unknown, // MISSING + VK_NUMLOCK: KeyCode.NumLock, + VK_SCROLL: KeyCode.ScrollLock, + VK_LSHIFT: KeyCode.Shift, + VK_RSHIFT: KeyCode.Shift, + VK_LCONTROL: KeyCode.Ctrl, + VK_RCONTROL: KeyCode.Ctrl, + VK_LMENU: KeyCode.Unknown, // MISSING + VK_RMENU: KeyCode.Unknown, // MISSING + VK_BROWSER_BACK: KeyCode.Unknown, // MISSING + VK_BROWSER_FORWARD: KeyCode.Unknown, // MISSING + VK_BROWSER_REFRESH: KeyCode.Unknown, // MISSING + VK_BROWSER_STOP: KeyCode.Unknown, // MISSING + VK_BROWSER_SEARCH: KeyCode.Unknown, // MISSING + VK_BROWSER_FAVORITES: KeyCode.Unknown, // MISSING + VK_BROWSER_HOME: KeyCode.Unknown, // MISSING + VK_VOLUME_MUTE: KeyCode.Unknown, // MISSING + VK_VOLUME_DOWN: KeyCode.Unknown, // MISSING + VK_VOLUME_UP: KeyCode.Unknown, // MISSING + VK_MEDIA_NEXT_TRACK: KeyCode.Unknown, // MISSING + VK_MEDIA_PREV_TRACK: KeyCode.Unknown, // MISSING + VK_MEDIA_STOP: KeyCode.Unknown, // MISSING + VK_MEDIA_PLAY_PAUSE: KeyCode.Unknown, // MISSING + VK_MEDIA_LAUNCH_MAIL: KeyCode.Unknown, // MISSING + VK_MEDIA_LAUNCH_MEDIA_SELECT: KeyCode.Unknown, // MISSING + VK_MEDIA_LAUNCH_APP1: KeyCode.Unknown, // MISSING + VK_MEDIA_LAUNCH_APP2: KeyCode.Unknown, // MISSING + VK_OEM_1: KeyCode.US_SEMICOLON, + VK_OEM_PLUS: KeyCode.US_EQUAL, + VK_OEM_COMMA: KeyCode.US_COMMA, + VK_OEM_MINUS: KeyCode.US_MINUS, + VK_OEM_PERIOD: KeyCode.US_DOT, + VK_OEM_2: KeyCode.US_SLASH, + VK_OEM_3: KeyCode.US_BACKTICK, + VK_OEM_4: KeyCode.US_OPEN_SQUARE_BRACKET, + VK_OEM_5: KeyCode.US_BACKSLASH, + VK_OEM_6: KeyCode.US_CLOSE_SQUARE_BRACKET, + VK_OEM_7: KeyCode.US_QUOTE, + VK_OEM_8: KeyCode.OEM_8, + VK_OEM_102: KeyCode.OEM_102, + VK_PROCESSKEY: KeyCode.Unknown, // MISSING + VK_PACKET: KeyCode.Unknown, // MISSING + VK_DBE_SBCSCHAR: KeyCode.Unknown, // MISSING + VK_DBE_DBCSCHAR: KeyCode.Unknown, // MISSING + VK_ATTN: KeyCode.Unknown, // MISSING + VK_CRSEL: KeyCode.Unknown, // MISSING + VK_EXSEL: KeyCode.Unknown, // MISSING + VK_EREOF: KeyCode.Unknown, // MISSING + VK_PLAY: KeyCode.Unknown, // MISSING + VK_ZOOM: KeyCode.Unknown, // MISSING + VK_NONAME: KeyCode.Unknown, // MISSING + VK_PA1: KeyCode.Unknown, // MISSING + VK_OEM_CLEAR: KeyCode.Unknown, // MISSING + VK_UNKNOWN: KeyCode.Unknown, + }; +} diff --git a/src/vs/workbench/services/keybinding/test/win_de_ch.js b/src/vs/workbench/services/keybinding/test/win_de_ch.js new file mode 100644 index 00000000000..cf5a14656b5 --- /dev/null +++ b/src/vs/workbench/services/keybinding/test/win_de_ch.js @@ -0,0 +1,1093 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +'use strict'; + +define({ + Sleep: { + vkey: 'VK_SLEEP', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + WakeUp: { + vkey: 'VK_UNKNOWN', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + KeyA: { + vkey: 'VK_A', + value: 'a', + withShift: 'A', + withAltGr: '', + withShiftAltGr: '' + }, + KeyB: { + vkey: 'VK_B', + value: 'b', + withShift: 'B', + withAltGr: '', + withShiftAltGr: '' + }, + KeyC: { + vkey: 'VK_C', + value: 'c', + withShift: 'C', + withAltGr: '', + withShiftAltGr: '' + }, + KeyD: { + vkey: 'VK_D', + value: 'd', + withShift: 'D', + withAltGr: '', + withShiftAltGr: '' + }, + KeyE: { + vkey: 'VK_E', + value: 'e', + withShift: 'E', + withAltGr: '€', + withShiftAltGr: '' + }, + KeyF: { + vkey: 'VK_F', + value: 'f', + withShift: 'F', + withAltGr: '', + withShiftAltGr: '' + }, + KeyG: { + vkey: 'VK_G', + value: 'g', + withShift: 'G', + withAltGr: '', + withShiftAltGr: '' + }, + KeyH: { + vkey: 'VK_H', + value: 'h', + withShift: 'H', + withAltGr: '', + withShiftAltGr: '' + }, + KeyI: { + vkey: 'VK_I', + value: 'i', + withShift: 'I', + withAltGr: '', + withShiftAltGr: '' + }, + KeyJ: { + vkey: 'VK_J', + value: 'j', + withShift: 'J', + withAltGr: '', + withShiftAltGr: '' + }, + KeyK: { + vkey: 'VK_K', + value: 'k', + withShift: 'K', + withAltGr: '', + withShiftAltGr: '' + }, + KeyL: { + vkey: 'VK_L', + value: 'l', + withShift: 'L', + withAltGr: '', + withShiftAltGr: '' + }, + KeyM: { + vkey: 'VK_M', + value: 'm', + withShift: 'M', + withAltGr: '', + withShiftAltGr: '' + }, + KeyN: { + vkey: 'VK_N', + value: 'n', + withShift: 'N', + withAltGr: '', + withShiftAltGr: '' + }, + KeyO: { + vkey: 'VK_O', + value: 'o', + withShift: 'O', + withAltGr: '', + withShiftAltGr: '' + }, + KeyP: { + vkey: 'VK_P', + value: 'p', + withShift: 'P', + withAltGr: '', + withShiftAltGr: '' + }, + KeyQ: { + vkey: 'VK_Q', + value: 'q', + withShift: 'Q', + withAltGr: '', + withShiftAltGr: '' + }, + KeyR: { + vkey: 'VK_R', + value: 'r', + withShift: 'R', + withAltGr: '', + withShiftAltGr: '' + }, + KeyS: { + vkey: 'VK_S', + value: 's', + withShift: 'S', + withAltGr: '', + withShiftAltGr: '' + }, + KeyT: { + vkey: 'VK_T', + value: 't', + withShift: 'T', + withAltGr: '', + withShiftAltGr: '' + }, + KeyU: { + vkey: 'VK_U', + value: 'u', + withShift: 'U', + withAltGr: '', + withShiftAltGr: '' + }, + KeyV: { + vkey: 'VK_V', + value: 'v', + withShift: 'V', + withAltGr: '', + withShiftAltGr: '' + }, + KeyW: { + vkey: 'VK_W', + value: 'w', + withShift: 'W', + withAltGr: '', + withShiftAltGr: '' + }, + KeyX: { + vkey: 'VK_X', + value: 'x', + withShift: 'X', + withAltGr: '', + withShiftAltGr: '' + }, + KeyY: { + vkey: 'VK_Z', + value: 'z', + withShift: 'Z', + withAltGr: '', + withShiftAltGr: '' + }, + KeyZ: { + vkey: 'VK_Y', + value: 'y', + withShift: 'Y', + withAltGr: '', + withShiftAltGr: '' + }, + Digit1: { + vkey: 'VK_1', + value: '1', + withShift: '+', + withAltGr: '¦', + withShiftAltGr: '' + }, + Digit2: { + vkey: 'VK_2', + value: '2', + withShift: '"', + withAltGr: '@', + withShiftAltGr: '' + }, + Digit3: { + vkey: 'VK_3', + value: '3', + withShift: '*', + withAltGr: '#', + withShiftAltGr: '' + }, + Digit4: { + vkey: 'VK_4', + value: '4', + withShift: 'ç', + withAltGr: '°', + withShiftAltGr: '' + }, + Digit5: { + vkey: 'VK_5', + value: '5', + withShift: '%', + withAltGr: '§', + withShiftAltGr: '' + }, + Digit6: { + vkey: 'VK_6', + value: '6', + withShift: '&', + withAltGr: '¬', + withShiftAltGr: '' + }, + Digit7: { + vkey: 'VK_7', + value: '7', + withShift: '/', + withAltGr: '|', + withShiftAltGr: '' + }, + Digit8: { + vkey: 'VK_8', + value: '8', + withShift: '(', + withAltGr: '¢', + withShiftAltGr: '' + }, + Digit9: { + vkey: 'VK_9', + value: '9', + withShift: ')', + withAltGr: '', + withShiftAltGr: '' + }, + Digit0: { + vkey: 'VK_0', + value: '0', + withShift: '=', + withAltGr: '', + withShiftAltGr: '' + }, + Enter: { + vkey: 'VK_RETURN', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + Escape: { + vkey: 'VK_ESCAPE', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + Backspace: { + vkey: 'VK_BACK', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + Tab: { + vkey: 'VK_TAB', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + Space: { + vkey: 'VK_SPACE', + value: ' ', + withShift: ' ', + withAltGr: '', + withShiftAltGr: '' + }, + Minus: { + vkey: 'VK_OEM_4', + value: '\'', + withShift: '?', + withAltGr: '', + withShiftAltGr: '' + }, + Equal: { + vkey: 'VK_OEM_6', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + BracketLeft: { + vkey: 'VK_OEM_1', + value: 'ü', + withShift: 'è', + withAltGr: '[', + withShiftAltGr: '' + }, + BracketRight: { + vkey: 'VK_OEM_3', + value: '', + withShift: '!', + withAltGr: ']', + withShiftAltGr: '' + }, + Backslash: { + vkey: 'VK_OEM_8', + value: '$', + withShift: '£', + withAltGr: '}', + withShiftAltGr: '' + }, + Semicolon: { + vkey: 'VK_OEM_7', + value: 'ö', + withShift: 'é', + withAltGr: '', + withShiftAltGr: '' + }, + Quote: { + vkey: 'VK_OEM_5', + value: 'ä', + withShift: 'à', + withAltGr: '{', + withShiftAltGr: '' + }, + Backquote: { + vkey: 'VK_OEM_2', + value: '§', + withShift: '°', + withAltGr: '', + withShiftAltGr: '' + }, + Comma: { + vkey: 'VK_OEM_COMMA', + value: ',', + withShift: ';', + withAltGr: '', + withShiftAltGr: '' + }, + Period: { + vkey: 'VK_OEM_PERIOD', + value: '.', + withShift: ':', + withAltGr: '', + withShiftAltGr: '' + }, + Slash: { + vkey: 'VK_OEM_MINUS', + value: '-', + withShift: '_', + withAltGr: '', + withShiftAltGr: '' + }, + CapsLock: { + vkey: 'VK_CAPITAL', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + F1: { + vkey: 'VK_F1', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + F2: { + vkey: 'VK_F2', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + F3: { + vkey: 'VK_F3', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + F4: { + vkey: 'VK_F4', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + F5: { + vkey: 'VK_F5', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + F6: { + vkey: 'VK_F6', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + F7: { + vkey: 'VK_F7', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + F8: { + vkey: 'VK_F8', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + F9: { + vkey: 'VK_F9', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + F10: { + vkey: 'VK_F10', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + F11: { + vkey: 'VK_F11', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + F12: { + vkey: 'VK_F12', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + PrintScreen: { + vkey: 'VK_SNAPSHOT', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + ScrollLock: { + vkey: 'VK_SCROLL', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + Pause: { + vkey: 'VK_NUMLOCK', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + Insert: { + vkey: 'VK_INSERT', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + Home: { + vkey: 'VK_HOME', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + PageUp: { + vkey: 'VK_PRIOR', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + Delete: { + vkey: 'VK_DELETE', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + End: { + vkey: 'VK_END', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + PageDown: { + vkey: 'VK_NEXT', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + ArrowRight: { + vkey: 'VK_RIGHT', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + ArrowLeft: { + vkey: 'VK_LEFT', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + ArrowDown: { + vkey: 'VK_DOWN', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + ArrowUp: { + vkey: 'VK_UP', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + NumLock: { + vkey: 'VK_UNKNOWN', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + NumpadDivide: { + vkey: 'VK_DIVIDE', + value: '/', + withShift: '/', + withAltGr: '', + withShiftAltGr: '' + }, + NumpadMultiply: { + vkey: 'VK_MULTIPLY', + value: '*', + withShift: '*', + withAltGr: '', + withShiftAltGr: '' + }, + NumpadSubtract: { + vkey: 'VK_SUBTRACT', + value: '-', + withShift: '-', + withAltGr: '', + withShiftAltGr: '' + }, + NumpadAdd: { + vkey: 'VK_ADD', + value: '+', + withShift: '+', + withAltGr: '', + withShiftAltGr: '' + }, + NumpadEnter: { + vkey: 'VK_RETURN', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + Numpad1: { + vkey: 'VK_END', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + Numpad2: { + vkey: 'VK_DOWN', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + Numpad3: { + vkey: 'VK_NEXT', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + Numpad4: { + vkey: 'VK_LEFT', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + Numpad5: { + vkey: 'VK_CLEAR', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + Numpad6: { + vkey: 'VK_RIGHT', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + Numpad7: { + vkey: 'VK_HOME', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + Numpad8: { + vkey: 'VK_UP', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + Numpad9: { + vkey: 'VK_PRIOR', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + Numpad0: { + vkey: 'VK_INSERT', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + NumpadDecimal: { + vkey: 'VK_DELETE', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + IntlBackslash: { + vkey: 'VK_OEM_102', + value: '<', + withShift: '>', + withAltGr: '\\', + withShiftAltGr: '' + }, + ContextMenu: { + vkey: 'VK_APPS', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + Power: { + vkey: 'VK_UNKNOWN', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + NumpadEqual: { + vkey: 'VK_CLEAR', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + F13: { + vkey: 'VK_F13', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + F14: { + vkey: 'VK_F14', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + F15: { + vkey: 'VK_F15', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + F16: { + vkey: 'VK_F16', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + F17: { + vkey: 'VK_F17', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + F18: { + vkey: 'VK_F18', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + F19: { + vkey: 'VK_F19', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + F20: { + vkey: 'VK_F20', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + F21: { + vkey: 'VK_F21', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + F22: { + vkey: 'VK_F22', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + F23: { + vkey: 'VK_F23', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + F24: { + vkey: 'VK_F24', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + Help: { + vkey: 'VK_UNKNOWN', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + Undo: { + vkey: 'VK_UNKNOWN', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + Cut: { + vkey: 'VK_UNKNOWN', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + Copy: { + vkey: 'VK_UNKNOWN', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + Paste: { + vkey: 'VK_UNKNOWN', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + AudioVolumeMute: { + vkey: 'VK_VOLUME_MUTE', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + AudioVolumeUp: { + vkey: 'VK_VOLUME_UP', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + AudioVolumeDown: { + vkey: 'VK_VOLUME_DOWN', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + NumpadComma: { + vkey: 'VK_UNKNOWN', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + IntlRo: { + vkey: 'VK_UNKNOWN', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + KanaMode: { + vkey: 'VK_UNKNOWN', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + IntlYen: { + vkey: 'VK_UNKNOWN', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + Convert: { + vkey: 'VK_UNKNOWN', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + NonConvert: { + vkey: 'VK_UNKNOWN', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + Lang1: { + vkey: 'VK_UNKNOWN', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + Lang2: { + vkey: 'VK_UNKNOWN', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + Lang3: { + vkey: 'VK_UNKNOWN', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + Lang4: { + vkey: 'VK_UNKNOWN', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + ControlLeft: { + vkey: 'VK_CONTROL', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + ShiftLeft: { + vkey: 'VK_SHIFT', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + AltLeft: { + vkey: 'VK_MENU', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + MetaLeft: { + vkey: 'VK_LWIN', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + ControlRight: { + vkey: 'VK_CONTROL', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + ShiftRight: { + vkey: 'VK_SHIFT', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + AltRight: { + vkey: 'VK_MENU', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + MetaRight: { + vkey: 'VK_RWIN', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + MediaTrackNext: { + vkey: 'VK_MEDIA_NEXT_TRACK', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + MediaTrackPrevious: { + vkey: 'VK_MEDIA_PREV_TRACK', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + MediaStop: { + vkey: 'VK_MEDIA_STOP', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + Eject: { + vkey: 'VK_UNKNOWN', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + MediaPlayPause: { + vkey: 'VK_MEDIA_PLAY_PAUSE', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + MediaSelect: { + vkey: 'VK_LAUNCH_MEDIA_SELECT', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + LaunchMail: { + vkey: 'VK_LAUNCH_MAIL', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + LaunchApp2: { + vkey: 'VK_LAUNCH_APP2', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + LaunchApp1: { + vkey: 'VK_LAUNCH_APP1', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + BrowserSearch: { + vkey: 'VK_BROWSER_SEARCH', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + BrowserHome: { + vkey: 'VK_BROWSER_HOME', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + BrowserBack: { + vkey: 'VK_BROWSER_BACK', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + BrowserForward: { + vkey: 'VK_BROWSER_FORWARD', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + BrowserStop: { + vkey: 'VK_BROWSER_STOP', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + BrowserRefresh: { + vkey: 'VK_BROWSER_REFRESH', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + BrowserFavorites: { + vkey: 'VK_BROWSER_FAVORITES', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + } +}); diff --git a/src/vs/workbench/services/keybinding/test/win_de_ch.txt b/src/vs/workbench/services/keybinding/test/win_de_ch.txt new file mode 100644 index 00000000000..65ea3543959 --- /dev/null +++ b/src/vs/workbench/services/keybinding/test/win_de_ch.txt @@ -0,0 +1,227 @@ +-------------------------------------------------------------------------------------------------- +| HW Code combination | Key | KeyCode combination | UI label | +-------------------------------------------------------------------------------------------------- +| KeyA | a | A | A | +| Shift+KeyA | A | Shift+A | Shift+A | +| Ctrl+Alt+KeyA | --- | Ctrl+Alt+A | Ctrl+Alt+A | +| Ctrl+Shift+Alt+KeyA | --- | Ctrl+Shift+Alt+A | Ctrl+Shift+Alt+A | +| KeyB | b | B | B | +| Shift+KeyB | B | Shift+B | Shift+B | +| Ctrl+Alt+KeyB | --- | Ctrl+Alt+B | Ctrl+Alt+B | +| Ctrl+Shift+Alt+KeyB | --- | Ctrl+Shift+Alt+B | Ctrl+Shift+Alt+B | +| KeyC | c | C | C | +| Shift+KeyC | C | Shift+C | Shift+C | +| Ctrl+Alt+KeyC | --- | Ctrl+Alt+C | Ctrl+Alt+C | +| Ctrl+Shift+Alt+KeyC | --- | Ctrl+Shift+Alt+C | Ctrl+Shift+Alt+C | +| KeyD | d | D | D | +| Shift+KeyD | D | Shift+D | Shift+D | +| Ctrl+Alt+KeyD | --- | Ctrl+Alt+D | Ctrl+Alt+D | +| Ctrl+Shift+Alt+KeyD | --- | Ctrl+Shift+Alt+D | Ctrl+Shift+Alt+D | +| KeyE | e | E | E | +| Shift+KeyE | E | Shift+E | Shift+E | +| Ctrl+Alt+KeyE | € | Ctrl+Alt+E | Ctrl+Alt+E | +| Ctrl+Shift+Alt+KeyE | --- | Ctrl+Shift+Alt+E | Ctrl+Shift+Alt+E | +-------------------------------------------------------------------------------------------------- +| HW Code combination | Key | KeyCode combination | UI label | +-------------------------------------------------------------------------------------------------- +| KeyF | f | F | F | +| Shift+KeyF | F | Shift+F | Shift+F | +| Ctrl+Alt+KeyF | --- | Ctrl+Alt+F | Ctrl+Alt+F | +| Ctrl+Shift+Alt+KeyF | --- | Ctrl+Shift+Alt+F | Ctrl+Shift+Alt+F | +| KeyG | g | G | G | +| Shift+KeyG | G | Shift+G | Shift+G | +| Ctrl+Alt+KeyG | --- | Ctrl+Alt+G | Ctrl+Alt+G | +| Ctrl+Shift+Alt+KeyG | --- | Ctrl+Shift+Alt+G | Ctrl+Shift+Alt+G | +| KeyH | h | H | H | +| Shift+KeyH | H | Shift+H | Shift+H | +| Ctrl+Alt+KeyH | --- | Ctrl+Alt+H | Ctrl+Alt+H | +| Ctrl+Shift+Alt+KeyH | --- | Ctrl+Shift+Alt+H | Ctrl+Shift+Alt+H | +| KeyI | i | I | I | +| Shift+KeyI | I | Shift+I | Shift+I | +| Ctrl+Alt+KeyI | --- | Ctrl+Alt+I | Ctrl+Alt+I | +| Ctrl+Shift+Alt+KeyI | --- | Ctrl+Shift+Alt+I | Ctrl+Shift+Alt+I | +| KeyJ | j | J | J | +| Shift+KeyJ | J | Shift+J | Shift+J | +| Ctrl+Alt+KeyJ | --- | Ctrl+Alt+J | Ctrl+Alt+J | +| Ctrl+Shift+Alt+KeyJ | --- | Ctrl+Shift+Alt+J | Ctrl+Shift+Alt+J | +-------------------------------------------------------------------------------------------------- +| HW Code combination | Key | KeyCode combination | UI label | +-------------------------------------------------------------------------------------------------- +| KeyK | k | K | K | +| Shift+KeyK | K | Shift+K | Shift+K | +| Ctrl+Alt+KeyK | --- | Ctrl+Alt+K | Ctrl+Alt+K | +| Ctrl+Shift+Alt+KeyK | --- | Ctrl+Shift+Alt+K | Ctrl+Shift+Alt+K | +| KeyL | l | L | L | +| Shift+KeyL | L | Shift+L | Shift+L | +| Ctrl+Alt+KeyL | --- | Ctrl+Alt+L | Ctrl+Alt+L | +| Ctrl+Shift+Alt+KeyL | --- | Ctrl+Shift+Alt+L | Ctrl+Shift+Alt+L | +| KeyM | m | M | M | +| Shift+KeyM | M | Shift+M | Shift+M | +| Ctrl+Alt+KeyM | --- | Ctrl+Alt+M | Ctrl+Alt+M | +| Ctrl+Shift+Alt+KeyM | --- | Ctrl+Shift+Alt+M | Ctrl+Shift+Alt+M | +| KeyN | n | N | N | +| Shift+KeyN | N | Shift+N | Shift+N | +| Ctrl+Alt+KeyN | --- | Ctrl+Alt+N | Ctrl+Alt+N | +| Ctrl+Shift+Alt+KeyN | --- | Ctrl+Shift+Alt+N | Ctrl+Shift+Alt+N | +| KeyO | o | O | O | +| Shift+KeyO | O | Shift+O | Shift+O | +| Ctrl+Alt+KeyO | --- | Ctrl+Alt+O | Ctrl+Alt+O | +| Ctrl+Shift+Alt+KeyO | --- | Ctrl+Shift+Alt+O | Ctrl+Shift+Alt+O | +-------------------------------------------------------------------------------------------------- +| HW Code combination | Key | KeyCode combination | UI label | +-------------------------------------------------------------------------------------------------- +| KeyP | p | P | P | +| Shift+KeyP | P | Shift+P | Shift+P | +| Ctrl+Alt+KeyP | --- | Ctrl+Alt+P | Ctrl+Alt+P | +| Ctrl+Shift+Alt+KeyP | --- | Ctrl+Shift+Alt+P | Ctrl+Shift+Alt+P | +| KeyQ | q | Q | Q | +| Shift+KeyQ | Q | Shift+Q | Shift+Q | +| Ctrl+Alt+KeyQ | --- | Ctrl+Alt+Q | Ctrl+Alt+Q | +| Ctrl+Shift+Alt+KeyQ | --- | Ctrl+Shift+Alt+Q | Ctrl+Shift+Alt+Q | +| KeyR | r | R | R | +| Shift+KeyR | R | Shift+R | Shift+R | +| Ctrl+Alt+KeyR | --- | Ctrl+Alt+R | Ctrl+Alt+R | +| Ctrl+Shift+Alt+KeyR | --- | Ctrl+Shift+Alt+R | Ctrl+Shift+Alt+R | +| KeyS | s | S | S | +| Shift+KeyS | S | Shift+S | Shift+S | +| Ctrl+Alt+KeyS | --- | Ctrl+Alt+S | Ctrl+Alt+S | +| Ctrl+Shift+Alt+KeyS | --- | Ctrl+Shift+Alt+S | Ctrl+Shift+Alt+S | +| KeyT | t | T | T | +| Shift+KeyT | T | Shift+T | Shift+T | +| Ctrl+Alt+KeyT | --- | Ctrl+Alt+T | Ctrl+Alt+T | +| Ctrl+Shift+Alt+KeyT | --- | Ctrl+Shift+Alt+T | Ctrl+Shift+Alt+T | +-------------------------------------------------------------------------------------------------- +| HW Code combination | Key | KeyCode combination | UI label | +-------------------------------------------------------------------------------------------------- +| KeyU | u | U | U | +| Shift+KeyU | U | Shift+U | Shift+U | +| Ctrl+Alt+KeyU | --- | Ctrl+Alt+U | Ctrl+Alt+U | +| Ctrl+Shift+Alt+KeyU | --- | Ctrl+Shift+Alt+U | Ctrl+Shift+Alt+U | +| KeyV | v | V | V | +| Shift+KeyV | V | Shift+V | Shift+V | +| Ctrl+Alt+KeyV | --- | Ctrl+Alt+V | Ctrl+Alt+V | +| Ctrl+Shift+Alt+KeyV | --- | Ctrl+Shift+Alt+V | Ctrl+Shift+Alt+V | +| KeyW | w | W | W | +| Shift+KeyW | W | Shift+W | Shift+W | +| Ctrl+Alt+KeyW | --- | Ctrl+Alt+W | Ctrl+Alt+W | +| Ctrl+Shift+Alt+KeyW | --- | Ctrl+Shift+Alt+W | Ctrl+Shift+Alt+W | +| KeyX | x | X | X | +| Shift+KeyX | X | Shift+X | Shift+X | +| Ctrl+Alt+KeyX | --- | Ctrl+Alt+X | Ctrl+Alt+X | +| Ctrl+Shift+Alt+KeyX | --- | Ctrl+Shift+Alt+X | Ctrl+Shift+Alt+X | +| KeyY | z | Z | Z | +| Shift+KeyY | Z | Shift+Z | Shift+Z | +| Ctrl+Alt+KeyY | --- | Ctrl+Alt+Z | Ctrl+Alt+Z | +| Ctrl+Shift+Alt+KeyY | --- | Ctrl+Shift+Alt+Z | Ctrl+Shift+Alt+Z | +-------------------------------------------------------------------------------------------------- +| HW Code combination | Key | KeyCode combination | UI label | +-------------------------------------------------------------------------------------------------- +| KeyZ | y | Y | Y | +| Shift+KeyZ | Y | Shift+Y | Shift+Y | +| Ctrl+Alt+KeyZ | --- | Ctrl+Alt+Y | Ctrl+Alt+Y | +| Ctrl+Shift+Alt+KeyZ | --- | Ctrl+Shift+Alt+Y | Ctrl+Shift+Alt+Y | +| Digit1 | 1 | 1 | 1 | +| Shift+Digit1 | + | Shift+1 | Shift+1 | +| Ctrl+Alt+Digit1 | ¦ | Ctrl+Alt+1 | Ctrl+Alt+1 | +| Ctrl+Shift+Alt+Digit1 | --- | Ctrl+Shift+Alt+1 | Ctrl+Shift+Alt+1 | +| Digit2 | 2 | 2 | 2 | +| Shift+Digit2 | " | Shift+2 | Shift+2 | +| Ctrl+Alt+Digit2 | @ | Ctrl+Alt+2 | Ctrl+Alt+2 | +| Ctrl+Shift+Alt+Digit2 | --- | Ctrl+Shift+Alt+2 | Ctrl+Shift+Alt+2 | +| Digit3 | 3 | 3 | 3 | +| Shift+Digit3 | * | Shift+3 | Shift+3 | +| Ctrl+Alt+Digit3 | # | Ctrl+Alt+3 | Ctrl+Alt+3 | +| Ctrl+Shift+Alt+Digit3 | --- | Ctrl+Shift+Alt+3 | Ctrl+Shift+Alt+3 | +| Digit4 | 4 | 4 | 4 | +| Shift+Digit4 | ç | Shift+4 | Shift+4 | +| Ctrl+Alt+Digit4 | ° | Ctrl+Alt+4 | Ctrl+Alt+4 | +| Ctrl+Shift+Alt+Digit4 | --- | Ctrl+Shift+Alt+4 | Ctrl+Shift+Alt+4 | +-------------------------------------------------------------------------------------------------- +| HW Code combination | Key | KeyCode combination | UI label | +-------------------------------------------------------------------------------------------------- +| Digit5 | 5 | 5 | 5 | +| Shift+Digit5 | % | Shift+5 | Shift+5 | +| Ctrl+Alt+Digit5 | § | Ctrl+Alt+5 | Ctrl+Alt+5 | +| Ctrl+Shift+Alt+Digit5 | --- | Ctrl+Shift+Alt+5 | Ctrl+Shift+Alt+5 | +| Digit6 | 6 | 6 | 6 | +| Shift+Digit6 | & | Shift+6 | Shift+6 | +| Ctrl+Alt+Digit6 | ¬ | Ctrl+Alt+6 | Ctrl+Alt+6 | +| Ctrl+Shift+Alt+Digit6 | --- | Ctrl+Shift+Alt+6 | Ctrl+Shift+Alt+6 | +| Digit7 | 7 | 7 | 7 | +| Shift+Digit7 | / | Shift+7 | Shift+7 | +| Ctrl+Alt+Digit7 | | | Ctrl+Alt+7 | Ctrl+Alt+7 | +| Ctrl+Shift+Alt+Digit7 | --- | Ctrl+Shift+Alt+7 | Ctrl+Shift+Alt+7 | +| Digit8 | 8 | 8 | 8 | +| Shift+Digit8 | ( | Shift+8 | Shift+8 | +| Ctrl+Alt+Digit8 | ¢ | Ctrl+Alt+8 | Ctrl+Alt+8 | +| Ctrl+Shift+Alt+Digit8 | --- | Ctrl+Shift+Alt+8 | Ctrl+Shift+Alt+8 | +| Digit9 | 9 | 9 | 9 | +| Shift+Digit9 | ) | Shift+9 | Shift+9 | +| Ctrl+Alt+Digit9 | --- | Ctrl+Alt+9 | Ctrl+Alt+9 | +| Ctrl+Shift+Alt+Digit9 | --- | Ctrl+Shift+Alt+9 | Ctrl+Shift+Alt+9 | +-------------------------------------------------------------------------------------------------- +| HW Code combination | Key | KeyCode combination | UI label | +-------------------------------------------------------------------------------------------------- +| Digit0 | 0 | 0 | 0 | +| Shift+Digit0 | = | Shift+0 | Shift+0 | +| Ctrl+Alt+Digit0 | --- | Ctrl+Alt+0 | Ctrl+Alt+0 | +| Ctrl+Shift+Alt+Digit0 | --- | Ctrl+Shift+Alt+0 | Ctrl+Shift+Alt+0 | +| Minus | ' | [ | ' | +| Shift+Minus | ? | Shift+[ | Shift+' | +| Ctrl+Alt+Minus | --- | Ctrl+Alt+[ | Ctrl+Alt+' | +| Ctrl+Shift+Alt+Minus | --- | Ctrl+Shift+Alt+[ | Ctrl+Shift+Alt+' | +| Equal | --- | ] | null | +| Shift+Equal | --- | Shift+] | Shift+null | +| Ctrl+Alt+Equal | --- | Ctrl+Alt+] | Ctrl+Alt+null | +| Ctrl+Shift+Alt+Equal | --- | Ctrl+Shift+Alt+] | Ctrl+Shift+Alt+null | +| BracketLeft | ü | ; | ü | +| Shift+BracketLeft | è | Shift+; | Shift+ü | +| Ctrl+Alt+BracketLeft | [ | Ctrl+Alt+; | Ctrl+Alt+ü | +| Ctrl+Shift+Alt+BracketLeft | --- | Ctrl+Shift+Alt+; | Ctrl+Shift+Alt+ü | +| BracketRight | --- | ` | null | +| Shift+BracketRight | ! | Shift+` | Shift+null | +| Ctrl+Alt+BracketRight | ] | Ctrl+Alt+` | Ctrl+Alt+null | +| Ctrl+Shift+Alt+BracketRight | --- | Ctrl+Shift+Alt+` | Ctrl+Shift+Alt+null | +-------------------------------------------------------------------------------------------------- +| HW Code combination | Key | KeyCode combination | UI label | +-------------------------------------------------------------------------------------------------- +| Backslash | $ | OEM_8 | $ | +| Shift+Backslash | £ | Shift+OEM_8 | Shift+$ | +| Ctrl+Alt+Backslash | } | Ctrl+Alt+OEM_8 | Ctrl+Alt+$ | +| Ctrl+Shift+Alt+Backslash | --- | Ctrl+Shift+Alt+OEM_8 | Ctrl+Shift+Alt+$ | +| IntlHash | --- | undefined | undefined | +| Shift+IntlHash | --- | Shift+undefined | Shift+undefined | +| Ctrl+Alt+IntlHash | --- | Ctrl+Alt+undefined | Ctrl+Alt+undefined | +| Ctrl+Shift+Alt+IntlHash | --- | Ctrl+Shift+Alt+undefined | Ctrl+Shift+Alt+undefined | +| Semicolon | ö | ' | ö | +| Shift+Semicolon | é | Shift+' | Shift+ö | +| Ctrl+Alt+Semicolon | --- | Ctrl+Alt+' | Ctrl+Alt+ö | +| Ctrl+Shift+Alt+Semicolon | --- | Ctrl+Shift+Alt+' | Ctrl+Shift+Alt+ö | +| Quote | ä | \ | ä | +| Shift+Quote | à | Shift+\ | Shift+ä | +| Ctrl+Alt+Quote | { | Ctrl+Alt+\ | Ctrl+Alt+ä | +| Ctrl+Shift+Alt+Quote | --- | Ctrl+Shift+Alt+\ | Ctrl+Shift+Alt+ä | +| Backquote | § | / | § | +| Shift+Backquote | ° | Shift+/ | Shift+§ | +| Ctrl+Alt+Backquote | --- | Ctrl+Alt+/ | Ctrl+Alt+§ | +| Ctrl+Shift+Alt+Backquote | --- | Ctrl+Shift+Alt+/ | Ctrl+Shift+Alt+§ | +-------------------------------------------------------------------------------------------------- +| HW Code combination | Key | KeyCode combination | UI label | +-------------------------------------------------------------------------------------------------- +| Comma | , | , | , | +| Shift+Comma | ; | Shift+, | Shift+, | +| Ctrl+Alt+Comma | --- | Ctrl+Alt+, | Ctrl+Alt+, | +| Ctrl+Shift+Alt+Comma | --- | Ctrl+Shift+Alt+, | Ctrl+Shift+Alt+, | +| Period | . | . | . | +| Shift+Period | : | Shift+. | Shift+. | +| Ctrl+Alt+Period | --- | Ctrl+Alt+. | Ctrl+Alt+. | +| Ctrl+Shift+Alt+Period | --- | Ctrl+Shift+Alt+. | Ctrl+Shift+Alt+. | +| Slash | - | - | - | +| Shift+Slash | _ | Shift+- | Shift+- | +| Ctrl+Alt+Slash | --- | Ctrl+Alt+- | Ctrl+Alt+- | +| Ctrl+Shift+Alt+Slash | --- | Ctrl+Shift+Alt+- | Ctrl+Shift+Alt+- | +| IntlBackslash | < | OEM_102 | < | +| Shift+IntlBackslash | > | Shift+OEM_102 | Shift+< | +| Ctrl+Alt+IntlBackslash | \ | Ctrl+Alt+OEM_102 | Ctrl+Alt+< | +| Ctrl+Shift+Alt+IntlBackslash | --- | Ctrl+Shift+Alt+OEM_102 | Ctrl+Shift+Alt+< | +-------------------------------------------------------------------------------------------------- \ No newline at end of file diff --git a/src/vs/workbench/services/keybinding/test/windowsKeyboardMapper.test.ts b/src/vs/workbench/services/keybinding/test/windowsKeyboardMapper.test.ts new file mode 100644 index 00000000000..ec124b2fb08 --- /dev/null +++ b/src/vs/workbench/services/keybinding/test/windowsKeyboardMapper.test.ts @@ -0,0 +1,92 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +'use strict'; + +import * as assert from 'assert'; +import { OperatingSystem } from 'vs/base/common/platform'; +import { readFile, writeFile } from 'vs/base/node/pfs'; +import { TPromise } from 'vs/base/common/winjs.base'; +import { WindowsKeyboardMapper, IKeyboardMapping } from 'vs/workbench/services/keybinding/common/windowsKeyboardMapper'; + +function createKeyboardMapper(file: string, OS: OperatingSystem): TPromise { + return readFile(require.toUrl(`vs/workbench/services/keybinding/test/${file}.js`)).then((buff) => { + let contents = buff.toString(); + let func = new Function('define', contents); + let rawMappings: IKeyboardMapping = null; + func(function (value) { + rawMappings = value; + }); + return new WindowsKeyboardMapper(rawMappings); + }); +} + +function assertMapping(mapper: WindowsKeyboardMapper, file: string, done: (err?: any) => void): void { + const filePath = require.toUrl(`vs/workbench/services/keybinding/test/${file}`); + + readFile(filePath).then((buff) => { + let expected = buff.toString(); + const actual = mapper.dumpDebugInfo(); + if (actual !== expected) { + writeFile(filePath, actual); + } + assert.deepEqual(actual, expected); + done(); + }, done); +} + +suite('keyboardMapper - WINDOWS de_ch', () => { + + let mapper: WindowsKeyboardMapper; + + suiteSetup((done) => { + createKeyboardMapper('win_de_ch', OperatingSystem.Macintosh).then((_mapper) => { + mapper = _mapper; + done(); + }, done); + }); + + test('mapping', (done) => { + assertMapping(mapper, 'win_de_ch.txt', done); + }); + + // test('resolveKeybinding', () => { + // function _assertAllLabels(keybinding: Keybinding, labels: string[], ariaLabels: string[], htmlLabel: IHTMLContentElement[][]): void { + // const kb = mapper.resolveKeybinding(keybinding); + + // let actualLabels = kb.map(k => k.getLabel()); + // assert.deepEqual(actualLabels, labels); + + // let actualAriaLabels = kb.map(k => k.getAriaLabel()); + // assert.deepEqual(actualAriaLabels, ariaLabels); + + // let actualHTMLLabels = kb.map(k => k.getHTMLLabel()); + // assert.deepEqual(actualHTMLLabels, htmlLabel); + // } + + // function assertAllLabels(keybinding: Keybinding, label: string | string[], ariaLabel: string | string[], htmlLabel: IHTMLContentElement[][]): void { + // let _labels = (typeof label === 'string' ? [label] : label); + // let _ariaLabels = (typeof ariaLabel === 'string' ? [ariaLabel] : ariaLabel); + // _assertAllLabels(keybinding, _labels, _ariaLabels, htmlLabel); + // } + + + // // TODO: ElectronAccelerator, UserSettings + // assertAllLabels( + // createKeybinding(KeyMod.CtrlCmd | KeyCode.KEY_Z), + // '⌘Z', + // 'Command+Z', + // [[{ + // tagName: 'span', + // className: 'monaco-kb', + // children: [ + // { tagName: 'span', className: 'monaco-kbkey', text: '⌘' }, + // { tagName: 'span', className: 'monaco-kbkey', text: 'Z' }, + // ] + // }]] + // ); + // }); + +}); -- GitLab