diff --git a/ui/src/components/WebRTCVideo.tsx b/ui/src/components/WebRTCVideo.tsx index c8e8fdc..3cdb2e9 100644 --- a/ui/src/components/WebRTCVideo.tsx +++ b/ui/src/components/WebRTCVideo.tsx @@ -332,19 +332,25 @@ export default function WebRTCVideo() { // Example: If altKey is true, keep all modifiers // If altKey is false, filter out 0x04 (AltLeft) // - // But intentionally do not filter out 0x40 (AltRight) to enable Alt Gr - // (Alt Graph) as a modifier. The altKey attribute is set to false on - // key combinations involving the Alt Gr key, which means the modifier - // would otherwise be unintentionally removed from the filteredModifiers - // list. - // - // For example, the KeyboardEvent for Alt Gr + 2 has the following structure: + // But intentionally do not filter out 0x40 (AltRight) to accomodate + // Alt Gr (Alt Graph) as a modifier. Oddly, Alt Gr does not declare + // itself to be an altKey. For example, the KeyboardEvent for + // Alt Gr + 2 has the following structure: // - altKey: false // - code: "Digit2" - // - type: ["keydown"|"keyup"] + // - type: [ "keydown" | "keyup" ] // - // Adding and removing 0x40 (AltRight) from and to the list of active - // modifiers is handled by keyUpHandler an keyDownHandler. + // For context, filteredModifiers aims to keep track which modifiers + // are being pressed on the physical keyboard at any point in time. + // There is logic in the keyUpHandler and keyDownHandler to add and + // remove 0x40 (AltRight) from the list of new modifiers. + // + // But relying on the two handlers alone to track the state of the + // modifier bears the risk that the key up event for Alt Gr could + // get lost while the browser window is temporarily out of focus, + // which means the Alt Gr key state would then be "stuck". At this + // point, we would need to rely on the user to press Alt Gr again + // to properly release the state of that modifier. .filter( modifier => altKey ||