Files
cocos-engine/pal/input/native/keyboard-input.ts
PP f433551d1d support system feature query (#9428)
* support feature query in pal/system-info

* support sys.hasFeature and deprecate sys.capabilities

* remove deprecated usage

* support input feature query

update

* IMAGE_BITMAP

* INPUT_TOUCH

* WEBGL

* support WEB_VIEW, VIDEO_PLAYER, SAFE_AREA query

* rename INPUT_XXX  to EVENT_XXX

* support device-manager

update

update

update

* add NOTE

* export deviceManager from gfx

* fix circular dependency

* fix wechat devtools

update

* Revert "fix circular dependency"

This reverts commit ba8a6c0e2e.

* Revert "export deviceManager from gfx"

This reverts commit 14b26ca0e3.

* Revert "support device-manager"

This reverts commit 010a910e56.

# Conflicts:
#	pal/system-info/enum-type/feature.ts

* update

update

* use INPUT_TOUCH for sys.capabilities

* update
2021-10-14 10:29:36 +08:00

69 lines
2.5 KiB
TypeScript

import { KeyboardCallback } from 'pal/input';
import { systemInfo } from 'pal/system-info';
import { KeyCode, EventKeyboard } from '../../../cocos/input/types';
import { EventTarget } from '../../../cocos/core/event';
import { InputEventType } from '../../../cocos/input/types/event-enum';
const nativeKeyCode2KeyCode: Record<number, KeyCode> = {
12: KeyCode.NUM_LOCK,
10048: KeyCode.NUM_0,
10049: KeyCode.NUM_1,
10050: KeyCode.NUM_2,
10051: KeyCode.NUM_3,
10052: KeyCode.NUM_4,
10053: KeyCode.NUM_5,
10054: KeyCode.NUM_6,
10055: KeyCode.NUM_7,
10056: KeyCode.NUM_8,
10057: KeyCode.NUM_9,
20013: KeyCode.NUM_ENTER,
20016: KeyCode.SHIFT_RIGHT,
20017: KeyCode.CTRL_RIGHT,
20018: KeyCode.ALT_RIGHT,
};
function getKeyCode (keyCode: number): KeyCode {
return nativeKeyCode2KeyCode[keyCode] || keyCode;
}
export class KeyboardInputSource {
private _eventTarget: EventTarget = new EventTarget();
// 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 _registerEvent () {
jsb.onKeyDown = (event: jsb.KeyboardEvent) => {
const keyCode = getKeyCode(event.keyCode);
if (!this._keyStateMap[keyCode]) {
const eventKeyDown = this._getInputEvent(event, InputEventType.KEY_DOWN);
this._eventTarget.emit(InputEventType.KEY_DOWN, eventKeyDown);
} else {
const eventKeyPressing = this._getInputEvent(event, InputEventType.KEY_PRESSING);
this._eventTarget.emit(InputEventType.KEY_PRESSING, eventKeyPressing);
}
this._keyStateMap[keyCode] = true;
};
jsb.onKeyUp = (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);
};
}
private _getInputEvent (event: jsb.KeyboardEvent, eventType: InputEventType) {
const keyCode = getKeyCode(event.keyCode);
const eventKeyboard = new EventKeyboard(keyCode, eventType);
return eventKeyboard;
}
public on (eventType: InputEventType, callback: KeyboardCallback, target?: any) {
this._eventTarget.on(eventType, callback, target);
}
}