From d415afcea9a2c086f018581a3504bc78c34b3383 Mon Sep 17 00:00:00 2001 From: Adam Shiervani Date: Wed, 19 Feb 2025 14:00:15 +0100 Subject: [PATCH] feat(ui): improve video playback and keyboard handling in WebRTCVideo (#176) * feat(ui): improve video playback and keyboard handling in WebRTCVideo * fix(ui): correct event handler naming in WebRTCVideo component --- ui/src/components/WebRTCVideo.tsx | 45 ++++++++++++++++++++----------- 1 file changed, 29 insertions(+), 16 deletions(-) diff --git a/ui/src/components/WebRTCVideo.tsx b/ui/src/components/WebRTCVideo.tsx index 1e5699c..7eaab50 100644 --- a/ui/src/components/WebRTCVideo.tsx +++ b/ui/src/components/WebRTCVideo.tsx @@ -285,11 +285,6 @@ export default function WebRTCVideo() { e.preventDefault(); const prev = useHidStore.getState(); - // if (document.activeElement?.id !== "videoFocusTrap") { - // console.log("KEYUP: Not focusing on the video", document.activeElement); - // return; - // } - setIsNumLockActive(e.getModifierState("NumLock")); setIsCapsLockActive(e.getModifierState("CapsLock")); setIsScrollLockActive(e.getModifierState("ScrollLock")); @@ -336,6 +331,18 @@ export default function WebRTCVideo() { [keyDownHandler, keyUpHandler, resetKeyboardState, sendKeyboardEvent], ); + const videoKeyUpHandler = useCallback((e: KeyboardEvent) => { + // In fullscreen mode in chrome & safari, the space key is used to pause/play the video + // there is no way to prevent this, so we need to simply force play the video when it's paused. + // Fix only works in chrome based browsers. + if (e.code === "Space") { + if (videoElm.current?.paused == true) { + console.log("Force playing video"); + videoElm.current?.play(); + } + } + }, []); + useEffect( function setupVideoEventListeners() { let videoElmRefValue = null; @@ -347,7 +354,7 @@ export default function WebRTCVideo() { videoElmRefValue.addEventListener("mousemove", mouseMoveHandler, { signal }); videoElmRefValue.addEventListener("pointerdown", mouseMoveHandler, { signal }); videoElmRefValue.addEventListener("pointerup", mouseMoveHandler, { signal }); - + videoElmRefValue.addEventListener("keyup", videoKeyUpHandler, { signal }); videoElmRefValue.addEventListener("wheel", mouseWheelHandler, { signal }); videoElmRefValue.addEventListener( "contextmenu", @@ -364,7 +371,13 @@ export default function WebRTCVideo() { if (videoElmRefValue) abortController.abort(); }; }, - [mouseMoveHandler, resetMousePosition, onVideoPlaying, mouseWheelHandler], + [ + mouseMoveHandler, + resetMousePosition, + onVideoPlaying, + mouseWheelHandler, + videoKeyUpHandler, + ], ); useEffect( @@ -410,7 +423,7 @@ export default function WebRTCVideo() { }, [sendKeyboardEvent, setDisableVideoFocusTrap, sidebarView]); return ( -
+
-
+
-
-
-
-
+
+
+
+