145 lines
4.7 KiB
TypeScript
145 lines
4.7 KiB
TypeScript
/**
|
|
* Copyright (c) Microsoft Corporation.
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the 'License');
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an 'AS IS' BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
import { resolveSmartModifierString } from '../input';
|
|
import { getBidiKeyValue } from './third_party/bidiKeyboard';
|
|
import * as bidi from './third_party/bidiProtocol';
|
|
|
|
import type * as input from '../input';
|
|
import type * as types from '../types';
|
|
import type { BidiSession } from './bidiConnection';
|
|
|
|
export class RawKeyboardImpl implements input.RawKeyboard {
|
|
private _session: BidiSession;
|
|
|
|
constructor(session: BidiSession) {
|
|
this._session = session;
|
|
}
|
|
|
|
setSession(session: BidiSession) {
|
|
this._session = session;
|
|
}
|
|
|
|
async keydown(modifiers: Set<types.KeyboardModifier>, keyName: string, description: input.KeyDescription, autoRepeat: boolean): Promise<void> {
|
|
keyName = resolveSmartModifierString(keyName);
|
|
const actions: bidi.Input.KeySourceAction[] = [];
|
|
actions.push({ type: 'keyDown', value: getBidiKeyValue(keyName) });
|
|
await this._performActions(actions);
|
|
}
|
|
|
|
async keyup(modifiers: Set<types.KeyboardModifier>, keyName: string, description: input.KeyDescription): Promise<void> {
|
|
keyName = resolveSmartModifierString(keyName);
|
|
const actions: bidi.Input.KeySourceAction[] = [];
|
|
actions.push({ type: 'keyUp', value: getBidiKeyValue(keyName) });
|
|
await this._performActions(actions);
|
|
}
|
|
|
|
async sendText(text: string): Promise<void> {
|
|
const actions: bidi.Input.KeySourceAction[] = [];
|
|
for (const char of text) {
|
|
const value = getBidiKeyValue(char);
|
|
actions.push({ type: 'keyDown', value });
|
|
actions.push({ type: 'keyUp', value });
|
|
}
|
|
await this._performActions(actions);
|
|
}
|
|
|
|
private async _performActions(actions: bidi.Input.KeySourceAction[]) {
|
|
await this._session.send('input.performActions', {
|
|
context: this._session.sessionId,
|
|
actions: [
|
|
{
|
|
type: 'key',
|
|
id: 'pw_keyboard',
|
|
actions,
|
|
}
|
|
]
|
|
});
|
|
}
|
|
}
|
|
|
|
export class RawMouseImpl implements input.RawMouse {
|
|
private readonly _session: BidiSession;
|
|
|
|
constructor(session: BidiSession) {
|
|
this._session = session;
|
|
}
|
|
|
|
async move(x: number, y: number, button: types.MouseButton | 'none', buttons: Set<types.MouseButton>, modifiers: Set<types.KeyboardModifier>, forClick: boolean): Promise<void> {
|
|
await this._performActions([{ type: 'pointerMove', x, y }]);
|
|
}
|
|
|
|
async down(x: number, y: number, button: types.MouseButton, buttons: Set<types.MouseButton>, modifiers: Set<types.KeyboardModifier>, clickCount: number): Promise<void> {
|
|
await this._performActions([{ type: 'pointerDown', button: toBidiButton(button) }]);
|
|
}
|
|
|
|
async up(x: number, y: number, button: types.MouseButton, buttons: Set<types.MouseButton>, modifiers: Set<types.KeyboardModifier>, clickCount: number): Promise<void> {
|
|
await this._performActions([{ type: 'pointerUp', button: toBidiButton(button) }]);
|
|
}
|
|
|
|
async wheel(x: number, y: number, buttons: Set<types.MouseButton>, modifiers: Set<types.KeyboardModifier>, deltaX: number, deltaY: number): Promise<void> {
|
|
// Bidi throws when x/y are not integers.
|
|
x = Math.floor(x);
|
|
y = Math.floor(y);
|
|
await this._session.send('input.performActions', {
|
|
context: this._session.sessionId,
|
|
actions: [
|
|
{
|
|
type: 'wheel',
|
|
id: 'pw_mouse_wheel',
|
|
actions: [{ type: 'scroll', x, y, deltaX, deltaY }],
|
|
}
|
|
]
|
|
});
|
|
}
|
|
|
|
private async _performActions(actions: bidi.Input.PointerSourceAction[]) {
|
|
await this._session.send('input.performActions', {
|
|
context: this._session.sessionId,
|
|
actions: [
|
|
{
|
|
type: 'pointer',
|
|
id: 'pw_mouse',
|
|
parameters: {
|
|
pointerType: bidi.Input.PointerType.Mouse,
|
|
},
|
|
actions,
|
|
}
|
|
]
|
|
});
|
|
}
|
|
}
|
|
|
|
export class RawTouchscreenImpl implements input.RawTouchscreen {
|
|
private readonly _session: BidiSession;
|
|
|
|
constructor(session: BidiSession) {
|
|
this._session = session;
|
|
}
|
|
|
|
async tap(x: number, y: number, modifiers: Set<types.KeyboardModifier>) {
|
|
}
|
|
}
|
|
|
|
function toBidiButton(button: string): number {
|
|
switch (button) {
|
|
case 'left': return 0;
|
|
case 'right': return 2;
|
|
case 'middle': return 1;
|
|
}
|
|
throw new Error('Unknown button: ' + button);
|
|
}
|