From b074462ee79e6da6eea9802409b644788dc54c9d Mon Sep 17 00:00:00 2001 From: Adam Shiervani Date: Thu, 13 Nov 2025 10:48:03 +0100 Subject: [PATCH 1/3] feat: wait for channel to open before triggering initial state updates (#963) --- webrtc.go | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/webrtc.go b/webrtc.go index abe1aba7..46fca2b8 100644 --- a/webrtc.go +++ b/webrtc.go @@ -286,10 +286,13 @@ func newSession(config SessionConfig) (*Session, error) { // Enqueue to ensure ordered processing session.rpcQueue <- msg }) - triggerOTAStateUpdate() - triggerVideoStateUpdate() - triggerUSBStateUpdate() - notifyFailsafeMode(session) + // Wait for channel to be open before sending initial state + d.OnOpen(func() { + triggerOTAStateUpdate() + triggerVideoStateUpdate() + triggerUSBStateUpdate() + notifyFailsafeMode(session) + }) case "terminal": handleTerminalChannel(d) case "serial": From e293edb069ade6b0652b6e5da2fb8952380b6616 Mon Sep 17 00:00:00 2001 From: Nitish Agarwal <1592163+nitishagar@users.noreply.github.com> Date: Mon, 17 Nov 2025 14:45:03 +0530 Subject: [PATCH 2/3] fix: normalize Unicode characters in paste modal for proper detection (#976) --- ui/src/components/popovers/PasteModal.tsx | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/ui/src/components/popovers/PasteModal.tsx b/ui/src/components/popovers/PasteModal.tsx index ccc5d307..9bc122d5 100644 --- a/ui/src/components/popovers/PasteModal.tsx +++ b/ui/src/components/popovers/PasteModal.tsx @@ -66,7 +66,8 @@ export default function PasteModal() { const macroSteps: MacroStep[] = []; for (const char of text) { - const keyprops = selectedKeyboard.chars[char]; + const normalizedChar = char.normalize('NFC'); + const keyprops = selectedKeyboard.chars[normalizedChar]; if (!keyprops) continue; const { key, shift, altRight, deadKey, accentKey } = keyprops; @@ -164,7 +165,7 @@ export default function PasteModal() { ...new Set( // @ts-expect-error TS doesn't recognize Intl.Segmenter in some environments [...new Intl.Segmenter().segment(value)] - .map(x => x.segment) + .map(x => x.segment.normalize('NFC')) .filter(char => !selectedKeyboard.chars[char]), ), ]; From d49e2680d029e070b8af3834925a2bdb7ae77ec9 Mon Sep 17 00:00:00 2001 From: Nitish Agarwal <1592163+nitishagar@users.noreply.github.com> Date: Mon, 17 Nov 2025 18:58:28 +0530 Subject: [PATCH 3/3] fix: show HDMI overlays in fullscreen mode (#974) --- ui/src/components/WebRTCVideo.tsx | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/ui/src/components/WebRTCVideo.tsx b/ui/src/components/WebRTCVideo.tsx index ec392012..c54d2b8d 100644 --- a/ui/src/components/WebRTCVideo.tsx +++ b/ui/src/components/WebRTCVideo.tsx @@ -26,6 +26,7 @@ import { m } from "@localizations/messages.js"; export default function WebRTCVideo({ hasConnectionIssues }: { hasConnectionIssues: boolean }) { // Video and stream related refs and states const videoElm = useRef(null); + const fullscreenContainerRef = useRef(null); const { mediaStream, peerConnectionState } = useRTCStore(); const [isPlaying, setIsPlaying] = useState(false); const [isPointerLockActive, setIsPointerLockActive] = useState(false); @@ -150,7 +151,7 @@ export default function WebRTCVideo({ hasConnectionIssues }: { hasConnectionIssu }, [checkNavigatorPermissions, setIsKeyboardLockActive]); const releaseKeyboardLock = useCallback(async () => { - if (videoElm.current === null || document.fullscreenElement !== videoElm.current) return; + if (fullscreenContainerRef.current === null || document.fullscreenElement !== fullscreenContainerRef.current) return; if (navigator && "keyboard" in navigator) { try { @@ -187,7 +188,7 @@ export default function WebRTCVideo({ hasConnectionIssues }: { hasConnectionIssu }, [isPointerLockPossible]); const requestFullscreen = useCallback(async () => { - if (!isFullscreenEnabled || !videoElm.current) return; + if (!isFullscreenEnabled || !fullscreenContainerRef.current) return; // per https://wicg.github.io/keyboard-lock/#system-key-press-handler // If keyboard lock is activated after fullscreen is already in effect, then the user my @@ -196,7 +197,7 @@ export default function WebRTCVideo({ hasConnectionIssues }: { hasConnectionIssu await requestKeyboardLock(); await requestPointerLock(); - await videoElm.current.requestFullscreen({ + await fullscreenContainerRef.current.requestFullscreen({ navigationUI: "show", }); }, [isFullscreenEnabled, requestKeyboardLock, requestPointerLock]); @@ -512,7 +513,10 @@ export default function WebRTCVideo({ hasConnectionIssues }: { hasConnectionIssu {/* In relative mouse mode and under https, we enable the pointer lock, and to do so we need a bar to show the user to click on the video to enable mouse control */}
-
+