@@ -29,6 +29,7 @@ export default function WebRTCVideo() {
29
29
const settings = useSettingsStore ( ) ;
30
30
const { sendKeyboardEvent, resetKeyboardState } = useKeyboard ( ) ;
31
31
const setMousePosition = useMouseStore ( state => state . setMousePosition ) ;
32
+ const setMouseMove = useMouseStore ( state => state . setMouseMove ) ;
32
33
const {
33
34
setClientSize : setVideoClientSize ,
34
35
setSize : setVideoSize ,
@@ -93,19 +94,44 @@ export default function WebRTCVideo() {
93
94
) ;
94
95
95
96
// Mouse-related
96
- const sendMouseMovement = useCallback (
97
+ const calcDelta = ( pos : number ) => Math . abs ( pos ) < 10 ? pos * 2 : pos ;
98
+ const sendRelMouseMovement = useCallback (
97
99
( x : number , y : number , buttons : number ) => {
98
- send ( "absMouseReport" , { x, y, buttons } ) ;
100
+ if ( settings . mouseMode !== "relative" ) return ;
101
+ // if we ignore the event, double-click will not work
102
+ // if (x === 0 && y === 0 && buttons === 0) return;
103
+ send ( "relMouseReport" , { dx : calcDelta ( x ) , dy : calcDelta ( y ) , buttons } ) ;
104
+ setMouseMove ( { x, y, buttons } ) ;
105
+ } ,
106
+ [ send , setMouseMove , settings . mouseMode ] ,
107
+ ) ;
99
108
109
+ const relMouseMoveHandler = useCallback (
110
+ ( e : MouseEvent ) => {
111
+ if ( settings . mouseMode !== "relative" ) return ;
112
+
113
+ // Send mouse movement
114
+ const { buttons } = e ;
115
+ sendRelMouseMovement ( e . movementX , e . movementY , buttons ) ;
116
+ } ,
117
+ [ sendRelMouseMovement , settings . mouseMode ] ,
118
+ ) ;
119
+
120
+ const sendAbsMouseMovement = useCallback (
121
+ ( x : number , y : number , buttons : number ) => {
122
+ if ( settings . mouseMode !== "absolute" ) return ;
123
+ send ( "absMouseReport" , { x, y, buttons } ) ;
100
124
// We set that for the debug info bar
101
125
setMousePosition ( x , y ) ;
102
126
} ,
103
- [ send , setMousePosition ] ,
127
+ [ send , setMousePosition , settings . mouseMode ] ,
104
128
) ;
105
129
106
- const mouseMoveHandler = useCallback (
130
+ const absMouseMoveHandler = useCallback (
107
131
( e : MouseEvent ) => {
108
132
if ( ! videoClientWidth || ! videoClientHeight ) return ;
133
+ if ( settings . mouseMode !== "absolute" ) return ;
134
+
109
135
// Get the aspect ratios of the video element and the video stream
110
136
const videoElementAspectRatio = videoClientWidth / videoClientHeight ;
111
137
const videoStreamAspectRatio = videoWidth / videoHeight ;
@@ -140,9 +166,9 @@ export default function WebRTCVideo() {
140
166
141
167
// Send mouse movement
142
168
const { buttons } = e ;
143
- sendMouseMovement ( x , y , buttons ) ;
169
+ sendAbsMouseMovement ( x , y , buttons ) ;
144
170
} ,
145
- [ sendMouseMovement , videoClientHeight , videoClientWidth , videoWidth , videoHeight ] ,
171
+ [ sendAbsMouseMovement , videoClientHeight , videoClientWidth , videoWidth , videoHeight , settings . mouseMode ] ,
146
172
) ;
147
173
148
174
const trackpadSensitivity = useDeviceSettingsStore ( state => state . trackpadSensitivity ) ;
@@ -193,8 +219,8 @@ export default function WebRTCVideo() {
193
219
) ;
194
220
195
221
const resetMousePosition = useCallback ( ( ) => {
196
- sendMouseMovement ( 0 , 0 , 0 ) ;
197
- } , [ sendMouseMovement ] ) ;
222
+ sendAbsMouseMovement ( 0 , 0 , 0 ) ;
223
+ } , [ sendAbsMouseMovement ] ) ;
198
224
199
225
// Keyboard-related
200
226
const handleModifierKeys = useCallback (
@@ -371,9 +397,9 @@ export default function WebRTCVideo() {
371
397
const abortController = new AbortController ( ) ;
372
398
const signal = abortController . signal ;
373
399
374
- videoElmRefValue . addEventListener ( "mousemove" , mouseMoveHandler , { signal } ) ;
375
- videoElmRefValue . addEventListener ( "pointerdown" , mouseMoveHandler , { signal } ) ;
376
- videoElmRefValue . addEventListener ( "pointerup" , mouseMoveHandler , { signal } ) ;
400
+ videoElmRefValue . addEventListener ( "mousemove" , absMouseMoveHandler , { signal } ) ;
401
+ videoElmRefValue . addEventListener ( "pointerdown" , absMouseMoveHandler , { signal } ) ;
402
+ videoElmRefValue . addEventListener ( "pointerup" , absMouseMoveHandler , { signal } ) ;
377
403
videoElmRefValue . addEventListener ( "keyup" , videoKeyUpHandler , { signal } ) ;
378
404
videoElmRefValue . addEventListener ( "wheel" , mouseWheelHandler , {
379
405
signal,
@@ -395,14 +421,39 @@ export default function WebRTCVideo() {
395
421
} ;
396
422
} ,
397
423
[
398
- mouseMoveHandler ,
424
+ absMouseMoveHandler ,
399
425
resetMousePosition ,
400
426
onVideoPlaying ,
401
427
mouseWheelHandler ,
402
428
videoKeyUpHandler ,
403
429
] ,
404
430
) ;
405
431
432
+ useEffect (
433
+ function setupRelativeMouseEventListeners ( ) {
434
+ if ( settings . mouseMode !== "relative" ) return ;
435
+
436
+ const abortController = new AbortController ( ) ;
437
+ const signal = abortController . signal ;
438
+
439
+ // bind to body to capture all mouse events
440
+ const body = document . querySelector ( "body" ) ;
441
+ if ( ! body ) return ;
442
+
443
+ body . addEventListener ( "mousemove" , relMouseMoveHandler , { signal } ) ;
444
+ body . addEventListener ( "pointerdown" , relMouseMoveHandler , { signal } ) ;
445
+ body . addEventListener ( "pointerup" , relMouseMoveHandler , { signal } ) ;
446
+
447
+ return ( ) => {
448
+ abortController . abort ( ) ;
449
+
450
+ body . removeEventListener ( "mousemove" , relMouseMoveHandler ) ;
451
+ body . removeEventListener ( "pointerdown" , relMouseMoveHandler ) ;
452
+ body . removeEventListener ( "pointerup" , relMouseMoveHandler ) ;
453
+ } ;
454
+ } , [ settings . mouseMode , relMouseMoveHandler ] ,
455
+ )
456
+
406
457
useEffect (
407
458
function updateVideoStream ( ) {
408
459
if ( ! mediaStream ) return ;
0 commit comments