mirror of
https://github.com/retspen/webvirtcloud
synced 2024-11-01 20:14:15 +00:00
234 lines
6.7 KiB
JavaScript
234 lines
6.7 KiB
JavaScript
|
"use strict";
|
||
|
|
||
|
Object.defineProperty(exports, "__esModule", {
|
||
|
value: true
|
||
|
});
|
||
|
exports.getKeycode = getKeycode;
|
||
|
exports.getKey = getKey;
|
||
|
exports.getKeysym = getKeysym;
|
||
|
|
||
|
var _keysym = require("./keysym.js");
|
||
|
|
||
|
var _keysym2 = _interopRequireDefault(_keysym);
|
||
|
|
||
|
var _keysymdef = require("./keysymdef.js");
|
||
|
|
||
|
var _keysymdef2 = _interopRequireDefault(_keysymdef);
|
||
|
|
||
|
var _vkeys = require("./vkeys.js");
|
||
|
|
||
|
var _vkeys2 = _interopRequireDefault(_vkeys);
|
||
|
|
||
|
var _fixedkeys = require("./fixedkeys.js");
|
||
|
|
||
|
var _fixedkeys2 = _interopRequireDefault(_fixedkeys);
|
||
|
|
||
|
var _domkeytable = require("./domkeytable.js");
|
||
|
|
||
|
var _domkeytable2 = _interopRequireDefault(_domkeytable);
|
||
|
|
||
|
var _browser = require("../util/browser.js");
|
||
|
|
||
|
var browser = _interopRequireWildcard(_browser);
|
||
|
|
||
|
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }
|
||
|
|
||
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
||
|
|
||
|
// Get 'KeyboardEvent.code', handling legacy browsers
|
||
|
function getKeycode(evt) {
|
||
|
// Are we getting proper key identifiers?
|
||
|
// (unfortunately Firefox and Chrome are crappy here and gives
|
||
|
// us an empty string on some platforms, rather than leaving it
|
||
|
// undefined)
|
||
|
if (evt.code) {
|
||
|
// Mozilla isn't fully in sync with the spec yet
|
||
|
switch (evt.code) {
|
||
|
case 'OSLeft':
|
||
|
return 'MetaLeft';
|
||
|
case 'OSRight':
|
||
|
return 'MetaRight';
|
||
|
}
|
||
|
|
||
|
return evt.code;
|
||
|
}
|
||
|
|
||
|
// The de-facto standard is to use Windows Virtual-Key codes
|
||
|
// in the 'keyCode' field for non-printable characters. However
|
||
|
// Webkit sets it to the same as charCode in 'keypress' events.
|
||
|
if (evt.type !== 'keypress' && evt.keyCode in _vkeys2.default) {
|
||
|
var code = _vkeys2.default[evt.keyCode];
|
||
|
|
||
|
// macOS has messed up this code for some reason
|
||
|
if (browser.isMac() && code === 'ContextMenu') {
|
||
|
code = 'MetaRight';
|
||
|
}
|
||
|
|
||
|
// The keyCode doesn't distinguish between left and right
|
||
|
// for the standard modifiers
|
||
|
if (evt.location === 2) {
|
||
|
switch (code) {
|
||
|
case 'ShiftLeft':
|
||
|
return 'ShiftRight';
|
||
|
case 'ControlLeft':
|
||
|
return 'ControlRight';
|
||
|
case 'AltLeft':
|
||
|
return 'AltRight';
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Nor a bunch of the numpad keys
|
||
|
if (evt.location === 3) {
|
||
|
switch (code) {
|
||
|
case 'Delete':
|
||
|
return 'NumpadDecimal';
|
||
|
case 'Insert':
|
||
|
return 'Numpad0';
|
||
|
case 'End':
|
||
|
return 'Numpad1';
|
||
|
case 'ArrowDown':
|
||
|
return 'Numpad2';
|
||
|
case 'PageDown':
|
||
|
return 'Numpad3';
|
||
|
case 'ArrowLeft':
|
||
|
return 'Numpad4';
|
||
|
case 'ArrowRight':
|
||
|
return 'Numpad6';
|
||
|
case 'Home':
|
||
|
return 'Numpad7';
|
||
|
case 'ArrowUp':
|
||
|
return 'Numpad8';
|
||
|
case 'PageUp':
|
||
|
return 'Numpad9';
|
||
|
case 'Enter':
|
||
|
return 'NumpadEnter';
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return code;
|
||
|
}
|
||
|
|
||
|
return 'Unidentified';
|
||
|
}
|
||
|
|
||
|
// Get 'KeyboardEvent.key', handling legacy browsers
|
||
|
function getKey(evt) {
|
||
|
// Are we getting a proper key value?
|
||
|
if (evt.key !== undefined) {
|
||
|
// IE and Edge use some ancient version of the spec
|
||
|
// https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/8860571/
|
||
|
switch (evt.key) {
|
||
|
case 'Spacebar':
|
||
|
return ' ';
|
||
|
case 'Esc':
|
||
|
return 'Escape';
|
||
|
case 'Scroll':
|
||
|
return 'ScrollLock';
|
||
|
case 'Win':
|
||
|
return 'Meta';
|
||
|
case 'Apps':
|
||
|
return 'ContextMenu';
|
||
|
case 'Up':
|
||
|
return 'ArrowUp';
|
||
|
case 'Left':
|
||
|
return 'ArrowLeft';
|
||
|
case 'Right':
|
||
|
return 'ArrowRight';
|
||
|
case 'Down':
|
||
|
return 'ArrowDown';
|
||
|
case 'Del':
|
||
|
return 'Delete';
|
||
|
case 'Divide':
|
||
|
return '/';
|
||
|
case 'Multiply':
|
||
|
return '*';
|
||
|
case 'Subtract':
|
||
|
return '-';
|
||
|
case 'Add':
|
||
|
return '+';
|
||
|
case 'Decimal':
|
||
|
return evt.char;
|
||
|
}
|
||
|
|
||
|
// Mozilla isn't fully in sync with the spec yet
|
||
|
switch (evt.key) {
|
||
|
case 'OS':
|
||
|
return 'Meta';
|
||
|
}
|
||
|
|
||
|
// iOS leaks some OS names
|
||
|
switch (evt.key) {
|
||
|
case 'UIKeyInputUpArrow':
|
||
|
return 'ArrowUp';
|
||
|
case 'UIKeyInputDownArrow':
|
||
|
return 'ArrowDown';
|
||
|
case 'UIKeyInputLeftArrow':
|
||
|
return 'ArrowLeft';
|
||
|
case 'UIKeyInputRightArrow':
|
||
|
return 'ArrowRight';
|
||
|
case 'UIKeyInputEscape':
|
||
|
return 'Escape';
|
||
|
}
|
||
|
|
||
|
// IE and Edge have broken handling of AltGraph so we cannot
|
||
|
// trust them for printable characters
|
||
|
if (evt.key.length !== 1 || !browser.isIE() && !browser.isEdge()) {
|
||
|
return evt.key;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Try to deduce it based on the physical key
|
||
|
var code = getKeycode(evt);
|
||
|
if (code in _fixedkeys2.default) {
|
||
|
return _fixedkeys2.default[code];
|
||
|
}
|
||
|
|
||
|
// If that failed, then see if we have a printable character
|
||
|
if (evt.charCode) {
|
||
|
return String.fromCharCode(evt.charCode);
|
||
|
}
|
||
|
|
||
|
// At this point we have nothing left to go on
|
||
|
return 'Unidentified';
|
||
|
}
|
||
|
|
||
|
// Get the most reliable keysym value we can get from a key event
|
||
|
function getKeysym(evt) {
|
||
|
var key = getKey(evt);
|
||
|
|
||
|
if (key === 'Unidentified') {
|
||
|
return null;
|
||
|
}
|
||
|
|
||
|
// First look up special keys
|
||
|
if (key in _domkeytable2.default) {
|
||
|
var location = evt.location;
|
||
|
|
||
|
// Safari screws up location for the right cmd key
|
||
|
if (key === 'Meta' && location === 0) {
|
||
|
location = 2;
|
||
|
}
|
||
|
|
||
|
if (location === undefined || location > 3) {
|
||
|
location = 0;
|
||
|
}
|
||
|
|
||
|
return _domkeytable2.default[key][location];
|
||
|
}
|
||
|
|
||
|
// Now we need to look at the Unicode symbol instead
|
||
|
|
||
|
var codepoint;
|
||
|
|
||
|
// Special key? (FIXME: Should have been caught earlier)
|
||
|
if (key.length !== 1) {
|
||
|
return null;
|
||
|
}
|
||
|
|
||
|
codepoint = key.charCodeAt();
|
||
|
if (codepoint) {
|
||
|
return _keysymdef2.default.lookup(codepoint);
|
||
|
}
|
||
|
|
||
|
return null;
|
||
|
}
|