Path: blob/main/src/vs/workbench/services/keybinding/electron-browser/nativeKeyboardLayoutService.ts
3296 views
/*---------------------------------------------------------------------------------------------1* Copyright (c) Microsoft Corporation. All rights reserved.2* Licensed under the MIT License. See License.txt in the project root for license information.3*--------------------------------------------------------------------------------------------*/45import { Disposable } from '../../../../base/common/lifecycle.js';6import { IKeyboardLayoutInfo, IKeyboardMapping, IMacLinuxKeyboardMapping, IWindowsKeyboardMapping, macLinuxKeyboardMappingEquals, windowsKeyboardMappingEquals } from '../../../../platform/keyboardLayout/common/keyboardLayout.js';7import { Emitter, Event } from '../../../../base/common/event.js';8import { OperatingSystem, OS } from '../../../../base/common/platform.js';9import { IMainProcessService } from '../../../../platform/ipc/common/mainProcessService.js';10import { INativeKeyboardLayoutService as IBaseNativeKeyboardLayoutService } from '../../../../platform/keyboardLayout/common/keyboardLayoutService.js';11import { ProxyChannel } from '../../../../base/parts/ipc/common/ipc.js';12import { createDecorator } from '../../../../platform/instantiation/common/instantiation.js';1314export const INativeKeyboardLayoutService = createDecorator<INativeKeyboardLayoutService>('nativeKeyboardLayoutService');1516export interface INativeKeyboardLayoutService {17readonly _serviceBrand: undefined;18readonly onDidChangeKeyboardLayout: Event<void>;19getRawKeyboardMapping(): IKeyboardMapping | null;20getCurrentKeyboardLayout(): IKeyboardLayoutInfo | null;21}2223export class NativeKeyboardLayoutService extends Disposable implements INativeKeyboardLayoutService {2425declare readonly _serviceBrand: undefined;2627private readonly _onDidChangeKeyboardLayout = this._register(new Emitter<void>());28readonly onDidChangeKeyboardLayout = this._onDidChangeKeyboardLayout.event;2930private readonly _keyboardLayoutService: IBaseNativeKeyboardLayoutService;31private _initPromise: Promise<void> | null;32private _keyboardMapping: IKeyboardMapping | null;33private _keyboardLayoutInfo: IKeyboardLayoutInfo | null;3435constructor(36@IMainProcessService mainProcessService: IMainProcessService37) {38super();39this._keyboardLayoutService = ProxyChannel.toService<IBaseNativeKeyboardLayoutService>(mainProcessService.getChannel('keyboardLayout'));40this._initPromise = null;41this._keyboardMapping = null;42this._keyboardLayoutInfo = null;4344this._register(this._keyboardLayoutService.onDidChangeKeyboardLayout(async ({ keyboardLayoutInfo, keyboardMapping }) => {45await this.initialize();46if (keyboardMappingEquals(this._keyboardMapping, keyboardMapping)) {47// the mappings are equal48return;49}5051this._keyboardMapping = keyboardMapping;52this._keyboardLayoutInfo = keyboardLayoutInfo;53this._onDidChangeKeyboardLayout.fire();54}));55}5657public initialize(): Promise<void> {58if (!this._initPromise) {59this._initPromise = this._doInitialize();60}61return this._initPromise;62}6364private async _doInitialize(): Promise<void> {65const keyboardLayoutData = await this._keyboardLayoutService.getKeyboardLayoutData();66const { keyboardLayoutInfo, keyboardMapping } = keyboardLayoutData;67this._keyboardMapping = keyboardMapping;68this._keyboardLayoutInfo = keyboardLayoutInfo;69}7071public getRawKeyboardMapping(): IKeyboardMapping | null {72return this._keyboardMapping;73}7475public getCurrentKeyboardLayout(): IKeyboardLayoutInfo | null {76return this._keyboardLayoutInfo;77}78}7980function keyboardMappingEquals(a: IKeyboardMapping | null, b: IKeyboardMapping | null): boolean {81if (OS === OperatingSystem.Windows) {82return windowsKeyboardMappingEquals(<IWindowsKeyboardMapping | null>a, <IWindowsKeyboardMapping | null>b);83}8485return macLinuxKeyboardMappingEquals(<IMacLinuxKeyboardMapping | null>a, <IMacLinuxKeyboardMapping | null>b);86}878889