123 lines
5.0 KiB
JavaScript
123 lines
5.0 KiB
JavaScript
/*---------------------------------------------------------------------------------------------
|
|
* Copyright (c) Microsoft Corporation. All rights reserved.
|
|
* Licensed under the MIT License. See License.txt in the project root for license information.
|
|
*--------------------------------------------------------------------------------------------*/
|
|
import * as browser from './browser.js';
|
|
import { EVENT_KEY_CODE_MAP, KeyCodeUtils } from '../common/keyCodes.js';
|
|
import { KeyCodeChord } from '../common/keybindings.js';
|
|
import * as platform from '../common/platform.js';
|
|
function extractKeyCode(e) {
|
|
if (e.charCode) {
|
|
// "keypress" events mostly
|
|
const char = String.fromCharCode(e.charCode).toUpperCase();
|
|
return KeyCodeUtils.fromString(char);
|
|
}
|
|
const keyCode = e.keyCode;
|
|
// browser quirks
|
|
if (keyCode === 3) {
|
|
return 7 /* KeyCode.PauseBreak */;
|
|
}
|
|
else if (browser.isFirefox) {
|
|
switch (keyCode) {
|
|
case 59: return 85 /* KeyCode.Semicolon */;
|
|
case 60:
|
|
if (platform.isLinux) {
|
|
return 97 /* KeyCode.IntlBackslash */;
|
|
}
|
|
break;
|
|
case 61: return 86 /* KeyCode.Equal */;
|
|
// based on: https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/keyCode#numpad_keys
|
|
case 107: return 109 /* KeyCode.NumpadAdd */;
|
|
case 109: return 111 /* KeyCode.NumpadSubtract */;
|
|
case 173: return 88 /* KeyCode.Minus */;
|
|
case 224:
|
|
if (platform.isMacintosh) {
|
|
return 57 /* KeyCode.Meta */;
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
else if (browser.isWebKit) {
|
|
if (platform.isMacintosh && keyCode === 93) {
|
|
// the two meta keys in the Mac have different key codes (91 and 93)
|
|
return 57 /* KeyCode.Meta */;
|
|
}
|
|
else if (!platform.isMacintosh && keyCode === 92) {
|
|
return 57 /* KeyCode.Meta */;
|
|
}
|
|
}
|
|
// cross browser keycodes:
|
|
return EVENT_KEY_CODE_MAP[keyCode] || 0 /* KeyCode.Unknown */;
|
|
}
|
|
const ctrlKeyMod = (platform.isMacintosh ? 256 /* KeyMod.WinCtrl */ : 2048 /* KeyMod.CtrlCmd */);
|
|
const altKeyMod = 512 /* KeyMod.Alt */;
|
|
const shiftKeyMod = 1024 /* KeyMod.Shift */;
|
|
const metaKeyMod = (platform.isMacintosh ? 2048 /* KeyMod.CtrlCmd */ : 256 /* KeyMod.WinCtrl */);
|
|
export class StandardKeyboardEvent {
|
|
constructor(source) {
|
|
this._standardKeyboardEventBrand = true;
|
|
const e = source;
|
|
this.browserEvent = e;
|
|
this.target = e.target;
|
|
this.ctrlKey = e.ctrlKey;
|
|
this.shiftKey = e.shiftKey;
|
|
this.altKey = e.altKey;
|
|
this.metaKey = e.metaKey;
|
|
this.altGraphKey = e.getModifierState('AltGraph');
|
|
this.keyCode = extractKeyCode(e);
|
|
this.code = e.code;
|
|
// console.info(e.type + ": keyCode: " + e.keyCode + ", which: " + e.which + ", charCode: " + e.charCode + ", detail: " + e.detail + " ====> " + this.keyCode + ' -- ' + KeyCode[this.keyCode]);
|
|
this.ctrlKey = this.ctrlKey || this.keyCode === 5 /* KeyCode.Ctrl */;
|
|
this.altKey = this.altKey || this.keyCode === 6 /* KeyCode.Alt */;
|
|
this.shiftKey = this.shiftKey || this.keyCode === 4 /* KeyCode.Shift */;
|
|
this.metaKey = this.metaKey || this.keyCode === 57 /* KeyCode.Meta */;
|
|
this._asKeybinding = this._computeKeybinding();
|
|
this._asKeyCodeChord = this._computeKeyCodeChord();
|
|
// console.log(`code: ${e.code}, keyCode: ${e.keyCode}, key: ${e.key}`);
|
|
}
|
|
preventDefault() {
|
|
if (this.browserEvent && this.browserEvent.preventDefault) {
|
|
this.browserEvent.preventDefault();
|
|
}
|
|
}
|
|
stopPropagation() {
|
|
if (this.browserEvent && this.browserEvent.stopPropagation) {
|
|
this.browserEvent.stopPropagation();
|
|
}
|
|
}
|
|
toKeyCodeChord() {
|
|
return this._asKeyCodeChord;
|
|
}
|
|
equals(other) {
|
|
return this._asKeybinding === other;
|
|
}
|
|
_computeKeybinding() {
|
|
let key = 0 /* KeyCode.Unknown */;
|
|
if (this.keyCode !== 5 /* KeyCode.Ctrl */ && this.keyCode !== 4 /* KeyCode.Shift */ && this.keyCode !== 6 /* KeyCode.Alt */ && this.keyCode !== 57 /* KeyCode.Meta */) {
|
|
key = this.keyCode;
|
|
}
|
|
let result = 0;
|
|
if (this.ctrlKey) {
|
|
result |= ctrlKeyMod;
|
|
}
|
|
if (this.altKey) {
|
|
result |= altKeyMod;
|
|
}
|
|
if (this.shiftKey) {
|
|
result |= shiftKeyMod;
|
|
}
|
|
if (this.metaKey) {
|
|
result |= metaKeyMod;
|
|
}
|
|
result |= key;
|
|
return result;
|
|
}
|
|
_computeKeyCodeChord() {
|
|
let key = 0 /* KeyCode.Unknown */;
|
|
if (this.keyCode !== 5 /* KeyCode.Ctrl */ && this.keyCode !== 4 /* KeyCode.Shift */ && this.keyCode !== 6 /* KeyCode.Alt */ && this.keyCode !== 57 /* KeyCode.Meta */) {
|
|
key = this.keyCode;
|
|
}
|
|
return new KeyCodeChord(this.ctrlKey, this.shiftKey, this.altKey, this.metaKey, key);
|
|
}
|
|
}
|