Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
microsoft
GitHub Repository: microsoft/vscode
Path: blob/main/src/vs/workbench/services/accessibility/electron-browser/accessibilityService.ts
3296 views
1
/*---------------------------------------------------------------------------------------------
2
* Copyright (c) Microsoft Corporation. All rights reserved.
3
* Licensed under the MIT License. See License.txt in the project root for license information.
4
*--------------------------------------------------------------------------------------------*/
5
6
import { IAccessibilityService, AccessibilitySupport } from '../../../../platform/accessibility/common/accessibility.js';
7
import { isWindows, isLinux } from '../../../../base/common/platform.js';
8
import { INativeWorkbenchEnvironmentService } from '../../environment/electron-browser/environmentService.js';
9
import { IContextKeyService } from '../../../../platform/contextkey/common/contextkey.js';
10
import { IConfigurationService } from '../../../../platform/configuration/common/configuration.js';
11
import { AccessibilityService } from '../../../../platform/accessibility/browser/accessibilityService.js';
12
import { InstantiationType, registerSingleton } from '../../../../platform/instantiation/common/extensions.js';
13
import { ITelemetryService } from '../../../../platform/telemetry/common/telemetry.js';
14
import { IJSONEditingService } from '../../configuration/common/jsonEditing.js';
15
import { IWorkbenchContribution, WorkbenchPhase, registerWorkbenchContribution2 } from '../../../common/contributions.js';
16
import { INativeHostService } from '../../../../platform/native/common/native.js';
17
import { ILayoutService } from '../../../../platform/layout/browser/layoutService.js';
18
19
interface AccessibilityMetrics {
20
enabled: boolean;
21
}
22
type AccessibilityMetricsClassification = {
23
owner: 'isidorn';
24
comment: 'Helps gain an understanding of when accessibility features are being used';
25
enabled: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; comment: 'Whether or not accessibility features are enabled' };
26
};
27
28
export class NativeAccessibilityService extends AccessibilityService implements IAccessibilityService {
29
30
private didSendTelemetry = false;
31
private shouldAlwaysUnderlineAccessKeys: boolean | undefined = undefined;
32
33
constructor(
34
@INativeWorkbenchEnvironmentService environmentService: INativeWorkbenchEnvironmentService,
35
@IContextKeyService contextKeyService: IContextKeyService,
36
@IConfigurationService configurationService: IConfigurationService,
37
@ILayoutService _layoutService: ILayoutService,
38
@ITelemetryService private readonly _telemetryService: ITelemetryService,
39
@INativeHostService private readonly nativeHostService: INativeHostService
40
) {
41
super(contextKeyService, _layoutService, configurationService);
42
this.setAccessibilitySupport(environmentService.window.accessibilitySupport ? AccessibilitySupport.Enabled : AccessibilitySupport.Disabled);
43
}
44
45
override async alwaysUnderlineAccessKeys(): Promise<boolean> {
46
if (!isWindows) {
47
return false;
48
}
49
50
if (typeof this.shouldAlwaysUnderlineAccessKeys !== 'boolean') {
51
const windowsKeyboardAccessibility = await this.nativeHostService.windowsGetStringRegKey('HKEY_CURRENT_USER', 'Control Panel\\Accessibility\\Keyboard Preference', 'On');
52
this.shouldAlwaysUnderlineAccessKeys = (windowsKeyboardAccessibility === '1');
53
}
54
55
return this.shouldAlwaysUnderlineAccessKeys;
56
}
57
58
override setAccessibilitySupport(accessibilitySupport: AccessibilitySupport): void {
59
super.setAccessibilitySupport(accessibilitySupport);
60
61
if (!this.didSendTelemetry && accessibilitySupport === AccessibilitySupport.Enabled) {
62
this._telemetryService.publicLog2<AccessibilityMetrics, AccessibilityMetricsClassification>('accessibility', { enabled: true });
63
this.didSendTelemetry = true;
64
}
65
}
66
}
67
68
registerSingleton(IAccessibilityService, NativeAccessibilityService, InstantiationType.Delayed);
69
70
// 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 settings
71
class LinuxAccessibilityContribution implements IWorkbenchContribution {
72
73
static readonly ID = 'workbench.contrib.linuxAccessibility';
74
75
constructor(
76
@IJSONEditingService jsonEditingService: IJSONEditingService,
77
@IAccessibilityService accessibilityService: IAccessibilityService,
78
@INativeWorkbenchEnvironmentService environmentService: INativeWorkbenchEnvironmentService
79
) {
80
const forceRendererAccessibility = () => {
81
if (accessibilityService.isScreenReaderOptimized()) {
82
jsonEditingService.write(environmentService.argvResource, [{ path: ['force-renderer-accessibility'], value: true }], true);
83
}
84
};
85
forceRendererAccessibility();
86
accessibilityService.onDidChangeScreenReaderOptimized(forceRendererAccessibility);
87
}
88
}
89
90
if (isLinux) {
91
registerWorkbenchContribution2(LinuxAccessibilityContribution.ID, LinuxAccessibilityContribution, WorkbenchPhase.BlockRestore);
92
}
93
94