Skip to content

Commit

Permalink
support dispatching event on native platform (cocos#12705)
Browse files Browse the repository at this point in the history
* support dispatching event on native platform

* pass widnowId

* fix ci
  • Loading branch information
PPpro authored Nov 14, 2022
1 parent 6a8180d commit f64250a
Show file tree
Hide file tree
Showing 3 changed files with 35 additions and 12 deletions.
3 changes: 2 additions & 1 deletion cocos/input/types/event/event-mouse.ts
Original file line number Diff line number Diff line change
Expand Up @@ -147,13 +147,14 @@ export class EventMouse extends Event {
* @param eventType - The type of the event
* @param bubbles - Indicate whether the event bubbles up through the hierarchy or not.
*/
constructor (eventType: SystemEventTypeUnion, bubbles?: boolean, prevLoc?: Vec2) {
constructor (eventType: SystemEventTypeUnion, bubbles?: boolean, prevLoc?: Vec2, windowId?: number) {
super(eventType, bubbles);
this._eventType = eventType;
if (prevLoc) {
this._prevX = prevLoc.x;
this._prevY = prevLoc.y;
}
this.windowId = windowId ?? this.windowId;
}

/**
Expand Down
20 changes: 14 additions & 6 deletions pal/input/native/keyboard-input.ts
Original file line number Diff line number Diff line change
Expand Up @@ -32,12 +32,11 @@ export class KeyboardInputSource {
// On native platform, KeyboardEvent.repeat is always false, so we need a map to manage the key state.
private _keyStateMap: Record<number, boolean> = {};

constructor () {
this._registerEvent();
}
private _handleKeyboardDown: (event: jsb.KeyboardEvent) => void;
private _handleKeyboardUp: (event: jsb.KeyboardEvent) => void;

private _registerEvent () {
jsb.onKeyDown = (event: jsb.KeyboardEvent) => {
constructor () {
this._handleKeyboardDown = (event: jsb.KeyboardEvent) => {
const keyCode = getKeyCode(event.keyCode);
if (!this._keyStateMap[keyCode]) {
const eventKeyDown = this._getInputEvent(event, InputEventType.KEY_DOWN);
Expand All @@ -48,12 +47,21 @@ export class KeyboardInputSource {
}
this._keyStateMap[keyCode] = true;
};
jsb.onKeyUp = (event: jsb.KeyboardEvent) => {
this._handleKeyboardUp = (event: jsb.KeyboardEvent) => {
const keyCode = getKeyCode(event.keyCode);
const eventKeyUp = this._getInputEvent(event, InputEventType.KEY_UP);
this._keyStateMap[keyCode] = false;
this._eventTarget.emit(InputEventType.KEY_UP, eventKeyUp);
};
this._registerEvent();
}

public dispatchKeyboardDownEvent (nativeKeyboardEvent: jsb.KeyboardEvent) { this._handleKeyboardDown(nativeKeyboardEvent); }
public dispatchKeyboardUpEvent (nativeKeyboardEvent: jsb.KeyboardEvent) { this._handleKeyboardUp(nativeKeyboardEvent); }

private _registerEvent () {
jsb.onKeyDown = this._handleKeyboardDown;
jsb.onKeyUp = this._handleKeyboardUp;
}

private _getInputEvent (event: jsb.KeyboardEvent, eventType: InputEventType) {
Expand Down
24 changes: 19 additions & 5 deletions pal/input/native/mouse-input.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,11 +13,25 @@ export class MouseInputSource {
private _isPressed = false;
private _windowManager: any;

private _handleMouseDown: (mouseEvent: jsb.MouseEvent) => void;
private _handleMouseMove: (mouseEvent: jsb.MouseEvent) => void;
private _handleMouseUp: (mouseEvent: jsb.MouseEvent) => void;
private _boundedHandleMouseWheel: (mouseEvent: jsb.MouseWheelEvent) => void;

constructor () {
this._handleMouseDown = this._createCallback(InputEventType.MOUSE_DOWN);
this._handleMouseMove = this._createCallback(InputEventType.MOUSE_MOVE);
this._handleMouseUp = this._createCallback(InputEventType.MOUSE_UP);
this._boundedHandleMouseWheel = this._handleMouseWheel.bind(this);
this._registerEvent();
this._windowManager = jsb.ISystemWindowManager.getInstance();
}

public dispatchMouseDownEvent (nativeMouseEvent: any) { this._handleMouseDown(nativeMouseEvent); }
public dispatchMouseMoveEvent (nativeMouseEvent: any) { this._handleMouseMove(nativeMouseEvent); }
public dispatchMouseUpEvent (nativeMouseEvent: any) { this._handleMouseUp(nativeMouseEvent); }
public dispatchScrollEvent (nativeMouseEvent: any) { this._boundedHandleMouseWheel(nativeMouseEvent); }

private _getLocation (event: jsb.MouseEvent): Vec2 {
const window = this._windowManager.getWindow(event.windowId);
const windowSize = window.getViewSize();
Expand All @@ -28,10 +42,10 @@ export class MouseInputSource {
}

private _registerEvent () {
jsb.onMouseDown = this._createCallback(InputEventType.MOUSE_DOWN);
jsb.onMouseMove = this._createCallback(InputEventType.MOUSE_MOVE);
jsb.onMouseUp = this._createCallback(InputEventType.MOUSE_UP);
jsb.onMouseWheel = this._handleMouseWheel.bind(this);
jsb.onMouseDown = this._handleMouseDown;
jsb.onMouseMove = this._handleMouseMove;
jsb.onMouseUp = this._handleMouseUp;
jsb.onMouseWheel = this._boundedHandleMouseWheel;
}

private _createCallback (eventType: InputEventType) {
Expand All @@ -54,7 +68,7 @@ export class MouseInputSource {
break;
}

const eventMouse = new EventMouse(eventType, false, this._preMousePos);
const eventMouse = new EventMouse(eventType, false, this._preMousePos, mouseEvent.windowId);
eventMouse.setLocation(location.x, location.y);
eventMouse.setButton(button);
eventMouse.movementX = location.x - this._preMousePos.x;
Expand Down

0 comments on commit f64250a

Please sign in to comment.