From 3d786a20b9b928c00734090fa5e23a85aac09141 Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Tue, 15 Dec 2015 16:34:48 +0100 Subject: [PATCH] Prepare for working around Chromium's implementing w3c's DOM Level 3 events Section B.2.4 on Mac --- src/vs/base/browser/keyboardEvent.ts | 12 +- .../pluginKeybindingService.ts | 343 +++++++++++++++++- 2 files changed, 338 insertions(+), 17 deletions(-) diff --git a/src/vs/base/browser/keyboardEvent.ts b/src/vs/base/browser/keyboardEvent.ts index d65685d2b00..5cae4180e85 100644 --- a/src/vs/base/browser/keyboardEvent.ts +++ b/src/vs/base/browser/keyboardEvent.ts @@ -141,13 +141,21 @@ interface INormalizedKeyCode { key: string; } -function extractKeyCode(e:KeyboardEvent): KeyCode { +export function lookupKeyCode(e:KeyboardEvent): KeyCode { + return KEY_CODE_MAP[e.keyCode] || KeyCode.Unknown; +} + +let extractKeyCode = function extractKeyCode(e:KeyboardEvent): KeyCode { if (e.charCode) { // "keypress" events mostly let char = String.fromCharCode(e.charCode).toUpperCase(); return KeyCode.fromString(char); } - return KEY_CODE_MAP[e.keyCode] || KeyCode.Unknown; + return lookupKeyCode(e); +} + +export function setExtractKeyCode(newExtractKeyCode:(e:KeyboardEvent)=>KeyCode): void { + extractKeyCode = newExtractKeyCode; } export interface IKeyboardEvent { diff --git a/src/vs/workbench/services/keybinding/electron-browser/pluginKeybindingService.ts b/src/vs/workbench/services/keybinding/electron-browser/pluginKeybindingService.ts index b8bb27b7eca..b0e2bca075b 100644 --- a/src/vs/workbench/services/keybinding/electron-browser/pluginKeybindingService.ts +++ b/src/vs/workbench/services/keybinding/electron-browser/pluginKeybindingService.ts @@ -21,6 +21,7 @@ import {KeyCode, Keybinding, IKeyBindingLabelProvider, MacUIKeyLabelProvider, Cl import * as nativeKeymap from 'native-keymap'; import Platform = require('vs/base/common/platform'); import {IHTMLContentElement} from 'vs/base/common/htmlContent'; +import {lookupKeyCode, setExtractKeyCode} from 'vs/base/browser/keyboardEvent'; interface ContributedKeyBinding { command: string; @@ -109,6 +110,318 @@ 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() { + var 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]) { + let keyCode = NATIVE_KEY_CODE_TO_KEY_CODE[nativeMapping.key_code]; + if (keyCode && keyCode !== KeyCode.Unknown) { + result[nativeMapping.value] = keyCode; + } + } + + if (nativeMapping.withShift && _b24_interestingChars[nativeMapping.withShift]) { + let keyCode = NATIVE_KEY_CODE_TO_KEY_CODE[nativeMapping.key_code]; + if (keyCode && keyCode !== KeyCode.Unknown) { + 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); + // console.log(keyIdentifier + ' => ' + char); + } catch(err) { + } + } + // _b24_getActualKeyCodeMap(); + // console.log('injected!!!'); + + return lookupKeyCode(e); +}); + export default class PluginWorkbenchKeybindingService extends WorkbenchKeybindingService { private _pluginService: IPluginService; @@ -225,18 +538,18 @@ export default class PluginWorkbenchKeybindingService extends WorkbenchKeybindin // 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]:KeyCode;} = { - VKEY_OEM_1: KeyCode.US_SEMICOLON, // (0xBA) as ; - VKEY_OEM_PLUS: KeyCode.US_EQUAL, // (0xBB) as = - VKEY_OEM_COMMA: KeyCode.US_COMMA, // (0xBC) as , - VKEY_OEM_MINUS: KeyCode.US_MINUS, // (0xBD) as - - VKEY_OEM_PERIOD: KeyCode.US_DOT, // (0xBE) as . - VKEY_OEM_2: KeyCode.US_SLASH, // (0xBF) as / - VKEY_OEM_3: KeyCode.US_BACKTICK, // (0xC0) as ` - VKEY_OEM_4: KeyCode.US_OPEN_SQUARE_BRACKET, // (0xDB) as [ - VKEY_OEM_5: KeyCode.US_BACKSLASH, // (0xDC) as \ - VKEY_OEM_6: KeyCode.US_CLOSE_SQUARE_BRACKET, // (0xDD) as ] - VKEY_OEM_7: KeyCode.US_QUOTE, // (0xDE) as ' + 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[] = []; @@ -244,7 +557,7 @@ export default class PluginWorkbenchKeybindingService extends WorkbenchKeybindin remaps[i] = null; } - let nativeMappings = nativeKeymap.getKeyMap(); + let nativeMappings = getNativeKeymap(); let hadRemap = false; for (let i = 0, len = nativeMappings.length; i < len; i++) { let nativeMapping = nativeMappings[i]; @@ -253,7 +566,7 @@ export default class PluginWorkbenchKeybindingService extends WorkbenchKeybindin let newValue = nativeMapping.value || nativeMapping.withShift; if (newValue.length > 0) { hadRemap = true; - remaps[interestingKeyCodes[nativeMapping.key_code]] = newValue; + remaps[NATIVE_KEY_CODE_TO_KEY_CODE[nativeMapping.key_code]] = newValue; } else { console.warn('invalid remap for ', nativeMapping); } @@ -263,7 +576,7 @@ export default class PluginWorkbenchKeybindingService extends WorkbenchKeybindin if (hadRemap) { for (let interestingKeyCode in interestingKeyCodes) { if (interestingKeyCodes.hasOwnProperty(interestingKeyCode)) { - let keyCode = interestingKeyCodes[interestingKeyCode]; + let keyCode = NATIVE_KEY_CODE_TO_KEY_CODE[interestingKeyCode]; remaps[keyCode] = remaps[keyCode] || ''; } } -- GitLab