From a61789637a5af03b06655c9ce03a92ddd57fe383 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C5=99emysl=20Eric=20Janouch?=
Date: Mon, 12 Sep 2022 16:43:13 +0200 Subject: [PATCH] xP: deal with macOS/Blink for good --- xP/public/xP.js | 25 ++++++++++++++++++------- 1 file changed, 18 insertions(+), 7 deletions(-) diff --git a/xP/public/xP.js b/xP/public/xP.js index 3344a1f..2c4932b 100644 --- a/xP/public/xP.js +++ b/xP/public/xP.js @@ -132,13 +132,9 @@ class RelayRpc extends EventTarget { function utf8Encode(s) { return new TextEncoder().encode(s) } function utf8Decode(s) { return new TextDecoder().decode(s) } -// On macOS, the Alt/Option key transforms characters, which basically breaks -// all event.altKey shortcuts, so require combining them with Control as well -// on that system. function hasShortcutModifiers(event) { - // This method of detection only works with Blink browsers, as of writing. - return event.altKey && !event.metaKey && - (navigator.userAgentData?.platform === 'macOS') === event.ctrlKey + return (event.altKey || event.escapePrefix) && + !event.metaKey && !event.ctrlKey } const audioContext = new AudioContext() @@ -826,7 +822,22 @@ document.addEventListener('visibilitychange', event => { } }) +// On macOS, the Alt/Option key transforms characters, which basically breaks +// all event.altKey shortcuts, so implement Escape prefixing on that system. +// This method of detection only works with Blink browsers, as of writing. +let lastWasEscape = false document.addEventListener('keydown', event => { + event.escapePrefix = lastWasEscape + if (lastWasEscape) { + lastWasEscape = false + } else if (event.code == 'Escape' && + navigator.userAgentData?.platform === 'macOS') { + event.preventDefault() + event.stopPropagation() + lastWasEscape = true + return + } + if (rpc.ws == undefined || !hasShortcutModifiers(event)) return @@ -874,4 +885,4 @@ document.addEventListener('keydown', event => { } event.preventDefault() -}) +}, true)