class KeyEventService extends EventTarget { constructor() { var _a, _b, _c; super(); this.downKeys = {}; this.ctrlKey = false; this.altKey = false; this.metaKey = false; this.shiftKey = false; this.isMac = !!(((_a = navigator.platform) === null || _a === void 0 ? void 0 : _a.toLocaleUpperCase().startsWith("MAC")) || ((_c = (_b = navigator.userAgentData) === null || _b === void 0 ? void 0 : _b.platform) === null || _c === void 0 ? void 0 : _c.toLocaleUpperCase().startsWith("MAC"))); this.initialize(); } initialize() { const that = this; const processKey = LGraphCanvas.prototype.processKey; LGraphCanvas.prototype.processKey = function (e) { if (e.type === "keydown" || e.type === "keyup") { that.handleKeyDownOrUp(e); } return processKey.apply(this, [...arguments]); }; window.addEventListener("keydown", (e) => { that.handleKeyDownOrUp(e); }); window.addEventListener("keyup", (e) => { that.handleKeyDownOrUp(e); }); document.addEventListener("visibilitychange", (e) => { this.clearKeydowns(); }); window.addEventListener("blur", (e) => { this.clearKeydowns(); }); } handleKeyDownOrUp(e) { const key = e.key.toLocaleUpperCase(); if ((e.type === 'keydown' && this.downKeys[key] === true) || (e.type === 'keyup' && this.downKeys[key] === undefined)) { return; } this.ctrlKey = !!e.ctrlKey; this.altKey = !!e.altKey; this.metaKey = !!e.metaKey; this.shiftKey = !!e.shiftKey; if (e.type === "keydown") { this.downKeys[key] = true; this.dispatchCustomEvent("keydown", { originalEvent: e }); } else if (e.type === "keyup") { if (key === "META" && this.isMac) { this.clearKeydowns(); } else { delete this.downKeys[key]; } this.dispatchCustomEvent("keyup", { originalEvent: e }); } } clearKeydowns() { this.ctrlKey = false; this.altKey = false; this.metaKey = false; this.shiftKey = false; for (const key in this.downKeys) delete this.downKeys[key]; } dispatchCustomEvent(event, detail) { if (detail != null) { return this.dispatchEvent(new CustomEvent(event, { detail })); } return this.dispatchEvent(new CustomEvent(event)); } getKeysFromShortcut(shortcut) { let keys; if (typeof shortcut === "string") { shortcut = shortcut.replace(/\s/g, ""); shortcut = shortcut.replace(/^\+/, "__PLUS__").replace(/\+\+/, "+__PLUS__"); keys = shortcut.split("+").map((i) => i.replace("__PLUS__", "+")); } else { keys = [...shortcut]; } return keys.map((k) => k.toLocaleUpperCase()); } areAllKeysDown(keys) { keys = this.getKeysFromShortcut(keys); return keys.every((k) => { return this.downKeys[k]; }); } areOnlyKeysDown(keys, alsoAllowShift = false) { keys = this.getKeysFromShortcut(keys); const allKeysDown = this.areAllKeysDown(keys); const downKeysLength = Object.values(this.downKeys).length; if (allKeysDown && keys.length === downKeysLength) { return true; } if (alsoAllowShift && !keys.includes("SHIFT") && keys.length === downKeysLength - 1) { return allKeysDown && this.areAllKeysDown(["SHIFT"]); } return false; } } export const SERVICE = new KeyEventService();