Skip to content

Commit 99f252e

Browse files
feat: input support change listenering target
1 parent 2e8b172 commit 99f252e

File tree

12 files changed

+178
-284
lines changed

12 files changed

+178
-284
lines changed

packages/core/src/Engine.ts

+12-3
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,11 @@
1-
import { IHardwareRenderer, IPhysics, IPhysicsManager, IShaderLab, IXRDevice } from "@galacean/engine-design";
1+
import {
2+
IHardwareRenderer,
3+
IInputOptions,
4+
IPhysics,
5+
IPhysicsManager,
6+
IShaderLab,
7+
IXRDevice
8+
} from "@galacean/engine-design";
29
import { Color } from "@galacean/engine-math";
310
import { SpriteMaskInteraction } from "./2d";
411
import { Font } from "./2d/text/Font";
@@ -256,7 +263,7 @@ export class Engine extends EventDispatcher {
256263
this._textDefaultFont = Font.createFromOS(this, "Arial");
257264
this._textDefaultFont.isGCIgnored = true;
258265

259-
this.inputManager = new InputManager(this);
266+
this.inputManager = new InputManager(this, configuration.input);
260267

261268
const { xrDevice } = configuration;
262269
if (xrDevice) {
@@ -752,6 +759,8 @@ export interface EngineConfiguration {
752759
xrDevice?: IXRDevice;
753760
/** Color space. */
754761
colorSpace?: ColorSpace;
755-
/** Shader lab */
762+
/** Shader lab. */
756763
shaderLab?: IShaderLab;
764+
/** Input options. */
765+
input?: IInputOptions;
757766
}

packages/core/src/input/InputManager.ts

+6-23
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
1+
import { IInputOptions } from "@galacean/engine-design";
12
import { Vector3 } from "@galacean/engine-math";
23
import { Engine } from "../Engine";
4+
import { Scene } from "../Scene";
35
import { Keys } from "./enums/Keys";
46
import { PointerButton, _pointerBin2DecMap } from "./enums/PointerButton";
57
import { KeyboardManager } from "./keyboard/KeyboardManager";
68
import { Pointer } from "./pointer/Pointer";
79
import { PointerManager } from "./pointer/PointerManager";
810
import { WheelManager } from "./wheel/WheelManager";
9-
import { Scene } from "../Scene";
1011

1112
/**
1213
* InputManager manages device input such as mouse, touch, keyboard, etc.
@@ -150,18 +151,14 @@ export class InputManager {
150151
/**
151152
* @internal
152153
*/
153-
constructor(engine: Engine) {
154+
constructor(engine: Engine, inputOptions?: IInputOptions) {
154155
this._engine = engine;
155156
// @ts-ignore
156157
const canvas = engine._canvas._webCanvas;
157158
if (typeof OffscreenCanvas === "undefined" || !(canvas instanceof OffscreenCanvas)) {
158-
this._wheelManager = new WheelManager(engine);
159-
this._pointerManager = new PointerManager(engine);
160-
this._keyboardManager = new KeyboardManager(engine);
161-
this._onBlur = this._onBlur.bind(this);
162-
window.addEventListener("blur", this._onBlur);
163-
this._onFocus = this._onFocus.bind(this);
164-
window.addEventListener("focus", this._onFocus);
159+
this._wheelManager = new WheelManager(engine, inputOptions?.wheelTarget ?? canvas);
160+
this._pointerManager = new PointerManager(engine, inputOptions?.pointerTarget ?? canvas);
161+
this._keyboardManager = new KeyboardManager(engine, inputOptions?.keyboardTarget ?? window);
165162
this._initialized = true;
166163
}
167164
}
@@ -189,8 +186,6 @@ export class InputManager {
189186
*/
190187
_destroy(): void {
191188
if (this._initialized) {
192-
window.removeEventListener("blur", this._onBlur);
193-
window.removeEventListener("focus", this._onFocus);
194189
this._wheelManager._destroy();
195190
this._wheelManager = null;
196191
this._pointerManager._destroy();
@@ -199,16 +194,4 @@ export class InputManager {
199194
this._keyboardManager = null;
200195
}
201196
}
202-
203-
private _onBlur(): void {
204-
this._wheelManager._onBlur();
205-
this._pointerManager._onBlur();
206-
this._keyboardManager._onBlur();
207-
}
208-
209-
private _onFocus(): void {
210-
this._wheelManager._onFocus();
211-
this._pointerManager._onFocus();
212-
this._keyboardManager._onFocus();
213-
}
214197
}

packages/core/src/input/interface/IInput.ts

-8
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,4 @@ export interface IInput {
77
* Function called when the engine is destroyed.
88
*/
99
_destroy(): void;
10-
/**
11-
* Function called when focused.
12-
*/
13-
_onFocus(): void;
14-
/**
15-
* Function called when focus is lost.
16-
*/
17-
_onBlur(): void;
1810
}

packages/core/src/input/keyboard/KeyboardManager.ts

+31-46
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
import { Engine } from "../../Engine";
21
import { DisorderedArray } from "../../DisorderedArray";
2+
import { Engine } from "../../Engine";
33
import { Platform } from "../../Platform";
44
import { SystemInfo } from "../../SystemInfo";
55
import { Keys } from "../enums/Keys";
@@ -24,25 +24,20 @@ export class KeyboardManager implements IInput {
2424
/** @internal */
2525
_curFrameUpList: DisorderedArray<Keys> = new DisorderedArray();
2626

27+
// @internal
28+
_target: EventTarget;
2729
private _engine: Engine;
28-
private _htmlCanvas: HTMLCanvasElement;
2930
private _nativeEvents: KeyboardEvent[] = [];
30-
private _hadListener: boolean = false;
3131

3232
/**
33-
* Create a KeyboardManager.
33+
* @internal
3434
*/
35-
constructor(engine: Engine) {
36-
// @ts-ignore
37-
const htmlCanvas = engine._canvas._webCanvas;
35+
constructor(engine: Engine, target: EventTarget) {
3836
this._engine = engine;
39-
this._htmlCanvas = htmlCanvas;
40-
// Need to set tabIndex to make the canvas focus.
41-
htmlCanvas.tabIndex = htmlCanvas.tabIndex;
37+
this._onBlur = this._onBlur.bind(this);
4238
this._onKeyEvent = this._onKeyEvent.bind(this);
43-
htmlCanvas.addEventListener("keydown", this._onKeyEvent);
44-
htmlCanvas.addEventListener("keyup", this._onKeyEvent);
45-
this._hadListener = true;
39+
this._target = target;
40+
this._addEventListener();
4641
}
4742

4843
/**
@@ -101,42 +96,11 @@ export class KeyboardManager implements IInput {
10196
}
10297
}
10398

104-
/**
105-
* @internal
106-
*/
107-
_onFocus(): void {
108-
if (!this._hadListener) {
109-
this._htmlCanvas.addEventListener("keydown", this._onKeyEvent);
110-
this._htmlCanvas.addEventListener("keyup", this._onKeyEvent);
111-
this._hadListener = true;
112-
}
113-
}
114-
115-
/**
116-
* @internal
117-
*/
118-
_onBlur(): void {
119-
if (this._hadListener) {
120-
this._htmlCanvas.removeEventListener("keydown", this._onKeyEvent);
121-
this._htmlCanvas.removeEventListener("keyup", this._onKeyEvent);
122-
this._curHeldDownKeyToIndexMap.length = 0;
123-
this._curFrameHeldDownList.length = 0;
124-
this._curFrameDownList.length = 0;
125-
this._curFrameUpList.length = 0;
126-
this._nativeEvents.length = 0;
127-
this._hadListener = false;
128-
}
129-
}
130-
13199
/**
132100
* @internal
133101
*/
134102
_destroy(): void {
135-
if (this._hadListener) {
136-
this._htmlCanvas.removeEventListener("keydown", this._onKeyEvent);
137-
this._htmlCanvas.removeEventListener("keyup", this._onKeyEvent);
138-
this._hadListener = false;
139-
}
103+
this._removeEventListener();
140104
this._curHeldDownKeyToIndexMap.length = 0;
141105
this._curHeldDownKeyToIndexMap = null;
142106
this._upKeyToFrameCountMap.length = 0;
@@ -151,11 +115,32 @@ export class KeyboardManager implements IInput {
151115
this._curFrameDownList = null;
152116
this._curFrameUpList.length = 0;
153117
this._curFrameUpList = null;
154-
this._htmlCanvas = null;
155118
this._engine = null;
156119
}
157120

121+
private _onBlur() {
122+
this._curHeldDownKeyToIndexMap.length = 0;
123+
this._curFrameHeldDownList.length = 0;
124+
this._curFrameDownList.length = 0;
125+
this._curFrameUpList.length = 0;
126+
this._nativeEvents.length = 0;
127+
}
128+
158129
private _onKeyEvent(evt: KeyboardEvent): void {
159130
this._nativeEvents.push(evt);
160131
}
132+
133+
private _addEventListener(): void {
134+
const { _target: target } = this;
135+
target.addEventListener("keydown", this._onKeyEvent);
136+
target.addEventListener("keyup", this._onKeyEvent);
137+
target.addEventListener("blur", this._onBlur);
138+
}
139+
140+
private _removeEventListener(): void {
141+
const { _target: target } = this;
142+
target.removeEventListener("keydown", this._onKeyEvent);
143+
target.removeEventListener("keyup", this._onKeyEvent);
144+
target.removeEventListener("blur", this._onBlur);
145+
}
161146
}

packages/core/src/input/pointer/Pointer.ts

+2
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@ export class Pointer {
2424
position: Vector2 = new Vector2();
2525
/** The change of the pointer. */
2626
deltaPosition: Vector2 = new Vector2();
27+
/** The current target element of the pointer. */
28+
currentTarget: EventTarget;
2729
/** @internal */
2830
_events: PointerEvent[] = [];
2931
/** @internal */

0 commit comments

Comments
 (0)