89 lines
3.4 KiB
JavaScript
89 lines
3.4 KiB
JavaScript
/**
|
|
* Copyright 2023 Google LLC.
|
|
* 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 { InvalidArgumentException, UnknownErrorException, } from '../../../protocol/protocol.js';
|
|
import { Mutex } from '../../../utils/Mutex.js';
|
|
import { KeySource, NoneSource, PointerSource, WheelSource, } from './InputSource.js';
|
|
export class InputState {
|
|
cancelList = [];
|
|
#sources = new Map();
|
|
#mutex = new Mutex();
|
|
getOrCreate(id, type, subtype) {
|
|
let source = this.#sources.get(id);
|
|
if (!source) {
|
|
switch (type) {
|
|
case "none" /* SourceType.None */:
|
|
source = new NoneSource();
|
|
break;
|
|
case "key" /* SourceType.Key */:
|
|
source = new KeySource();
|
|
break;
|
|
case "pointer" /* SourceType.Pointer */: {
|
|
let pointerId = subtype === "mouse" /* Input.PointerType.Mouse */ ? 0 : 2;
|
|
const pointerIds = new Set();
|
|
for (const [, source] of this.#sources) {
|
|
if (source.type === "pointer" /* SourceType.Pointer */) {
|
|
pointerIds.add(source.pointerId);
|
|
}
|
|
}
|
|
while (pointerIds.has(pointerId)) {
|
|
++pointerId;
|
|
}
|
|
source = new PointerSource(pointerId, subtype);
|
|
break;
|
|
}
|
|
case "wheel" /* SourceType.Wheel */:
|
|
source = new WheelSource();
|
|
break;
|
|
default:
|
|
throw new InvalidArgumentException(`Expected "${"none" /* SourceType.None */}", "${"key" /* SourceType.Key */}", "${"pointer" /* SourceType.Pointer */}", or "${"wheel" /* SourceType.Wheel */}". Found unknown source type ${type}.`);
|
|
}
|
|
this.#sources.set(id, source);
|
|
return source;
|
|
}
|
|
if (source.type !== type) {
|
|
throw new InvalidArgumentException(`Input source type of ${id} is ${source.type}, but received ${type}.`);
|
|
}
|
|
return source;
|
|
}
|
|
get(id) {
|
|
const source = this.#sources.get(id);
|
|
if (!source) {
|
|
throw new UnknownErrorException(`Internal error.`);
|
|
}
|
|
return source;
|
|
}
|
|
getGlobalKeyState() {
|
|
const state = new KeySource();
|
|
for (const [, source] of this.#sources) {
|
|
if (source.type !== "key" /* SourceType.Key */) {
|
|
continue;
|
|
}
|
|
for (const pressed of source.pressed) {
|
|
state.pressed.add(pressed);
|
|
}
|
|
state.alt ||= source.alt;
|
|
state.ctrl ||= source.ctrl;
|
|
state.meta ||= source.meta;
|
|
state.shift ||= source.shift;
|
|
}
|
|
return state;
|
|
}
|
|
get queue() {
|
|
return this.#mutex;
|
|
}
|
|
}
|
|
//# sourceMappingURL=InputState.js.map
|