From 5d6e7682c5d34ac292dff65810707dffa6d64f80 Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Wed, 6 Jan 2016 10:15:41 +0100 Subject: [PATCH] Extract code dealing with native-keymap in its own file --- .../electron-browser/nativeKeymap.ts | 416 +++++++++++++++++ .../pluginKeybindingService.ts | 419 +----------------- 2 files changed, 420 insertions(+), 415 deletions(-) create mode 100644 src/vs/workbench/services/keybinding/electron-browser/nativeKeymap.ts diff --git a/src/vs/workbench/services/keybinding/electron-browser/nativeKeymap.ts b/src/vs/workbench/services/keybinding/electron-browser/nativeKeymap.ts new file mode 100644 index 00000000000..2aa72ecf66d --- /dev/null +++ b/src/vs/workbench/services/keybinding/electron-browser/nativeKeymap.ts @@ -0,0 +1,416 @@ +/*--------------------------------------------------------------------------------------------- + * 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 nativeKeymap from 'native-keymap'; +import {KeyCode, Keybinding, IKeyBindingLabelProvider, MacUIKeyLabelProvider, ClassicUIKeyLabelProvider} from 'vs/base/common/keyCodes'; +import {lookupKeyCode, setExtractKeyCode} from 'vs/base/browser/keyboardEvent'; +import Platform = require('vs/base/common/platform'); + +let getNativeKeymap = (function() { + let called = false; + let result: nativeKeymap.INativeKeyMap[]; + + return function getNativeKeymap() { + if (!called) { + called = true; + result = nativeKeymap.getKeyMap(); + } + return result; + }; +})(); + +// See https://msdn.microsoft.com/en-us/library/windows/desktop/dd375731(v=vs.85).aspx +// See https://github.com/alexandrudima/vscode-keyboard/blob/master/deps/chromium/keyboard_codes_win.h +const NATIVE_KEY_CODE_TO_KEY_CODE: {[nativeKeyCode:string]:KeyCode;} = { + VKEY_BACK: KeyCode.Backspace, + VKEY_TAB: KeyCode.Tab, + VKEY_CLEAR: KeyCode.Unknown, // MISSING + VKEY_RETURN: KeyCode.Enter, + VKEY_SHIFT: KeyCode.Shift, + VKEY_CONTROL: KeyCode.Ctrl, + VKEY_MENU: KeyCode.Alt, + VKEY_PAUSE: KeyCode.PauseBreak, + VKEY_CAPITAL: KeyCode.CapsLock, + VKEY_KANA: KeyCode.Unknown, // MISSING + VKEY_HANGUL: KeyCode.Unknown, // MISSING + VKEY_JUNJA: KeyCode.Unknown, // MISSING + VKEY_FINAL: KeyCode.Unknown, // MISSING + VKEY_HANJA: KeyCode.Unknown, // MISSING + VKEY_KANJI: KeyCode.Unknown, // MISSING + VKEY_ESCAPE: KeyCode.Escape, + VKEY_CONVERT: KeyCode.Unknown, // MISSING + VKEY_NONCONVERT: KeyCode.Unknown, // MISSING + VKEY_ACCEPT: KeyCode.Unknown, // MISSING + VKEY_MODECHANGE: KeyCode.Unknown, // MISSING + VKEY_SPACE: KeyCode.Space, + VKEY_PRIOR: KeyCode.PageUp, + VKEY_NEXT: KeyCode.PageDown, + VKEY_END: KeyCode.End, + VKEY_HOME: KeyCode.Home, + VKEY_LEFT: KeyCode.LeftArrow, + VKEY_UP: KeyCode.UpArrow, + VKEY_RIGHT: KeyCode.RightArrow, + VKEY_DOWN: KeyCode.DownArrow, + VKEY_SELECT: KeyCode.Unknown, // MISSING + VKEY_PRINT: KeyCode.Unknown, // MISSING + VKEY_EXECUTE: KeyCode.Unknown, // MISSING + VKEY_SNAPSHOT: KeyCode.Unknown, // MISSING + VKEY_INSERT: KeyCode.Insert, + VKEY_DELETE: KeyCode.Delete, + VKEY_HELP: KeyCode.Unknown, // MISSING + VKEY_0: KeyCode.KEY_0, + VKEY_1: KeyCode.KEY_1, + VKEY_2: KeyCode.KEY_2, + VKEY_3: KeyCode.KEY_3, + VKEY_4: KeyCode.KEY_4, + VKEY_5: KeyCode.KEY_5, + VKEY_6: KeyCode.KEY_6, + VKEY_7: KeyCode.KEY_7, + VKEY_8: KeyCode.KEY_8, + VKEY_9: KeyCode.KEY_9, + VKEY_A: KeyCode.KEY_A, + VKEY_B: KeyCode.KEY_B, + VKEY_C: KeyCode.KEY_C, + VKEY_D: KeyCode.KEY_D, + VKEY_E: KeyCode.KEY_E, + VKEY_F: KeyCode.KEY_F, + VKEY_G: KeyCode.KEY_G, + VKEY_H: KeyCode.KEY_H, + VKEY_I: KeyCode.KEY_I, + VKEY_J: KeyCode.KEY_J, + VKEY_K: KeyCode.KEY_K, + VKEY_L: KeyCode.KEY_L, + VKEY_M: KeyCode.KEY_M, + VKEY_N: KeyCode.KEY_N, + VKEY_O: KeyCode.KEY_O, + VKEY_P: KeyCode.KEY_P, + VKEY_Q: KeyCode.KEY_Q, + VKEY_R: KeyCode.KEY_R, + VKEY_S: KeyCode.KEY_S, + VKEY_T: KeyCode.KEY_T, + VKEY_U: KeyCode.KEY_U, + VKEY_V: KeyCode.KEY_V, + VKEY_W: KeyCode.KEY_W, + VKEY_X: KeyCode.KEY_X, + VKEY_Y: KeyCode.KEY_Y, + VKEY_Z: KeyCode.KEY_Z, + VKEY_LWIN: KeyCode.Meta, + VKEY_COMMAND: KeyCode.Meta, + VKEY_RWIN: KeyCode.Meta, + VKEY_APPS: KeyCode.Unknown, // MISSING + VKEY_SLEEP: KeyCode.Unknown, // MISSING + VKEY_NUMPAD0: KeyCode.NUMPAD_0, + VKEY_NUMPAD1: KeyCode.NUMPAD_1, + VKEY_NUMPAD2: KeyCode.NUMPAD_2, + VKEY_NUMPAD3: KeyCode.NUMPAD_3, + VKEY_NUMPAD4: KeyCode.NUMPAD_4, + VKEY_NUMPAD5: KeyCode.NUMPAD_5, + VKEY_NUMPAD6: KeyCode.NUMPAD_6, + VKEY_NUMPAD7: KeyCode.NUMPAD_7, + VKEY_NUMPAD8: KeyCode.NUMPAD_8, + VKEY_NUMPAD9: KeyCode.NUMPAD_9, + VKEY_MULTIPLY: KeyCode.NUMPAD_MULTIPLY, + VKEY_ADD: KeyCode.NUMPAD_ADD, + VKEY_SEPARATOR: KeyCode.NUMPAD_SEPARATOR, + VKEY_SUBTRACT: KeyCode.NUMPAD_SUBTRACT, + VKEY_DECIMAL: KeyCode.NUMPAD_DECIMAL, + VKEY_DIVIDE: KeyCode.NUMPAD_DIVIDE, + VKEY_F1: KeyCode.F1, + VKEY_F2: KeyCode.F2, + VKEY_F3: KeyCode.F3, + VKEY_F4: KeyCode.F4, + VKEY_F5: KeyCode.F5, + VKEY_F6: KeyCode.F6, + VKEY_F7: KeyCode.F7, + VKEY_F8: KeyCode.F8, + VKEY_F9: KeyCode.F9, + VKEY_F10: KeyCode.F10, + VKEY_F11: KeyCode.F11, + VKEY_F12: KeyCode.F12, + VKEY_F13: KeyCode.F13, + VKEY_F14: KeyCode.F14, + VKEY_F15: KeyCode.F15, + VKEY_F16: KeyCode.F16, + VKEY_F17: KeyCode.F17, + VKEY_F18: KeyCode.F18, + VKEY_F19: KeyCode.F19, + VKEY_F20: KeyCode.Unknown, // MISSING + VKEY_F21: KeyCode.Unknown, // MISSING + VKEY_F22: KeyCode.Unknown, // MISSING + VKEY_F23: KeyCode.Unknown, // MISSING + VKEY_F24: KeyCode.Unknown, // MISSING + VKEY_NUMLOCK: KeyCode.NumLock, + VKEY_SCROLL: KeyCode.ScrollLock, + VKEY_LSHIFT: KeyCode.Shift, + VKEY_RSHIFT: KeyCode.Shift, + VKEY_LCONTROL: KeyCode.Ctrl, + VKEY_RCONTROL: KeyCode.Ctrl, + VKEY_LMENU: KeyCode.Unknown, // MISSING + VKEY_RMENU: KeyCode.Unknown, // MISSING + VKEY_BROWSER_BACK: KeyCode.Unknown, // MISSING + VKEY_BROWSER_FORWARD: KeyCode.Unknown, // MISSING + VKEY_BROWSER_REFRESH: KeyCode.Unknown, // MISSING + VKEY_BROWSER_STOP: KeyCode.Unknown, // MISSING + VKEY_BROWSER_SEARCH: KeyCode.Unknown, // MISSING + VKEY_BROWSER_FAVORITES: KeyCode.Unknown, // MISSING + VKEY_BROWSER_HOME: KeyCode.Unknown, // MISSING + VKEY_VOLUME_MUTE: KeyCode.Unknown, // MISSING + VKEY_VOLUME_DOWN: KeyCode.Unknown, // MISSING + VKEY_VOLUME_UP: KeyCode.Unknown, // MISSING + VKEY_MEDIA_NEXT_TRACK: KeyCode.Unknown, // MISSING + VKEY_MEDIA_PREV_TRACK: KeyCode.Unknown, // MISSING + VKEY_MEDIA_STOP: KeyCode.Unknown, // MISSING + VKEY_MEDIA_PLAY_PAUSE: KeyCode.Unknown, // MISSING + VKEY_MEDIA_LAUNCH_MAIL: KeyCode.Unknown, // MISSING + VKEY_MEDIA_LAUNCH_MEDIA_SELECT: KeyCode.Unknown, // MISSING + VKEY_MEDIA_LAUNCH_APP1: KeyCode.Unknown, // MISSING + VKEY_MEDIA_LAUNCH_APP2: KeyCode.Unknown, // MISSING + VKEY_OEM_1: KeyCode.US_SEMICOLON, + VKEY_OEM_PLUS: KeyCode.US_EQUAL, + VKEY_OEM_COMMA: KeyCode.US_COMMA, + VKEY_OEM_MINUS: KeyCode.US_MINUS, + VKEY_OEM_PERIOD: KeyCode.US_DOT, + VKEY_OEM_2: KeyCode.US_SLASH, + VKEY_OEM_3: KeyCode.US_BACKTICK, + VKEY_OEM_4: KeyCode.US_OPEN_SQUARE_BRACKET, + VKEY_OEM_5: KeyCode.US_BACKSLASH, + VKEY_OEM_6: KeyCode.US_CLOSE_SQUARE_BRACKET, + VKEY_OEM_7: KeyCode.US_QUOTE, + VKEY_OEM_8: KeyCode.Unknown, // MISSING + VKEY_OEM_102: KeyCode.Unknown, // MISSING + VKEY_PROCESSKEY: KeyCode.Unknown, // MISSING + VKEY_PACKET: KeyCode.Unknown, // MISSING + VKEY_DBE_SBCSCHAR: KeyCode.Unknown, // MISSING + VKEY_DBE_DBCSCHAR: KeyCode.Unknown, // MISSING + VKEY_ATTN: KeyCode.Unknown, // MISSING + VKEY_CRSEL: KeyCode.Unknown, // MISSING + VKEY_EXSEL: KeyCode.Unknown, // MISSING + VKEY_EREOF: KeyCode.Unknown, // MISSING + VKEY_PLAY: KeyCode.Unknown, // MISSING + VKEY_ZOOM: KeyCode.Unknown, // MISSING + VKEY_NONAME: KeyCode.Unknown, // MISSING + VKEY_PA1: KeyCode.Unknown, // MISSING + VKEY_OEM_CLEAR: KeyCode.Unknown, // MISSING + VKEY_UNKNOWN: KeyCode.Unknown, + + // Windows does not have a specific key code for AltGr. We use the unused + // VK_OEM_AX to represent AltGr, matching the behaviour of Firefox on Linux. + VKEY_ALTGR: KeyCode.Unknown, // MISSING +}; + +// See http://www.w3.org/TR/DOM-Level-3-Events/#h-optionally-fixed-virtual-key-codes +// See issue #1302: Chromium has implemented section B.2.4 of DOM Level 3 Events on mac +// This is bad news because we cannot trust the event's keyCode to be the actual pressed key. +// Here we try to find out the actual pressed key by "undoing" their massaging + +// Key Character Virtual Key Code +// Semicolon ';' 186 +// Colon ':' 186 +// Equals sign '=' 187 +// Plus '+' 187 +// Comma ',' 188 +// Less than sign '<' 188 +// Minus '-' 189 +// Underscore '_' 189 +// Period '.' 190 +// Greater than sign '>' 190 +// Forward slash '/' 191 +// Question mark '?' 191 +// Backtick '`' 192 +// Tilde '~' 192 +// Opening square bracket '[' 219 +// Opening curly brace '{' 219 +// Backslash '\' 220 +// Pipe '|' 220 +// Closing square bracket ']' 221 +// Closing curly brace '}' 221 +// Single quote ''' 222 +// Double quote '"' 222 + +interface IFixedVirtualKeyCodeElement { + char:string; + virtualKeyCode:number; +} + +let _b24_fixedVirtualKeyCodes: IFixedVirtualKeyCodeElement[] = [ + { char: ';', virtualKeyCode: 186 }, + { char: ':', virtualKeyCode: 186 }, + { char: '=', virtualKeyCode: 187 }, + { char: '+', virtualKeyCode: 187 }, + { char: ',', virtualKeyCode: 188 }, + { char: '<', virtualKeyCode: 188 }, + { char: '-', virtualKeyCode: 189 }, + { char: '_', virtualKeyCode: 189 }, + { char: '.', virtualKeyCode: 190 }, + { char: '>', virtualKeyCode: 190 }, + { char: '/', virtualKeyCode: 191 }, + { char: '?', virtualKeyCode: 191 }, + { char: '`', virtualKeyCode: 192 }, + { char: '~', virtualKeyCode: 192 }, + { char: '[', virtualKeyCode: 219 }, + { char: '{', virtualKeyCode: 219 }, + { char: '\\', virtualKeyCode: 220 }, + { char: '|', virtualKeyCode: 220 }, + { char: ']', virtualKeyCode: 221 }, + { char: '}', virtualKeyCode: 221 }, + { char: '\'', virtualKeyCode: 222 }, + { char: '"', virtualKeyCode: 222 }, +]; +let _b24_interestingChars: {[char:string]:boolean;} = Object.create(null); +_b24_fixedVirtualKeyCodes.forEach(el => _b24_interestingChars[el.char] = true); + +let _b24_interestingVirtualKeyCodes: {[virtualKeyCode:number]:boolean;} = Object.create(null); +_b24_fixedVirtualKeyCodes.forEach(el => _b24_interestingVirtualKeyCodes[el.virtualKeyCode] = true); + +interface IUnfixedVirtualKeyCodeMap { + [char:string]: KeyCode; +} +let _b24_getActualKeyCodeMap = (function() { + let result: IUnfixedVirtualKeyCodeMap = null; + return function() { + if (!result) { + result = Object.create(null); + + let nativeMappings = getNativeKeymap(); + + for (let i = 0, len = nativeMappings.length; i < len; i++) { + let nativeMapping = nativeMappings[i]; + + if (nativeMapping.value && _b24_interestingChars[nativeMapping.value]) { + // console.log(nativeMapping.value + " is made by " + nativeMapping.key_code); + let keyCode = NATIVE_KEY_CODE_TO_KEY_CODE[nativeMapping.key_code]; + if (keyCode && keyCode !== KeyCode.Unknown) { + if (!result[nativeMapping.value] || result[nativeMapping.value] > keyCode) { + result[nativeMapping.value] = keyCode; + } + } + } + + if (nativeMapping.withShift && _b24_interestingChars[nativeMapping.withShift]) { + // console.log(nativeMapping.withShift + " is made by " + nativeMapping.key_code); + let keyCode = NATIVE_KEY_CODE_TO_KEY_CODE[nativeMapping.key_code]; + if (keyCode && keyCode !== KeyCode.Unknown) { + if (!result[nativeMapping.withShift] || result[nativeMapping.withShift] > keyCode) { + result[nativeMapping.withShift] = keyCode; + } + } + } + } + } + return result; + }; +})(); + +setExtractKeyCode((e:KeyboardEvent) => { + if (e.charCode) { + // "keypress" events mostly + let char = String.fromCharCode(e.charCode).toUpperCase(); + return KeyCode.fromString(char); + } + + if (Platform.isMacintosh && _b24_interestingVirtualKeyCodes[e.keyCode] && typeof (e).keyIdentifier === 'string') { + let keyIdentifier:string = (e).keyIdentifier; + let strCharCode = keyIdentifier.substr(2); + try { + let charCode = parseInt(strCharCode, 16); + let char = String.fromCharCode(charCode); + let unfixMap = _b24_getActualKeyCodeMap(); + if (unfixMap[char]) { + return unfixMap[char]; + } + // console.log(keyIdentifier + ' => ' + char); + } catch(err) { + } + } + // _b24_getActualKeyCodeMap(); + // console.log('injected!!!'); + + return lookupKeyCode(e); +}); + +let nativeLabelProvider:IKeyBindingLabelProvider = null; +export function getNativeLabelProvider(): IKeyBindingLabelProvider { + if (!nativeLabelProvider) { + // See https://msdn.microsoft.com/en-us/library/windows/desktop/dd375731(v=vs.85).aspx + // See https://github.com/alexandrudima/vscode-keyboard/blob/master/deps/chromium/keyboard_codes_win.h + let interestingKeyCodes:{[vkeyCode:string]:boolean;} = { + VKEY_OEM_1: true, + VKEY_OEM_PLUS: true, + VKEY_OEM_COMMA: true, + VKEY_OEM_MINUS: true, + VKEY_OEM_PERIOD: true, + VKEY_OEM_2: true, + VKEY_OEM_3: true, + VKEY_OEM_4: true, + VKEY_OEM_5: true, + VKEY_OEM_6: true, + VKEY_OEM_7: true, + }; + + let remaps:string[] = []; + for (let i = 0, len = KeyCode.MAX_VALUE; i < len; i++) { + remaps[i] = null; + } + + let nativeMappings = getNativeKeymap(); + let hadRemap = false; + for (let i = 0, len = nativeMappings.length; i < len; i++) { + let nativeMapping = nativeMappings[i]; + + if (interestingKeyCodes[nativeMapping.key_code]) { + let newValue = nativeMapping.value || nativeMapping.withShift; + if (newValue.length > 0) { + hadRemap = true; + remaps[NATIVE_KEY_CODE_TO_KEY_CODE[nativeMapping.key_code]] = newValue; + } else { + // console.warn('invalid remap for ', nativeMapping); + } + } + } + + if (hadRemap) { + for (let interestingKeyCode in interestingKeyCodes) { + if (interestingKeyCodes.hasOwnProperty(interestingKeyCode)) { + let keyCode = NATIVE_KEY_CODE_TO_KEY_CODE[interestingKeyCode]; + remaps[keyCode] = remaps[keyCode] || ''; + } + } + } + + if (Platform.isMacintosh) { + nativeLabelProvider = new NativeMacUIKeyLabelProvider(remaps); + } else { + nativeLabelProvider = new NativeClassicUIKeyLabelProvider(remaps); + } + } + return nativeLabelProvider; +} + +class NativeMacUIKeyLabelProvider extends MacUIKeyLabelProvider { + constructor(private remaps:string[]) { + super(); + } + + public getLabelForKey(keyCode:KeyCode): string { + if (this.remaps[keyCode] !== null) { + return this.remaps[keyCode]; + } + return super.getLabelForKey(keyCode); + } +} + +class NativeClassicUIKeyLabelProvider extends ClassicUIKeyLabelProvider { + constructor(private remaps:string[]) { + super(); + } + + public getLabelForKey(keyCode:KeyCode): string { + if (this.remaps[keyCode] !== null) { + return this.remaps[keyCode]; + } + return super.getLabelForKey(keyCode); + } +} diff --git a/src/vs/workbench/services/keybinding/electron-browser/pluginKeybindingService.ts b/src/vs/workbench/services/keybinding/electron-browser/pluginKeybindingService.ts index 31b314bec2b..242f9835429 100644 --- a/src/vs/workbench/services/keybinding/electron-browser/pluginKeybindingService.ts +++ b/src/vs/workbench/services/keybinding/electron-browser/pluginKeybindingService.ts @@ -15,11 +15,10 @@ import {IOSupport} from 'vs/platform/keybinding/common/commonKeybindingResolver' import {WorkbenchKeybindingService} from 'vs/workbench/services/keybinding/browser/keybindingService'; import {ICommandRule, KeybindingsRegistry} from 'vs/platform/keybinding/common/keybindingsRegistry'; import {IJSONSchema} from 'vs/base/common/jsonSchema'; -import {KeyCode, Keybinding, IKeyBindingLabelProvider, MacUIKeyLabelProvider, ClassicUIKeyLabelProvider} from 'vs/base/common/keyCodes'; -import * as nativeKeymap from 'native-keymap'; +import {Keybinding, IKeyBindingLabelProvider} from 'vs/base/common/keyCodes'; import Platform = require('vs/base/common/platform'); import {IHTMLContentElement} from 'vs/base/common/htmlContent'; -import {lookupKeyCode, setExtractKeyCode} from 'vs/base/browser/keyboardEvent'; +import {getNativeLabelProvider} from 'vs/workbench/services/keybinding/electron-browser/nativeKeymap'; interface ContributedKeyBinding { command: string; @@ -108,327 +107,6 @@ let keybindingsExtPoint = PluginsRegistry.registerExtensionPoint' 190 -// Forward slash '/' 191 -// Question mark '?' 191 -// Backtick '`' 192 -// Tilde '~' 192 -// Opening square bracket '[' 219 -// Opening curly brace '{' 219 -// Backslash '\' 220 -// Pipe '|' 220 -// Closing square bracket ']' 221 -// Closing curly brace '}' 221 -// Single quote ''' 222 -// Double quote '"' 222 - -interface IFixedVirtualKeyCodeElement { - char:string; - virtualKeyCode:number; -} - -let _b24_fixedVirtualKeyCodes: IFixedVirtualKeyCodeElement[] = [ - { char: ';', virtualKeyCode: 186 }, - { char: ':', virtualKeyCode: 186 }, - { char: '=', virtualKeyCode: 187 }, - { char: '+', virtualKeyCode: 187 }, - { char: ',', virtualKeyCode: 188 }, - { char: '<', virtualKeyCode: 188 }, - { char: '-', virtualKeyCode: 189 }, - { char: '_', virtualKeyCode: 189 }, - { char: '.', virtualKeyCode: 190 }, - { char: '>', virtualKeyCode: 190 }, - { char: '/', virtualKeyCode: 191 }, - { char: '?', virtualKeyCode: 191 }, - { char: '`', virtualKeyCode: 192 }, - { char: '~', virtualKeyCode: 192 }, - { char: '[', virtualKeyCode: 219 }, - { char: '{', virtualKeyCode: 219 }, - { char: '\\', virtualKeyCode: 220 }, - { char: '|', virtualKeyCode: 220 }, - { char: ']', virtualKeyCode: 221 }, - { char: '}', virtualKeyCode: 221 }, - { char: '\'', virtualKeyCode: 222 }, - { char: '"', virtualKeyCode: 222 }, -]; -let _b24_interestingChars: {[char:string]:boolean;} = Object.create(null); -_b24_fixedVirtualKeyCodes.forEach(el => _b24_interestingChars[el.char] = true); - -let _b24_interestingVirtualKeyCodes: {[virtualKeyCode:number]:boolean;} = Object.create(null); -_b24_fixedVirtualKeyCodes.forEach(el => _b24_interestingVirtualKeyCodes[el.virtualKeyCode] = true); - -interface IUnfixedVirtualKeyCodeMap { - [char:string]: KeyCode; -} -let _b24_getActualKeyCodeMap = (function() { - let result: IUnfixedVirtualKeyCodeMap = null; - return function() { - if (!result) { - result = Object.create(null); - - let nativeMappings = getNativeKeymap(); - - for (let i = 0, len = nativeMappings.length; i < len; i++) { - let nativeMapping = nativeMappings[i]; - - if (nativeMapping.value && _b24_interestingChars[nativeMapping.value]) { - // console.log(nativeMapping.value + " is made by " + nativeMapping.key_code); - let keyCode = NATIVE_KEY_CODE_TO_KEY_CODE[nativeMapping.key_code]; - if (keyCode && keyCode !== KeyCode.Unknown) { - if (!result[nativeMapping.value] || result[nativeMapping.value] > keyCode) { - result[nativeMapping.value] = keyCode; - } - } - } - - if (nativeMapping.withShift && _b24_interestingChars[nativeMapping.withShift]) { - // console.log(nativeMapping.withShift + " is made by " + nativeMapping.key_code); - let keyCode = NATIVE_KEY_CODE_TO_KEY_CODE[nativeMapping.key_code]; - if (keyCode && keyCode !== KeyCode.Unknown) { - if (!result[nativeMapping.withShift] || result[nativeMapping.withShift] > keyCode) { - result[nativeMapping.withShift] = keyCode; - } - } - } - } - } - return result; - }; -})(); - -setExtractKeyCode((e:KeyboardEvent) => { - if (e.charCode) { - // "keypress" events mostly - let char = String.fromCharCode(e.charCode).toUpperCase(); - return KeyCode.fromString(char); - } - - if (Platform.isMacintosh && _b24_interestingVirtualKeyCodes[e.keyCode] && typeof (e).keyIdentifier === 'string') { - let keyIdentifier:string = (e).keyIdentifier; - let strCharCode = keyIdentifier.substr(2); - try { - let charCode = parseInt(strCharCode, 16); - let char = String.fromCharCode(charCode); - let unfixMap = _b24_getActualKeyCodeMap(); - if (unfixMap[char]) { - return unfixMap[char]; - } - // console.log(keyIdentifier + ' => ' + char); - } catch(err) { - } - } - // _b24_getActualKeyCodeMap(); - // console.log('injected!!!'); - - return lookupKeyCode(e); -}); export default class PluginWorkbenchKeybindingService extends WorkbenchKeybindingService { @@ -456,13 +134,11 @@ export default class PluginWorkbenchKeybindingService extends WorkbenchKeybindin } public getLabelFor(keybinding:Keybinding): string { - this._ensureNativeKeymap(); - return keybinding.toCustomLabel(this._nativeLabelProvider); + return keybinding.toCustomLabel(getNativeLabelProvider()); } public getHTMLLabelFor(keybinding:Keybinding): IHTMLContentElement[] { - this._ensureNativeKeymap(); - return keybinding.toCustomHTMLLabel(this._nativeLabelProvider); + return keybinding.toCustomHTMLLabel(getNativeLabelProvider()); } public getElectronAcceleratorFor(keybinding:Keybinding): string { @@ -555,91 +231,4 @@ export default class PluginWorkbenchKeybindingService extends WorkbenchKeybindin return desc; } - - private _gotNativeKeymap = false; - private _nativeLabelProvider:IKeyBindingLabelProvider = null; - private _ensureNativeKeymap(): void { - if (this._gotNativeKeymap) { - return; - } - this._gotNativeKeymap = true; - - // See https://msdn.microsoft.com/en-us/library/windows/desktop/dd375731(v=vs.85).aspx - // See https://github.com/alexandrudima/vscode-keyboard/blob/master/deps/chromium/keyboard_codes_win.h - let interestingKeyCodes:{[vkeyCode:string]:boolean;} = { - VKEY_OEM_1: true, - VKEY_OEM_PLUS: true, - VKEY_OEM_COMMA: true, - VKEY_OEM_MINUS: true, - VKEY_OEM_PERIOD: true, - VKEY_OEM_2: true, - VKEY_OEM_3: true, - VKEY_OEM_4: true, - VKEY_OEM_5: true, - VKEY_OEM_6: true, - VKEY_OEM_7: true, - }; - - let remaps:string[] = []; - for (let i = 0, len = KeyCode.MAX_VALUE; i < len; i++) { - remaps[i] = null; - } - - let nativeMappings = getNativeKeymap(); - let hadRemap = false; - for (let i = 0, len = nativeMappings.length; i < len; i++) { - let nativeMapping = nativeMappings[i]; - - if (interestingKeyCodes[nativeMapping.key_code]) { - let newValue = nativeMapping.value || nativeMapping.withShift; - if (newValue.length > 0) { - hadRemap = true; - remaps[NATIVE_KEY_CODE_TO_KEY_CODE[nativeMapping.key_code]] = newValue; - } else { - // console.warn('invalid remap for ', nativeMapping); - } - } - } - - if (hadRemap) { - for (let interestingKeyCode in interestingKeyCodes) { - if (interestingKeyCodes.hasOwnProperty(interestingKeyCode)) { - let keyCode = NATIVE_KEY_CODE_TO_KEY_CODE[interestingKeyCode]; - remaps[keyCode] = remaps[keyCode] || ''; - } - } - } - - if (Platform.isMacintosh) { - this._nativeLabelProvider = new NativeMacUIKeyLabelProvider(remaps); - } else { - this._nativeLabelProvider = new NativeClassicUIKeyLabelProvider(remaps); - } - } -} - -class NativeMacUIKeyLabelProvider extends MacUIKeyLabelProvider { - constructor(private remaps:string[]) { - super(); - } - - public getLabelForKey(keyCode:KeyCode): string { - if (this.remaps[keyCode] !== null) { - return this.remaps[keyCode]; - } - return super.getLabelForKey(keyCode); - } -} - -class NativeClassicUIKeyLabelProvider extends ClassicUIKeyLabelProvider { - constructor(private remaps:string[]) { - super(); - } - - public getLabelForKey(keyCode:KeyCode): string { - if (this.remaps[keyCode] !== null) { - return this.remaps[keyCode]; - } - return super.getLabelForKey(keyCode); - } } -- GitLab