/** * 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