@forgeax/engine-input 0.1.32 → 0.1.34
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.
- package/dist/browser-backend.d.ts.map +1 -1
- package/dist/canvas-input-boundary.d.ts.map +1 -1
- package/dist/composite-backend.d.ts.map +1 -1
- package/dist/index.mjs +295 -235
- package/dist/index.mjs.map +1 -1
- package/dist/input-snapshot.d.ts +6 -0
- package/dist/input-snapshot.d.ts.map +1 -1
- package/package.json +3 -3
- package/src/__tests__/browser-backend-edge-latch.test.ts +12 -0
- package/src/browser-backend.ts +31 -1
- package/src/canvas-input-boundary.ts +9 -0
- package/src/composite-backend.ts +36 -6
- package/src/input-snapshot.ts +6 -0
package/dist/input-snapshot.d.ts
CHANGED
|
@@ -333,6 +333,12 @@ export interface InputBackend {
|
|
|
333
333
|
* Optional -- backends without pointer-lock support omit this method.
|
|
334
334
|
*/
|
|
335
335
|
setPointerLockAllowed?(allowed: boolean): void;
|
|
336
|
+
/**
|
|
337
|
+
* Gate physical/synthetic acquisition for a host lifecycle boundary. A
|
|
338
|
+
* closed gate clears producer state and makes subsequent samples empty until
|
|
339
|
+
* the gate is reopened; it is independent of pointer-lock policy.
|
|
340
|
+
*/
|
|
341
|
+
setInputAllowed?(allowed: boolean): void;
|
|
336
342
|
/**
|
|
337
343
|
* Atomically discard acquired state without detaching listeners. A host calls
|
|
338
344
|
* this when it revokes a control lease so held keys/buttons, contacts, frame
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"input-snapshot.d.ts","sourceRoot":"","sources":["../src/input-snapshot.ts"],"names":[],"mappings":"AAsBA,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAElF,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAOvE,MAAM,MAAM,WAAW,GAAG,OAAO,GAAG,KAAK,GAAG,OAAO,CAAC;AAEpD,wEAAwE;AACxE,MAAM,MAAM,kBAAkB,GAC1B,CAAC,GACD,CAAC,GACD,CAAC,GACD,CAAC,GACD,CAAC,GACD,CAAC,GACD,CAAC,GACD,CAAC,GACD,CAAC,GACD,CAAC,GACD,EAAE,GACF,EAAE,GACF,EAAE,GACF,EAAE,GACF,EAAE,GACF,EAAE,GACF,EAAE,CAAC;AAEP,qEAAqE;AACrE,MAAM,MAAM,gBAAgB,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AAE7C,yEAAyE;AACzE,MAAM,MAAM,gBAAgB,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AAEzC,0DAA0D;AAC1D,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB;;;;;;;;;;OAUG;IACH,QAAQ,CAAC,eAAe,EAAE,OAAO,CAAC;IAClC,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IACtC,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAC1C,QAAQ,CAAC,YAAY,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAC3C,QAAQ,CAAC,YAAY,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACnD,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;CAC1D;AAED;;;;;;GAMG;AACH,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAC;IAClC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,KAAK,EAAE;QAAE,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAC5D;AAED,8EAA8E;AAC9E,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,GAAG,QAAQ,CAAC;IAClD,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAC;CACnC;AAED,iFAAiF;AACjF,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;GAMG;AACH,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,OAAO,GAAG,UAAU,CAAC;IACpC,4EAA4E;IAC5E,QAAQ,CAAC,MAAM,EAAE;QACf,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;QACnB,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;QACnB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;QACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;KACzB,CAAC;IACF,wEAAwE;IACxE,QAAQ,CAAC,MAAM,CAAC,EAAE;QAAE,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,SAAS,CAAC;IACzE,qFAAqF;IACrF,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,yEAAyE;IACzE,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B;AAED,2DAA2D;AAC3D,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;CAC3B;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,aAAa;IAC5B,mDAAmD;IACnD,QAAQ,CAAC,QAAQ,EAAE;QACjB;;;;;WAKG;QACH,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;QAC3B,8DAA8D;QAC9D,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;QAClC;;;;WAIG;QACH,EAAE,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;QACzB,wEAAwE;QACxE,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;QAChC,4CAA4C;QAC5C,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;QACvC,mCAAmC;QACnC,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;KAC/B,CAAC;IACF,+FAA+F;IAC/F,QAAQ,CAAC,KAAK,EAAE;QACd;;;;WAIG;QACH,QAAQ,CAAC,QAAQ,EAAE;YAAE,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;YAAC,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAA;SAAE,GAAG,SAAS,CAAC;QAC1E;;;;;WAKG;QACH,QAAQ,CAAC,aAAa,EAAE;YAAE,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;YAAC,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC;QACnE;;;;;;;WAOG;QACH,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAC;QAChC;;;;;;;;;WASG;QACH,MAAM,CAAC,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC;QACrC,mEAAmE;QACnE,WAAW,CAAC,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC;QAC1C,4DAA4D;QAC5D,YAAY,CAAC,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC;QAC3C;;;;;;;;;;;;;;;;WAgBG;QACH,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;KAC7B,CAAC;IACF;;;;;;;OAOG;IACH,OAAO,CAAC,CAAC,EAAE,MAAM,GAAG;QAClB,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;QAC5B,QAAQ,CAAC,eAAe,EAAE,OAAO,CAAC;QAClC,MAAM,CAAC,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC;QACvC,WAAW,CAAC,CAAC,EAAE,kBAAkB,GAAG,MAAM,CAAC;QAC3C,WAAW,CAAC,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC;QAC5C,YAAY,CAAC,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC;QAC7C,IAAI,CAAC,CAAC,EAAE,gBAAgB,GAAG,MAAM,CAAC;KACnC,CAAC;IACF;;;;OAIG;IACH,QAAQ,CAAC,YAAY,EAAE,YAAY,CAAC;IACpC;;;;OAIG;IACH,OAAO,CACL,EAAE,EAAE,MAAM,GACT,aAAa,GAAG;QAAE,QAAQ,CAAC,KAAK,EAAE;YAAE,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;YAAC,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAA;SAAE,CAAA;KAAE,CAAC;IAClF;;;;OAIG;IACH,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG;QAAE,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACtE;;;;OAIG;IACH,QAAQ,CAAC,aAAa,EAAE,SAAS,iBAAiB,EAAE,CAAC;IACrD;;;;;;;OAOG;IACH,QAAQ,CAAC,OAAO,EAAE,YAAY,CAAC;IAC/B;;;;;;OAMG;IACH,QAAQ,CAAC,aAAa,EAAE,SAAS,YAAY,EAAE,CAAC;IAChD;;;;;;;OAOG;IACH,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG;QACpB,QAAQ,CAAC,SAAS,EAAE,MAAM,OAAO,CAAC;QAClC,QAAQ,CAAC,WAAW,EAAE,MAAM,OAAO,CAAC;QACpC,QAAQ,CAAC,YAAY,EAAE,MAAM,OAAO,CAAC;QACrC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;KAC3B,CAAC;IACF;;;;;;;;;OASG;IACH,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC;IAC1C;;;;;;;;;;;OAWG;IACH,SAAS,CACP,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,IAAI,CAAC,EAAE,gBAAgB,GACtB;QAAE,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAC/C;AAED;;;;GAIG;AACH,MAAM,WAAW,YAAY;IAC3B;;;;;;;;;;;;;;;;OAgBG;IACH,MAAM,IAAI,kBAAkB,CAAC;IAC7B;;;;;;;;OAQG;IACH,qBAAqB,CAAC,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAAC;IAC/C;;;;;OAKG;IACH,KAAK,CAAC,IAAI,IAAI,CAAC;IACf,+DAA+D;IAC/D,MAAM,IAAI,IAAI,CAAC;CAChB;AAED,gEAAgE;AAChE,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,QAAQ,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IACvC,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IACrC,6EAA6E;IAC7E,QAAQ,CAAC,SAAS,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IACzC,yEAAyE;IACzE,QAAQ,CAAC,OAAO,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IACvC,2EAA2E;IAC3E,QAAQ,CAAC,WAAW,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAC3C,6EAA6E;IAC7E,QAAQ,CAAC,YAAY,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAC5C,QAAQ,CAAC,OAAO,EAAE,SAAS,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IACvD,4EAA4E;IAC5E,QAAQ,CAAC,cAAc,CAAC,EAAE,SAAS,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IAC/D,8EAA8E;IAC9E,QAAQ,CAAC,eAAe,CAAC,EAAE,SAAS,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IAChE,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,2EAA2E;IAC3E,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB;;;;;OAKG;IACH,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,+DAA+D;IAC/D,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO,CAAC;IAC9B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,8FAA8F;IAC9F,QAAQ,CAAC,QAAQ,CAAC,EAAE,SAAS,iBAAiB,EAAE,CAAC;IACjD,8EAA8E;IAC9E,QAAQ,CAAC,YAAY,CAAC,EAAE,YAAY,CAAC;IACrC,kFAAkF;IAClF,QAAQ,CAAC,QAAQ,CAAC,EAAE,SAAS,aAAa,EAAE,CAAC;IAC7C,2FAA2F;IAC3F,QAAQ,CAAC,aAAa,CAAC,EAAE,SAAS,iBAAiB,EAAE,CAAC;IACtD,kGAAkG;IAClG,QAAQ,CAAC,WAAW,CAAC,EAAE,SAAS,iBAAiB,EAAE,CAAC;IACpD,mFAAmF;IACnF,QAAQ,CAAC,QAAQ,CAAC,EAAE,YAAY,CAAC;IACjC,+FAA+F;IAC/F,QAAQ,CAAC,aAAa,CAAC,EAAE,SAAS,YAAY,EAAE,CAAC;IACjD;;;;;OAKG;IACH,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAC;CACjC;AAED,kFAAkF;AAClF,wBAAgB,6BAA6B,IAAI,kBAAkB,CAWlE;AAiED;;;;;;;;;GASG;AACH,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,kBAAkB,EAC1B,YAAY,CAAC,EAAE,SAAS,WAAW,EAAE,EACrC,QAAQ,CAAC,EAAE,SAAS,YAAY,EAAE,EAClC,gBAAgB,CAAC,EAAE,aAAa,GAC/B,aAAa,CA4Lf;AAED;;;GAGG;AACH,wBAAgB,2BAA2B,CACzC,IAAI,EAAE,aAAa,GAClB,SAAS,WAAW,EAAE,GAAG,SAAS,CAEpC;AAED;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,IAAI,aAAa,CAEnD;AAED,4EAA4E;AAC5E,eAAO,MAAM,2BAA2B,kBAAkB,CAAC"}
|
|
1
|
+
{"version":3,"file":"input-snapshot.d.ts","sourceRoot":"","sources":["../src/input-snapshot.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@forgeax/engine-input",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.34",
|
|
4
4
|
"private": false,
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "Apache-2.0",
|
|
@@ -31,8 +31,8 @@
|
|
|
31
31
|
"LICENSE"
|
|
32
32
|
],
|
|
33
33
|
"dependencies": {
|
|
34
|
-
"@forgeax/engine-ecs": "0.1.
|
|
35
|
-
"@forgeax/engine-plugin": "0.1.
|
|
34
|
+
"@forgeax/engine-ecs": "0.1.34",
|
|
35
|
+
"@forgeax/engine-plugin": "0.1.34"
|
|
36
36
|
},
|
|
37
37
|
"forgeax": {
|
|
38
38
|
"metrics": {
|
|
@@ -111,6 +111,18 @@ describe('browser input edge latch', () => {
|
|
|
111
111
|
expect(repeated.pressedKeys?.has('w')).toBe(false);
|
|
112
112
|
});
|
|
113
113
|
|
|
114
|
+
it('fences keyboard events across a closed-and-reopened producer gate', () => {
|
|
115
|
+
const env = buildEnvironment();
|
|
116
|
+
env.backend.setInputAllowed?.(false);
|
|
117
|
+
env.fire('window', 'keydown', keyEvent('w', 'KeyW'));
|
|
118
|
+
env.backend.setInputAllowed?.(true);
|
|
119
|
+
|
|
120
|
+
const sample = env.backend.sample();
|
|
121
|
+
expect(sample.downKeys.has('w')).toBe(false);
|
|
122
|
+
expect(sample.pressedKeys?.has('w')).toBe(false);
|
|
123
|
+
expect(sample.downCodes?.has('KeyW')).toBe(false);
|
|
124
|
+
});
|
|
125
|
+
|
|
114
126
|
it('lets snapshot and frame-start scan consume the latched edges exactly once', () => {
|
|
115
127
|
const sample = {
|
|
116
128
|
downKeys: new Set<string>(),
|
package/src/browser-backend.ts
CHANGED
|
@@ -40,6 +40,7 @@ import type {
|
|
|
40
40
|
VirtualAxisSample,
|
|
41
41
|
VirtualJoystickConfig,
|
|
42
42
|
} from './input-snapshot';
|
|
43
|
+
import { createEmptyInputBackendSample } from './input-snapshot';
|
|
43
44
|
import { isUiOwnedEvent } from './ui-ownership';
|
|
44
45
|
import { type BindState, deriveVirtualAxes, handleVirtualJoystickUnbind } from './virtual-joystick';
|
|
45
46
|
|
|
@@ -198,6 +199,10 @@ export function attachBrowserInputBackend(
|
|
|
198
199
|
let providerLocked = false;
|
|
199
200
|
// gameGate is a command-set boolean (setPointerLockAllowed), default true.
|
|
200
201
|
let gameGate = true;
|
|
202
|
+
// Startup overlays and other host lifecycle boundaries gate acquisition at
|
|
203
|
+
// the producer, so events cannot become stale gameplay input at the next
|
|
204
|
+
// frame-start scan.
|
|
205
|
+
let inputAllowed = true;
|
|
201
206
|
|
|
202
207
|
function emitLockError(path: 'w3c' | 'provider', cause: unknown): void {
|
|
203
208
|
try {
|
|
@@ -357,6 +362,7 @@ export function attachBrowserInputBackend(
|
|
|
357
362
|
}
|
|
358
363
|
|
|
359
364
|
function onKeyDown(ev: KeyboardEvent): void {
|
|
365
|
+
if (!inputAllowed) return;
|
|
360
366
|
if (isUiEvent(ev)) {
|
|
361
367
|
clear();
|
|
362
368
|
return;
|
|
@@ -374,6 +380,7 @@ export function attachBrowserInputBackend(
|
|
|
374
380
|
}
|
|
375
381
|
}
|
|
376
382
|
function onKeyUp(ev: KeyboardEvent): void {
|
|
383
|
+
if (!inputAllowed) return;
|
|
377
384
|
if (isUiEvent(ev)) return;
|
|
378
385
|
heldKeys.delete(ev.key);
|
|
379
386
|
if (isFocused()) {
|
|
@@ -385,6 +392,7 @@ export function attachBrowserInputBackend(
|
|
|
385
392
|
}
|
|
386
393
|
}
|
|
387
394
|
function onPointerDown(ev: PointerEvent): void {
|
|
395
|
+
if (!inputAllowed) return;
|
|
388
396
|
if (isUiEvent(ev)) {
|
|
389
397
|
clear();
|
|
390
398
|
return;
|
|
@@ -464,6 +472,7 @@ export function attachBrowserInputBackend(
|
|
|
464
472
|
}
|
|
465
473
|
}
|
|
466
474
|
function onPointerUp(ev: PointerEvent): void {
|
|
475
|
+
if (!inputAllowed) return;
|
|
467
476
|
if (isUiEvent(ev)) return;
|
|
468
477
|
if (ev.pointerType === 'mouse') {
|
|
469
478
|
if (ev.button === 0 || ev.button === 1 || ev.button === 2) {
|
|
@@ -489,6 +498,7 @@ export function attachBrowserInputBackend(
|
|
|
489
498
|
}
|
|
490
499
|
}
|
|
491
500
|
function onPointerMove(ev: PointerEvent): void {
|
|
501
|
+
if (!inputAllowed) return;
|
|
492
502
|
if (isUiEvent(ev)) return;
|
|
493
503
|
// D-3: movementDelta from pointermove (PointerEvent extends MouseEvent).
|
|
494
504
|
if (ev.pointerType === 'mouse') {
|
|
@@ -518,6 +528,7 @@ export function attachBrowserInputBackend(
|
|
|
518
528
|
}
|
|
519
529
|
}
|
|
520
530
|
function onPointerCancel(ev: PointerEvent): void {
|
|
531
|
+
if (!inputAllowed) return;
|
|
521
532
|
if (isUiEvent(ev)) return;
|
|
522
533
|
const entry = pointerMap.get(ev.pointerId);
|
|
523
534
|
if (entry) {
|
|
@@ -542,6 +553,7 @@ export function attachBrowserInputBackend(
|
|
|
542
553
|
}
|
|
543
554
|
}
|
|
544
555
|
function onWheel(ev: WheelEvent): void {
|
|
556
|
+
if (!inputAllowed) return;
|
|
545
557
|
if (isUiEvent(ev)) {
|
|
546
558
|
clear();
|
|
547
559
|
return;
|
|
@@ -666,6 +678,7 @@ export function attachBrowserInputBackend(
|
|
|
666
678
|
}
|
|
667
679
|
|
|
668
680
|
function onCanvasClick(): void {
|
|
681
|
+
if (!inputAllowed) return;
|
|
669
682
|
// D-3: dual gate synthesis -- gameGate (command-set by template) AND
|
|
670
683
|
// hostPredicate (per-click evaluated by host). Both must pass to proceed.
|
|
671
684
|
if (!gameGate) return;
|
|
@@ -709,6 +722,10 @@ export function attachBrowserInputBackend(
|
|
|
709
722
|
safeAdd(canvas, 'click', onCanvasClick as EventListener);
|
|
710
723
|
|
|
711
724
|
function sample(): InputBackendSample {
|
|
725
|
+
if (!inputAllowed) {
|
|
726
|
+
clear();
|
|
727
|
+
return createEmptyInputBackendSample();
|
|
728
|
+
}
|
|
712
729
|
// D-1: gamepad edge diff derived inside sample() — the only
|
|
713
730
|
// cross-frame state holder. getGamepads() is polled once per frame;
|
|
714
731
|
// null-padded arrays use gamepad.index as slot key.
|
|
@@ -871,6 +888,13 @@ export function attachBrowserInputBackend(
|
|
|
871
888
|
}
|
|
872
889
|
}
|
|
873
890
|
|
|
891
|
+
function setInputAllowed(allowed: boolean): void {
|
|
892
|
+
inputAllowed = allowed;
|
|
893
|
+
// Both closing and reopening are lease boundaries. Clearing on reopen
|
|
894
|
+
// fences any event that raced the closed gate before the next scan.
|
|
895
|
+
clear();
|
|
896
|
+
}
|
|
897
|
+
|
|
874
898
|
function clear(): void {
|
|
875
899
|
heldKeys.clear();
|
|
876
900
|
upEdges.clear();
|
|
@@ -926,7 +950,13 @@ export function attachBrowserInputBackend(
|
|
|
926
950
|
}
|
|
927
951
|
}
|
|
928
952
|
|
|
929
|
-
const backend: InputBackend = {
|
|
953
|
+
const backend: InputBackend = {
|
|
954
|
+
sample,
|
|
955
|
+
clear,
|
|
956
|
+
detach,
|
|
957
|
+
setPointerLockAllowed,
|
|
958
|
+
setInputAllowed,
|
|
959
|
+
};
|
|
930
960
|
|
|
931
961
|
// Returned callable doubles as the InputBackend (detach + sample). AI
|
|
932
962
|
// users see one symbol with both shapes, mirroring the
|
|
@@ -28,6 +28,8 @@ type CanvasInputOwner = ReturnType<CanvasInputBoundary['owner']>;
|
|
|
28
28
|
export function createCanvasInputBoundary(source: InputBackend): CanvasInputBoundary {
|
|
29
29
|
let active: CanvasInputOwner = 'editor';
|
|
30
30
|
let gamePointerLockAllowed = false;
|
|
31
|
+
let editorInputAllowed = true;
|
|
32
|
+
let gameInputAllowed = true;
|
|
31
33
|
source.setPointerLockAllowed?.(false);
|
|
32
34
|
|
|
33
35
|
const empty = (): InputBackendSample => createEmptyInputBackendSample();
|
|
@@ -47,6 +49,11 @@ export function createCanvasInputBoundary(source: InputBackend): CanvasInputBoun
|
|
|
47
49
|
source.setPointerLockAllowed?.(false);
|
|
48
50
|
}
|
|
49
51
|
},
|
|
52
|
+
setInputAllowed: (allowed) => {
|
|
53
|
+
if (consumer === 'game') gameInputAllowed = allowed;
|
|
54
|
+
else editorInputAllowed = allowed;
|
|
55
|
+
source.setInputAllowed?.(active === 'game' ? gameInputAllowed : editorInputAllowed);
|
|
56
|
+
},
|
|
50
57
|
clear: () => {
|
|
51
58
|
if (consumer === active) clear();
|
|
52
59
|
},
|
|
@@ -58,11 +65,13 @@ export function createCanvasInputBoundary(source: InputBackend): CanvasInputBoun
|
|
|
58
65
|
clear();
|
|
59
66
|
active = 'game';
|
|
60
67
|
source.setPointerLockAllowed?.(gamePointerLockAllowed);
|
|
68
|
+
source.setInputAllowed?.(gameInputAllowed);
|
|
61
69
|
};
|
|
62
70
|
|
|
63
71
|
const revokeGame = (): void => {
|
|
64
72
|
clear();
|
|
65
73
|
active = 'editor';
|
|
74
|
+
source.setInputAllowed?.(editorInputAllowed);
|
|
66
75
|
};
|
|
67
76
|
|
|
68
77
|
return {
|
package/src/composite-backend.ts
CHANGED
|
@@ -159,6 +159,7 @@ export function makeCompositeBackend(
|
|
|
159
159
|
options?: CompositeBackendOptions,
|
|
160
160
|
): CompositeInputBackend {
|
|
161
161
|
let yieldToHuman = options?.yieldToHuman ?? true;
|
|
162
|
+
let inputAllowed = true;
|
|
162
163
|
let leaseRevoked = false;
|
|
163
164
|
let leaseGeneration = 0;
|
|
164
165
|
|
|
@@ -194,6 +195,25 @@ export function makeCompositeBackend(
|
|
|
194
195
|
function sample(): InputBackendSample {
|
|
195
196
|
// Call inner EXACTLY once -- it drains its own accumulators here.
|
|
196
197
|
const base = inner.sample();
|
|
198
|
+
if (!inputAllowed) {
|
|
199
|
+
clearInjected();
|
|
200
|
+
return {
|
|
201
|
+
...base,
|
|
202
|
+
downKeys: new Set(),
|
|
203
|
+
upKeys: new Set(),
|
|
204
|
+
downCodes: new Set(),
|
|
205
|
+
upCodes: new Set(),
|
|
206
|
+
pressedKeys: new Set(),
|
|
207
|
+
pressedCodes: new Set(),
|
|
208
|
+
buttons: [false, false, false],
|
|
209
|
+
pressedButtons: [false, false, false],
|
|
210
|
+
releasedButtons: [false, false, false],
|
|
211
|
+
movementX: 0,
|
|
212
|
+
movementY: 0,
|
|
213
|
+
wheelDelta: 0,
|
|
214
|
+
pointerLocked: false,
|
|
215
|
+
};
|
|
216
|
+
}
|
|
197
217
|
|
|
198
218
|
// yield-to-human is PER-KEY: an injected key is suppressed only when the human
|
|
199
219
|
// is holding the SAME key this frame. This is the minimal realization of
|
|
@@ -351,6 +371,15 @@ export function makeCompositeBackend(
|
|
|
351
371
|
const lockGate: Pick<InputBackend, 'setPointerLockAllowed'> = inner.setPointerLockAllowed
|
|
352
372
|
? { setPointerLockAllowed: (allowed: boolean) => inner.setPointerLockAllowed?.(allowed) }
|
|
353
373
|
: {};
|
|
374
|
+
const inputGate: Pick<InputBackend, 'setInputAllowed'> = {
|
|
375
|
+
setInputAllowed: (allowed: boolean) => {
|
|
376
|
+
inputAllowed = allowed;
|
|
377
|
+
inner.setInputAllowed?.(allowed);
|
|
378
|
+
// Closing and reopening are both lease boundaries. Clear after either
|
|
379
|
+
// transition so synthetic edges cannot cross a startup/input fence.
|
|
380
|
+
clearInjected();
|
|
381
|
+
},
|
|
382
|
+
};
|
|
354
383
|
|
|
355
384
|
const clearInjected = (): void => {
|
|
356
385
|
// Clearing is a lease boundary: discard every pending frame edge first,
|
|
@@ -396,7 +425,7 @@ export function makeCompositeBackend(
|
|
|
396
425
|
const createInjectedLease = (): CompositeInputLease => {
|
|
397
426
|
beginInjectedLease();
|
|
398
427
|
const generation = leaseGeneration;
|
|
399
|
-
const active = (): boolean => !leaseRevoked && generation === leaseGeneration;
|
|
428
|
+
const active = (): boolean => inputAllowed && !leaseRevoked && generation === leaseGeneration;
|
|
400
429
|
return {
|
|
401
430
|
sample,
|
|
402
431
|
detach: () => {},
|
|
@@ -444,6 +473,7 @@ export function makeCompositeBackend(
|
|
|
444
473
|
return {
|
|
445
474
|
sample,
|
|
446
475
|
...lockGate,
|
|
476
|
+
...inputGate,
|
|
447
477
|
// Teardown belongs to the human backend -- revoke the synthetic lease
|
|
448
478
|
// first, then forward the physical listener teardown. `clear()` is also
|
|
449
479
|
// exposed so an owner can revoke input without detaching the browser.
|
|
@@ -457,7 +487,7 @@ export function makeCompositeBackend(
|
|
|
457
487
|
},
|
|
458
488
|
|
|
459
489
|
press(key) {
|
|
460
|
-
if (leaseRevoked) return;
|
|
490
|
+
if (leaseRevoked || !inputAllowed) return;
|
|
461
491
|
const normalized = normalizeKey(key);
|
|
462
492
|
if (!heldKeys.has(normalized.key)) pressedKeys.add(normalized.key);
|
|
463
493
|
heldKeys.add(normalized.key);
|
|
@@ -467,25 +497,25 @@ export function makeCompositeBackend(
|
|
|
467
497
|
}
|
|
468
498
|
},
|
|
469
499
|
release(key) {
|
|
470
|
-
if (leaseRevoked) return;
|
|
500
|
+
if (leaseRevoked || !inputAllowed) return;
|
|
471
501
|
const normalized = normalizeKey(key);
|
|
472
502
|
if (heldKeys.delete(normalized.key)) upEdges.add(normalized.key); // held -> emit one up-edge
|
|
473
503
|
if (normalized.code !== undefined && heldCodes.delete(normalized.code))
|
|
474
504
|
upCodeEdges.add(normalized.code);
|
|
475
505
|
},
|
|
476
506
|
setButton(slot, down) {
|
|
477
|
-
if (leaseRevoked) return;
|
|
507
|
+
if (leaseRevoked || !inputAllowed) return;
|
|
478
508
|
if (down && !buttons[slot]) pressedButtons[slot] = true;
|
|
479
509
|
if (!down && buttons[slot]) releasedButtons[slot] = true;
|
|
480
510
|
buttons[slot] = down;
|
|
481
511
|
},
|
|
482
512
|
addMovement(dx, dy) {
|
|
483
|
-
if (leaseRevoked) return;
|
|
513
|
+
if (leaseRevoked || !inputAllowed) return;
|
|
484
514
|
mvx += dx;
|
|
485
515
|
mvy += dy;
|
|
486
516
|
},
|
|
487
517
|
addWheel(notches) {
|
|
488
|
-
if (leaseRevoked) return;
|
|
518
|
+
if (leaseRevoked || !inputAllowed) return;
|
|
489
519
|
wheel += notches;
|
|
490
520
|
},
|
|
491
521
|
clearInjected,
|
package/src/input-snapshot.ts
CHANGED
|
@@ -375,6 +375,12 @@ export interface InputBackend {
|
|
|
375
375
|
* Optional -- backends without pointer-lock support omit this method.
|
|
376
376
|
*/
|
|
377
377
|
setPointerLockAllowed?(allowed: boolean): void;
|
|
378
|
+
/**
|
|
379
|
+
* Gate physical/synthetic acquisition for a host lifecycle boundary. A
|
|
380
|
+
* closed gate clears producer state and makes subsequent samples empty until
|
|
381
|
+
* the gate is reopened; it is independent of pointer-lock policy.
|
|
382
|
+
*/
|
|
383
|
+
setInputAllowed?(allowed: boolean): void;
|
|
378
384
|
/**
|
|
379
385
|
* Atomically discard acquired state without detaching listeners. A host calls
|
|
380
386
|
* this when it revokes a control lease so held keys/buttons, contacts, frame
|