@@ -300,13 +300,59 @@ export const initGamepad = () => {
300
300
}
301
301
}
302
302
303
+ /**
304
+ * Returns true, if the vendor ID is from valve, else false.
305
+ *
306
+ * @param gamepad
307
+ */
308
+ function isValveGamepad ( gamepad : Gamepad | null ) {
309
+ return gamepad && gamepad . id . includes ( 'Vendor: 28de' )
310
+ }
311
+
312
+ /**
313
+ * Returns gamepads that are from valve
314
+ * - virtual gamepads through Steam Input
315
+ * - real gamepads like Steam Deck or Steam Controller
316
+ *
317
+ * @param gamepads
318
+ */
319
+ function filterValveGamepads ( gamepads : ( Gamepad | null ) [ ] ) {
320
+ return gamepads . filter ( isValveGamepad )
321
+ }
322
+
323
+ /**
324
+ * Returns true, if the gamepad is masked through Steam Input.
325
+ * Checks if the timestamp of the gamepad is nearly identical of one of the valve gamepads.
326
+ * There is a threshold of 10, because the timestamps differ from time to time.
327
+ *
328
+ * Attention: Without filtering masked gamepads, you have 2 button presses at the same time.
329
+ *
330
+ * @param valveGamepads
331
+ * @param gamepad
332
+ */
333
+ function isMaskedGamepad (
334
+ valveGamepads : ( Gamepad | null ) [ ] ,
335
+ gamepad : Gamepad
336
+ ) {
337
+ return valveGamepads . find (
338
+ ( valveGamepad ) =>
339
+ valveGamepad &&
340
+ Math . abs ( valveGamepad . timestamp - gamepad . timestamp ) <= 10
341
+ )
342
+ }
343
+
344
+ function isValidGamepad ( gamepads : ( Gamepad | null ) [ ] , gamepad : Gamepad ) {
345
+ const valveGamepads = filterValveGamepads ( gamepads )
346
+ return isValveGamepad ( gamepad ) || ! isMaskedGamepad ( valveGamepads , gamepad )
347
+ }
348
+
303
349
// check all the buttons and axes every frame
304
350
function updateStatus ( ) {
305
351
const gamepads = navigator . getGamepads ( )
306
352
307
353
controllers . forEach ( ( index ) => {
308
354
const controller = gamepads [ index ]
309
- if ( ! controller ) return
355
+ if ( ! controller || ! isValidGamepad ( gamepads , controller ) ) return
310
356
311
357
// logState(index)
312
358
0 commit comments