@epicgames-ps/lib-pixelstreamingfrontend-ue5.5 0.1.4 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (94) hide show
  1. package/.eslintrc.js +1 -1
  2. package/.prettierrc.json +1 -0
  3. package/dist/lib-pixelstreamingfrontend.esm.js +1 -1
  4. package/dist/lib-pixelstreamingfrontend.js +1 -1
  5. package/package.json +6 -5
  6. package/src/AFK/AFKController.ts +10 -32
  7. package/src/Config/Config.ts +179 -201
  8. package/src/Config/SettingBase.ts +61 -2
  9. package/src/Config/SettingFlag.ts +10 -48
  10. package/src/Config/SettingNumber.ts +10 -28
  11. package/src/Config/SettingOption.ts +13 -46
  12. package/src/Config/SettingText.ts +9 -37
  13. package/src/DataChannel/DataChannelController.ts +6 -26
  14. package/src/DataChannel/DataChannelLatencyTestController.ts +38 -33
  15. package/src/DataChannel/DataChannelLatencyTestResults.ts +8 -10
  16. package/src/DataChannel/DataChannelSender.ts +5 -15
  17. package/src/DataChannel/LatencyTestResults.ts +5 -15
  18. package/src/FreezeFrame/FreezeFrame.ts +7 -19
  19. package/src/FreezeFrame/FreezeFrameController.ts +3 -14
  20. package/src/Inputs/GamepadController.ts +123 -221
  21. package/src/Inputs/GamepadTypes.ts +23 -0
  22. package/src/Inputs/IInputController.ts +17 -0
  23. package/src/Inputs/InputClassesFactory.ts +38 -45
  24. package/src/Inputs/KeyCodes.ts +114 -0
  25. package/src/Inputs/KeyboardController.ts +49 -232
  26. package/src/Inputs/MouseController.ts +71 -297
  27. package/src/Inputs/MouseControllerHovering.ts +118 -0
  28. package/src/Inputs/MouseControllerLocked.ts +194 -0
  29. package/src/Inputs/TouchController.ts +49 -105
  30. package/src/Inputs/TouchControllerFake.ts +132 -0
  31. package/src/Inputs/XRGamepadController.ts +35 -44
  32. package/src/PeerConnectionController/AggregatedStats.ts +26 -54
  33. package/src/PeerConnectionController/CandidatePairStats.ts +1 -1
  34. package/src/PeerConnectionController/CandidateStat.ts +1 -1
  35. package/src/PeerConnectionController/PeerConnectionController.ts +177 -162
  36. package/src/PixelStreaming/PixelStreaming.ts +174 -226
  37. package/src/UI/OnScreenKeyboard.ts +14 -9
  38. package/src/UeInstanceMessage/ResponseController.ts +6 -15
  39. package/src/UeInstanceMessage/SendMessageController.ts +16 -18
  40. package/src/UeInstanceMessage/StreamMessageController.ts +3 -12
  41. package/src/UeInstanceMessage/ToStreamerMessagesController.ts +3 -9
  42. package/src/Util/EventEmitter.ts +17 -22
  43. package/src/Util/FileUtil.ts +11 -34
  44. package/src/Util/IURLSearchParams.ts +25 -0
  45. package/src/Util/InputCoordTranslator.ts +73 -0
  46. package/src/Util/RTCUtils.ts +23 -15
  47. package/src/VideoPlayer/StreamController.ts +6 -23
  48. package/src/VideoPlayer/VideoPlayer.ts +9 -30
  49. package/src/WebRtcPlayer/WebRtcPlayerController.ts +328 -690
  50. package/src/WebXR/WebXRController.ts +82 -94
  51. package/src/pixelstreamingfrontend.ts +6 -10
  52. package/types/AFK/AFKController.d.ts +0 -1
  53. package/types/Config/Config.d.ts +6 -5
  54. package/types/Config/SettingBase.d.ts +13 -0
  55. package/types/Config/SettingFlag.d.ts +1 -10
  56. package/types/Config/SettingNumber.d.ts +1 -5
  57. package/types/Config/SettingOption.d.ts +1 -10
  58. package/types/Config/SettingText.d.ts +1 -9
  59. package/types/DataChannel/DataChannelLatencyTestController.d.ts +1 -1
  60. package/types/Inputs/GamepadController.d.ts +22 -46
  61. package/types/Inputs/GamepadTypes.d.ts +7 -0
  62. package/types/Inputs/IInputController.d.ts +16 -0
  63. package/types/Inputs/InputClassesFactory.d.ts +7 -8
  64. package/types/Inputs/KeyCodes.d.ts +5 -0
  65. package/types/Inputs/KeyboardController.d.ts +17 -45
  66. package/types/Inputs/MouseController.d.ts +33 -68
  67. package/types/Inputs/MouseControllerHovering.d.ts +26 -0
  68. package/types/Inputs/MouseControllerLocked.d.ts +31 -0
  69. package/types/Inputs/TouchController.d.ts +19 -44
  70. package/types/Inputs/TouchControllerFake.d.ts +29 -0
  71. package/types/Inputs/XRGamepadController.d.ts +0 -7
  72. package/types/PeerConnectionController/PeerConnectionController.d.ts +4 -1
  73. package/types/PixelStreaming/PixelStreaming.d.ts +14 -2
  74. package/types/UI/OnScreenKeyboard.d.ts +2 -2
  75. package/types/Util/EventEmitter.d.ts +1 -1
  76. package/types/Util/IURLSearchParams.d.ts +9 -0
  77. package/types/Util/InputCoordTranslator.d.ts +29 -0
  78. package/types/VideoPlayer/StreamController.d.ts +0 -2
  79. package/types/WebRtcPlayer/WebRtcPlayerController.d.ts +19 -17
  80. package/types/pixelstreamingfrontend.d.ts +1 -1
  81. package/src/Inputs/FakeTouchController.ts +0 -199
  82. package/src/Inputs/HoveringMouseEvents.ts +0 -192
  83. package/src/Inputs/IMouseEvents.ts +0 -64
  84. package/src/Inputs/ITouchController.ts +0 -29
  85. package/src/Inputs/LockedMouseEvents.ts +0 -287
  86. package/src/Util/CoordinateConverter.ts +0 -290
  87. package/src/Util/EventListenerTracker.ts +0 -29
  88. package/types/Inputs/FakeTouchController.d.ts +0 -61
  89. package/types/Inputs/HoveringMouseEvents.d.ts +0 -56
  90. package/types/Inputs/IMouseEvents.d.ts +0 -53
  91. package/types/Inputs/ITouchController.d.ts +0 -24
  92. package/types/Inputs/LockedMouseEvents.d.ts +0 -80
  93. package/types/Util/CoordinateConverter.d.ts +0 -100
  94. package/types/Util/EventListenerTracker.d.ts +0 -14
@@ -1,249 +1,91 @@
1
- // Copyright Epic Games, Inc. All Rights Reserved.
2
-
3
1
  import { MouseButtonsMask, MouseButton } from './MouseButtons';
4
- import { Logger } from '@epicgames-ps/lib-pixelstreamingcommon-ue5.5';
5
2
  import { StreamMessageController } from '../UeInstanceMessage/StreamMessageController';
6
- import { CoordinateConverter } from '../Util/CoordinateConverter';
3
+ import { InputCoordTranslator } from '../Util/InputCoordTranslator';
7
4
  import { VideoPlayer } from '../VideoPlayer/VideoPlayer';
8
- import { IMouseEvents } from './IMouseEvents';
9
- import { LockedMouseEvents } from './LockedMouseEvents';
10
- import { HoveringMouseEvents } from './HoveringMouseEvents';
11
5
  import type { ActiveKeys } from './InputClassesFactory';
12
- import { EventListenerTracker } from '../Util/EventListenerTracker';
6
+ import { IInputController } from './IInputController';
13
7
 
14
8
  /**
15
- * Handles the Mouse Inputs for the document
9
+ * Extra types for Document and WheelEvent
16
10
  */
17
- export class MouseController {
18
- videoElementProvider: VideoPlayer;
19
- toStreamerMessagesProvider: StreamMessageController;
20
- coordinateConverter: CoordinateConverter;
21
- activeKeysProvider: ActiveKeys;
22
-
23
- // Utility for keeping track of event handlers and to unregister them.
24
- private mouseEventListenerTracker = new EventListenerTracker();
25
-
26
- /**
27
- * @param toStreamerMessagesProvider - Stream message instance
28
- * @param videoElementProvider - Video Player instance
29
- * @param normalizeAndQuantize - A normalize and quantize instance
30
- */
31
- constructor(
32
- toStreamerMessagesProvider: StreamMessageController,
33
- videoElementProvider: VideoPlayer,
34
- coordinateConverter: CoordinateConverter,
35
- activeKeysProvider: ActiveKeys
36
- ) {
37
- this.toStreamerMessagesProvider = toStreamerMessagesProvider;
38
- this.coordinateConverter = coordinateConverter;
39
- this.videoElementProvider = videoElementProvider;
40
- this.activeKeysProvider = activeKeysProvider;
41
- this.registerMouseEnterAndLeaveEvents();
11
+ declare global {
12
+ interface Document {
13
+ mozPointerLockElement: unknown;
14
+ mozExitPointerLock?(): void;
42
15
  }
43
16
 
44
- /**
45
- * Clears all the click events on the current video element parent div
46
- */
47
- unregisterMouseEvents() {
48
- this.mouseEventListenerTracker.unregisterAll();
17
+ interface WheelEvent {
18
+ wheelDelta: number;
49
19
  }
20
+ }
50
21
 
51
- /**
52
- * Register a locked mouse class
53
- * @param mouseController - a mouse controller instance
54
- * @param playerStyleAttributesProvider - a player style attributes instance
55
- */
56
- registerLockedMouseEvents(mouseController: MouseController) {
57
- const videoElementParent =
58
- this.videoElementProvider.getVideoParentElement() as HTMLDivElement;
59
- const lockedMouseEvents: IMouseEvents = new LockedMouseEvents(
60
- this.videoElementProvider,
61
- mouseController,
62
- this.activeKeysProvider
63
- );
64
-
65
- videoElementParent.requestPointerLock =
66
- videoElementParent.requestPointerLock ||
67
- videoElementParent.mozRequestPointerLock;
68
- document.exitPointerLock =
69
- document.exitPointerLock || document.mozExitPointerLock;
70
-
71
- // minor hack to alleviate ios not supporting pointerlock
72
- if (videoElementParent.requestPointerLock) {
73
- const onclick = () => {
74
- videoElementParent.requestPointerLock();
75
- };
76
- videoElementParent.addEventListener('click', onclick);
77
- this.mouseEventListenerTracker.addUnregisterCallback(
78
- () => videoElementParent.removeEventListener('click', onclick)
79
- );
80
- }
22
+ /**
23
+ * The base class for mouse controllers. Since there is a bunch of shared behaviour between locked and
24
+ * hover mouse controllers this is where that shared behaviour lives.
25
+ */
26
+ export class MouseController implements IInputController {
27
+ videoPlayer: VideoPlayer;
28
+ streamMessageController: StreamMessageController;
29
+ coordinateConverter: InputCoordTranslator;
30
+ activeKeys: ActiveKeys;
81
31
 
82
- const lockStateChangeListener = () =>
83
- lockedMouseEvents.lockStateChange();
84
- document.addEventListener(
85
- 'pointerlockchange',
86
- lockStateChangeListener,
87
- false
88
- );
89
- document.addEventListener(
90
- 'mozpointerlockchange',
91
- lockStateChangeListener,
92
- false
93
- );
94
- this.mouseEventListenerTracker.addUnregisterCallback(
95
- () => document.removeEventListener(
96
- 'pointerlockchange',
97
- lockStateChangeListener,
98
- false
99
- )
100
- );
101
- this.mouseEventListenerTracker.addUnregisterCallback(
102
- () => document.removeEventListener(
103
- 'mozpointerlockchange',
104
- lockStateChangeListener,
105
- false
106
- )
107
- );
32
+ // bound listeners
33
+ onEnterListener: (event: MouseEvent) => void;
34
+ onLeaveListener: (event: MouseEvent) => void;
108
35
 
109
- const onmousedown = (mouseEvent: MouseEvent) =>
110
- lockedMouseEvents.handleMouseDown(mouseEvent);
111
- const onmouseup = (mouseEvent: MouseEvent) =>
112
- lockedMouseEvents.handleMouseUp(mouseEvent);
113
- const onwheel = (wheelEvent: WheelEvent) =>
114
- lockedMouseEvents.handleMouseWheel(wheelEvent);
115
- const ondblclick = (mouseEvent: MouseEvent) =>
116
- lockedMouseEvents.handleMouseDouble(mouseEvent);
117
- videoElementParent.addEventListener('mousedown', onmousedown);
118
- videoElementParent.addEventListener('mouseup', onmouseup);
119
- videoElementParent.addEventListener('wheel', onwheel);
120
- videoElementParent.addEventListener('dblclick', ondblclick);
36
+ constructor(
37
+ streamMessageController: StreamMessageController,
38
+ videoPlayer: VideoPlayer,
39
+ coordinateConverter: InputCoordTranslator,
40
+ activeKeys: ActiveKeys
41
+ ) {
42
+ this.streamMessageController = streamMessageController;
43
+ this.coordinateConverter = coordinateConverter;
44
+ this.videoPlayer = videoPlayer;
45
+ this.activeKeys = activeKeys;
121
46
 
122
- this.mouseEventListenerTracker.addUnregisterCallback(
123
- () => videoElementParent.removeEventListener('mousedown', onmousedown)
124
- );
125
- this.mouseEventListenerTracker.addUnregisterCallback(
126
- () => videoElementParent.removeEventListener('mouseup', onmouseup)
127
- );
128
- this.mouseEventListenerTracker.addUnregisterCallback(
129
- () => videoElementParent.removeEventListener('wheel', onwheel)
130
- );
131
- this.mouseEventListenerTracker.addUnregisterCallback(
132
- () => videoElementParent.removeEventListener('dblclick', ondblclick)
133
- );
134
- this.mouseEventListenerTracker.addUnregisterCallback(
135
- () => lockedMouseEvents.unregisterMouseEvents()
136
- );
137
- this.mouseEventListenerTracker.addUnregisterCallback(() => {
138
- if (
139
- document.exitPointerLock &&
140
- (document.pointerLockElement === videoElementParent ||
141
- document.mozPointerLockElement === videoElementParent)
142
- ) {
143
- document.exitPointerLock();
144
- }
145
- });
47
+ this.onEnterListener = this.onMouseEnter.bind(this);
48
+ this.onLeaveListener = this.onMouseLeave.bind(this);
146
49
  }
147
50
 
148
- /**
149
- * Register a hovering mouse class
150
- * @param mouseController - A mouse controller object
151
- */
152
- registerHoveringMouseEvents(mouseController: MouseController) {
153
- const videoElementParent =
154
- this.videoElementProvider.getVideoParentElement() as HTMLDivElement;
155
- const hoveringMouseEvents = new HoveringMouseEvents(mouseController);
156
-
157
- const onmousemove = (mouseEvent: MouseEvent) =>
158
- hoveringMouseEvents.updateMouseMovePosition(mouseEvent);
159
- const onmousedown = (mouseEvent: MouseEvent) =>
160
- hoveringMouseEvents.handleMouseDown(mouseEvent);
161
- const onmouseup = (mouseEvent: MouseEvent) =>
162
- hoveringMouseEvents.handleMouseUp(mouseEvent);
163
- const oncontextmenu = (mouseEvent: MouseEvent) =>
164
- hoveringMouseEvents.handleContextMenu(mouseEvent);
165
- const onwheel = (wheelEvent: WheelEvent) =>
166
- hoveringMouseEvents.handleMouseWheel(wheelEvent);
167
- const ondblclick = (mouseEvent: MouseEvent) =>
168
- hoveringMouseEvents.handleMouseDouble(mouseEvent);
169
- videoElementParent.addEventListener('mousemove', onmousemove);
170
- videoElementParent.addEventListener('mousedown', onmousedown);
171
- videoElementParent.addEventListener('mouseup', onmouseup);
172
- videoElementParent.addEventListener('contextmenu', oncontextmenu);
173
- videoElementParent.addEventListener('wheel', onwheel);
174
- videoElementParent.addEventListener('dblclick', ondblclick);
51
+ register() {
52
+ this.registerMouseEnterAndLeaveEvents();
53
+ }
175
54
 
176
- this.mouseEventListenerTracker.addUnregisterCallback(
177
- () => videoElementParent.removeEventListener('mousemove', onmousemove)
178
- );
179
- this.mouseEventListenerTracker.addUnregisterCallback(
180
- () => videoElementParent.removeEventListener('mousedown', onmousedown)
181
- );
182
- this.mouseEventListenerTracker.addUnregisterCallback(
183
- () => videoElementParent.removeEventListener('mouseup', onmouseup)
184
- );
185
- this.mouseEventListenerTracker.addUnregisterCallback(
186
- () => videoElementParent.removeEventListener('contextmenu', oncontextmenu)
187
- );
188
- this.mouseEventListenerTracker.addUnregisterCallback(
189
- () => videoElementParent.removeEventListener('wheel', onwheel)
190
- );
191
- this.mouseEventListenerTracker.addUnregisterCallback(
192
- () => videoElementParent.removeEventListener('dblclick', ondblclick)
193
- );
194
- this.mouseEventListenerTracker.addUnregisterCallback(
195
- () => hoveringMouseEvents.unregisterMouseEvents()
196
- );
55
+ unregister() {
56
+ this.unregisterMouseEnterAndLeaveEvents();
197
57
  }
198
58
 
199
- /**
200
- * Set the mouse enter and mouse leave events
201
- */
202
59
  registerMouseEnterAndLeaveEvents() {
203
- const videoElementParent =
204
- this.videoElementProvider.getVideoParentElement() as HTMLDivElement;
60
+ const videoElementParent = this.videoPlayer.getVideoParentElement() as HTMLDivElement;
61
+ videoElementParent.addEventListener('mouseenter', this.onEnterListener);
62
+ videoElementParent.addEventListener('mouseleave', this.onLeaveListener);
63
+ }
205
64
 
206
- // Handle when the Mouse has entered the element
207
- const onmouseenter = (event: MouseEvent) => {
208
- if (!this.videoElementProvider.isVideoReady()) {
209
- return;
210
- }
211
- Logger.Log(Logger.GetStackTrace(), 'Mouse Entered', 6);
212
- this.sendMouseEnter();
213
- this.pressMouseButtons(event.buttons, event.x, event.y);
214
- };
65
+ unregisterMouseEnterAndLeaveEvents() {
66
+ const videoElementParent = this.videoPlayer.getVideoParentElement() as HTMLDivElement;
67
+ videoElementParent.removeEventListener('mouseenter', this.onEnterListener);
68
+ videoElementParent.removeEventListener('mouseleave', this.onLeaveListener);
69
+ }
215
70
 
216
- // Handles when the mouse has left the element
217
- const onmouseleave = (event: MouseEvent) => {
218
- if (!this.videoElementProvider.isVideoReady()) {
219
- return;
220
- }
221
- Logger.Log(Logger.GetStackTrace(), 'Mouse Left', 6);
222
- this.sendMouseLeave();
223
- this.releaseMouseButtons(event.buttons, event.x, event.y);
224
- };
225
- videoElementParent.addEventListener('mouseenter', onmouseenter);
226
- videoElementParent.addEventListener('mouseleave', onmouseleave);
71
+ private onMouseEnter(event: MouseEvent) {
72
+ if (!this.videoPlayer.isVideoReady()) {
73
+ return;
74
+ }
75
+ this.streamMessageController.toStreamerHandlers.get('MouseEnter')();
76
+ this.pressMouseButtons(event.buttons, event.x, event.y);
77
+ }
227
78
 
228
- this.mouseEventListenerTracker.addUnregisterCallback(
229
- () => videoElementParent.removeEventListener('mouseenter', onmouseenter)
230
- );
231
- this.mouseEventListenerTracker.addUnregisterCallback(
232
- () => videoElementParent.removeEventListener('mouseleave', onmouseleave)
233
- );
79
+ private onMouseLeave(event: MouseEvent) {
80
+ if (!this.videoPlayer.isVideoReady()) {
81
+ return;
82
+ }
83
+ this.streamMessageController.toStreamerHandlers.get('MouseLeave')();
84
+ this.releaseMouseButtons(event.buttons, event.x, event.y);
234
85
  }
235
86
 
236
- /**
237
- * Handle when a mouse button is released
238
- * @param buttons - Mouse Button
239
- * @param X - Mouse pointer X coordinate
240
- * @param Y - Mouse pointer Y coordinate
241
- */
242
- releaseMouseButtons(buttons: number, X: number, Y: number) {
243
- const coord = this.coordinateConverter.normalizeAndQuantizeUnsigned(
244
- X,
245
- Y
246
- );
87
+ private releaseMouseButtons(buttons: number, X: number, Y: number) {
88
+ const coord = this.coordinateConverter.translateUnsigned(X, Y);
247
89
  if (buttons & MouseButtonsMask.primaryButton) {
248
90
  this.sendMouseUp(MouseButton.mainButton, coord.x, coord.y);
249
91
  }
@@ -261,20 +103,11 @@ export class MouseController {
261
103
  }
262
104
  }
263
105
 
264
- /**
265
- * Handle when a mouse button is pressed
266
- * @param buttons - Mouse Button
267
- * @param X - Mouse pointer X coordinate
268
- * @param Y - Mouse pointer Y coordinate
269
- */
270
- pressMouseButtons(buttons: number, X: number, Y: number) {
271
- if (!this.videoElementProvider.isVideoReady()) {
106
+ private pressMouseButtons(buttons: number, X: number, Y: number) {
107
+ if (!this.videoPlayer.isVideoReady()) {
272
108
  return;
273
109
  }
274
- const coord = this.coordinateConverter.normalizeAndQuantizeUnsigned(
275
- X,
276
- Y
277
- );
110
+ const coord = this.coordinateConverter.translateUnsigned(X, Y);
278
111
  if (buttons & MouseButtonsMask.primaryButton) {
279
112
  this.sendMouseDown(MouseButton.mainButton, coord.x, coord.y);
280
113
  }
@@ -292,71 +125,12 @@ export class MouseController {
292
125
  }
293
126
  }
294
127
 
295
- /**
296
- * Handles mouse enter
297
- */
298
- sendMouseEnter() {
299
- if (!this.videoElementProvider.isVideoReady()) {
300
- return;
301
- }
302
- const toStreamerHandlers =
303
- this.toStreamerMessagesProvider.toStreamerHandlers;
304
- toStreamerHandlers.get('MouseEnter')();
128
+ private sendMouseDown(button: number, X: number, Y: number) {
129
+ this.streamMessageController.toStreamerHandlers.get('MouseDown')?.([button, X, Y]);
305
130
  }
306
131
 
307
- /**
308
- * Handles mouse Leave
309
- */
310
- sendMouseLeave() {
311
- if (!this.videoElementProvider.isVideoReady()) {
312
- return;
313
- }
314
- const toStreamerHandlers =
315
- this.toStreamerMessagesProvider.toStreamerHandlers;
316
- toStreamerHandlers.get('MouseLeave')();
317
- }
318
-
319
- /**
320
- * Handles when a mouse button is pressed down
321
- * @param button - Mouse Button Pressed
322
- * @param X - Mouse X Coordinate
323
- * @param Y - Mouse Y Coordinate
324
- */
325
- sendMouseDown(button: number, X: number, Y: number) {
326
- if (!this.videoElementProvider.isVideoReady()) {
327
- return;
328
- }
329
- Logger.Log(
330
- Logger.GetStackTrace(),
331
- `mouse button ${button} down at (${X}, ${Y})`,
332
- 6
333
- );
334
- const toStreamerHandlers =
335
- this.toStreamerMessagesProvider.toStreamerHandlers;
336
- toStreamerHandlers.get('MouseDown')([button, X, Y]);
337
- }
338
-
339
- /**
340
- * Handles when a mouse button is pressed up
341
- * @param button - Mouse Button Pressed
342
- * @param X - Mouse X Coordinate
343
- * @param Y - Mouse Y Coordinate
344
- */
345
- sendMouseUp(button: number, X: number, Y: number) {
346
- if (!this.videoElementProvider.isVideoReady()) {
347
- return;
348
- }
349
- Logger.Log(
350
- Logger.GetStackTrace(),
351
- `mouse button ${button} up at (${X}, ${Y})`,
352
- 6
353
- );
354
- const coord = this.coordinateConverter.normalizeAndQuantizeUnsigned(
355
- X,
356
- Y
357
- );
358
- const toStreamerHandlers =
359
- this.toStreamerMessagesProvider.toStreamerHandlers;
360
- toStreamerHandlers.get('MouseUp')([button, coord.x, coord.y]);
132
+ private sendMouseUp(button: number, X: number, Y: number) {
133
+ const coord = this.coordinateConverter.translateUnsigned(X, Y);
134
+ this.streamMessageController.toStreamerHandlers.get('MouseUp')?.([button, coord.x, coord.y]);
361
135
  }
362
136
  }
@@ -0,0 +1,118 @@
1
+ import { StreamMessageController } from '../UeInstanceMessage/StreamMessageController';
2
+ import { InputCoordTranslator } from '../Util/InputCoordTranslator';
3
+ import { VideoPlayer } from '../VideoPlayer/VideoPlayer';
4
+ import type { ActiveKeys } from './InputClassesFactory';
5
+ import { MouseController } from './MouseController';
6
+
7
+ /**
8
+ * A mouse controller that allows the mouse to freely float over the video document.
9
+ */
10
+ export class MouseControllerHovering extends MouseController {
11
+ videoElementParent: HTMLDivElement;
12
+
13
+ onMouseUpListener: (event: MouseEvent) => void;
14
+ onMouseDownListener: (event: MouseEvent) => void;
15
+ onMouseDblClickListener: (event: MouseEvent) => void;
16
+ onMouseWheelListener: (event: WheelEvent) => void;
17
+ onMouseMoveListener: (event: MouseEvent) => void;
18
+ onContextMenuListener: (event: MouseEvent) => void;
19
+
20
+ constructor(
21
+ streamMessageController: StreamMessageController,
22
+ videoPlayer: VideoPlayer,
23
+ coordinateConverter: InputCoordTranslator,
24
+ activeKeys: ActiveKeys
25
+ ) {
26
+ super(streamMessageController, videoPlayer, coordinateConverter, activeKeys);
27
+ this.videoElementParent = videoPlayer.getVideoParentElement() as HTMLDivElement;
28
+ this.onMouseUpListener = this.onMouseUp.bind(this);
29
+ this.onMouseDownListener = this.onMouseDown.bind(this);
30
+ this.onMouseDblClickListener = this.onMouseDblClick.bind(this);
31
+ this.onMouseWheelListener = this.onMouseWheel.bind(this);
32
+ this.onMouseMoveListener = this.onMouseMove.bind(this);
33
+ this.onContextMenuListener = this.onContextMenu.bind(this);
34
+ }
35
+
36
+ register(): void {
37
+ super.register();
38
+
39
+ this.videoElementParent.addEventListener('mousemove', this.onMouseMoveListener);
40
+ this.videoElementParent.addEventListener('mousedown', this.onMouseDownListener);
41
+ this.videoElementParent.addEventListener('mouseup', this.onMouseUpListener);
42
+ this.videoElementParent.addEventListener('contextmenu', this.onContextMenuListener);
43
+ this.videoElementParent.addEventListener('wheel', this.onMouseWheelListener);
44
+ this.videoElementParent.addEventListener('dblclick', this.onMouseDblClickListener);
45
+ }
46
+
47
+ unregister(): void {
48
+ this.videoElementParent.removeEventListener('mousemove', this.onMouseMoveListener);
49
+ this.videoElementParent.removeEventListener('mousedown', this.onMouseDownListener);
50
+ this.videoElementParent.removeEventListener('mouseup', this.onMouseUpListener);
51
+ this.videoElementParent.removeEventListener('contextmenu', this.onContextMenuListener);
52
+ this.videoElementParent.removeEventListener('wheel', this.onMouseWheelListener);
53
+ this.videoElementParent.removeEventListener('dblclick', this.onMouseDblClickListener);
54
+
55
+ super.unregister();
56
+ }
57
+
58
+ private onMouseDown(event: MouseEvent) {
59
+ if (!this.videoPlayer.isVideoReady()) {
60
+ return;
61
+ }
62
+ const coord = this.coordinateConverter.translateUnsigned(event.offsetX, event.offsetY);
63
+ this.streamMessageController.toStreamerHandlers.get('MouseDown')([event.button, coord.x, coord.y]);
64
+ event.preventDefault();
65
+ }
66
+
67
+ private onMouseUp(event: MouseEvent) {
68
+ if (!this.videoPlayer.isVideoReady()) {
69
+ return;
70
+ }
71
+ const coord = this.coordinateConverter.translateUnsigned(event.offsetX, event.offsetY);
72
+ this.streamMessageController.toStreamerHandlers.get('MouseUp')([event.button, coord.x, coord.y]);
73
+ event.preventDefault();
74
+ }
75
+
76
+ private onContextMenu(event: MouseEvent) {
77
+ if (!this.videoPlayer.isVideoReady()) {
78
+ return;
79
+ }
80
+ event.preventDefault();
81
+ }
82
+
83
+ private onMouseMove(event: MouseEvent) {
84
+ if (!this.videoPlayer.isVideoReady()) {
85
+ return;
86
+ }
87
+ const coord = this.coordinateConverter.translateUnsigned(event.offsetX, event.offsetY);
88
+ const delta = this.coordinateConverter.translateSigned(event.movementX, event.movementY);
89
+ this.streamMessageController.toStreamerHandlers.get('MouseMove')([
90
+ coord.x,
91
+ coord.y,
92
+ delta.x,
93
+ delta.y
94
+ ]);
95
+ event.preventDefault();
96
+ }
97
+
98
+ private onMouseWheel(event: WheelEvent) {
99
+ if (!this.videoPlayer.isVideoReady()) {
100
+ return;
101
+ }
102
+ const coord = this.coordinateConverter.translateUnsigned(event.offsetX, event.offsetY);
103
+ this.streamMessageController.toStreamerHandlers.get('MouseWheel')([
104
+ event.wheelDelta,
105
+ coord.x,
106
+ coord.y
107
+ ]);
108
+ event.preventDefault();
109
+ }
110
+
111
+ private onMouseDblClick(event: MouseEvent) {
112
+ if (!this.videoPlayer.isVideoReady()) {
113
+ return;
114
+ }
115
+ const coord = this.coordinateConverter.translateUnsigned(event.offsetX, event.offsetY);
116
+ this.streamMessageController.toStreamerHandlers.get('MouseDouble')([event.button, coord.x, coord.y]);
117
+ }
118
+ }