Path: blob/main/src/vs/workbench/services/accessibility/electron-browser/accessibilityService.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 { IAccessibilityService, AccessibilitySupport } from '../../../../platform/accessibility/common/accessibility.js';6import { isWindows, isLinux } from '../../../../base/common/platform.js';7import { INativeWorkbenchEnvironmentService } from '../../environment/electron-browser/environmentService.js';8import { IContextKeyService } from '../../../../platform/contextkey/common/contextkey.js';9import { IConfigurationService } from '../../../../platform/configuration/common/configuration.js';10import { AccessibilityService } from '../../../../platform/accessibility/browser/accessibilityService.js';11import { InstantiationType, registerSingleton } from '../../../../platform/instantiation/common/extensions.js';12import { ITelemetryService } from '../../../../platform/telemetry/common/telemetry.js';13import { IJSONEditingService } from '../../configuration/common/jsonEditing.js';14import { IWorkbenchContribution, WorkbenchPhase, registerWorkbenchContribution2 } from '../../../common/contributions.js';15import { INativeHostService } from '../../../../platform/native/common/native.js';16import { ILayoutService } from '../../../../platform/layout/browser/layoutService.js';1718interface AccessibilityMetrics {19enabled: boolean;20}21type AccessibilityMetricsClassification = {22owner: 'isidorn';23comment: 'Helps gain an understanding of when accessibility features are being used';24enabled: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; comment: 'Whether or not accessibility features are enabled' };25};2627export class NativeAccessibilityService extends AccessibilityService implements IAccessibilityService {2829private didSendTelemetry = false;30private shouldAlwaysUnderlineAccessKeys: boolean | undefined = undefined;3132constructor(33@INativeWorkbenchEnvironmentService environmentService: INativeWorkbenchEnvironmentService,34@IContextKeyService contextKeyService: IContextKeyService,35@IConfigurationService configurationService: IConfigurationService,36@ILayoutService _layoutService: ILayoutService,37@ITelemetryService private readonly _telemetryService: ITelemetryService,38@INativeHostService private readonly nativeHostService: INativeHostService39) {40super(contextKeyService, _layoutService, configurationService);41this.setAccessibilitySupport(environmentService.window.accessibilitySupport ? AccessibilitySupport.Enabled : AccessibilitySupport.Disabled);42}4344override async alwaysUnderlineAccessKeys(): Promise<boolean> {45if (!isWindows) {46return false;47}4849if (typeof this.shouldAlwaysUnderlineAccessKeys !== 'boolean') {50const windowsKeyboardAccessibility = await this.nativeHostService.windowsGetStringRegKey('HKEY_CURRENT_USER', 'Control Panel\\Accessibility\\Keyboard Preference', 'On');51this.shouldAlwaysUnderlineAccessKeys = (windowsKeyboardAccessibility === '1');52}5354return this.shouldAlwaysUnderlineAccessKeys;55}5657override setAccessibilitySupport(accessibilitySupport: AccessibilitySupport): void {58super.setAccessibilitySupport(accessibilitySupport);5960if (!this.didSendTelemetry && accessibilitySupport === AccessibilitySupport.Enabled) {61this._telemetryService.publicLog2<AccessibilityMetrics, AccessibilityMetricsClassification>('accessibility', { enabled: true });62this.didSendTelemetry = true;63}64}65}6667registerSingleton(IAccessibilityService, NativeAccessibilityService, InstantiationType.Delayed);6869// On linux we do not automatically detect that a screen reader is detected, thus we have to implicitly notify the renderer to enable accessibility when user configures it in settings70class LinuxAccessibilityContribution implements IWorkbenchContribution {7172static readonly ID = 'workbench.contrib.linuxAccessibility';7374constructor(75@IJSONEditingService jsonEditingService: IJSONEditingService,76@IAccessibilityService accessibilityService: IAccessibilityService,77@INativeWorkbenchEnvironmentService environmentService: INativeWorkbenchEnvironmentService78) {79const forceRendererAccessibility = () => {80if (accessibilityService.isScreenReaderOptimized()) {81jsonEditingService.write(environmentService.argvResource, [{ path: ['force-renderer-accessibility'], value: true }], true);82}83};84forceRendererAccessibility();85accessibilityService.onDidChangeScreenReaderOptimized(forceRendererAccessibility);86}87}8889if (isLinux) {90registerWorkbenchContribution2(LinuxAccessibilityContribution.ID, LinuxAccessibilityContribution, WorkbenchPhase.BlockRestore);91}929394