Skip to content

Commit 4aa165c

Browse files
authored
Merge pull request microsoft#187614 from microsoft/merogge/help-alert
alert when screen reader optimized mode changes, include this info in all help menus
2 parents 0af4ba0 + d306d4c commit 4aa165c

File tree

4 files changed

+49
-29
lines changed

4 files changed

+49
-29
lines changed

src/vs/editor/common/standaloneStrings.ts

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,12 @@ export namespace AccessibilityHelpNLS {
1212
export const editableDiffEditor = nls.localize("editableDiffEditor", "You are in a pane of a diff editor.");
1313
export const readonlyEditor = nls.localize("readonlyEditor", "You are in a read-only code editor");
1414
export const editableEditor = nls.localize("editableEditor", "You are in a code editor");
15-
export const changeConfigToOnMac = nls.localize("changeConfigToOnMac", "To configure the editor to be optimized for usage with a Screen Reader press Command+E now.");
16-
export const changeConfigToOnWinLinux = nls.localize("changeConfigToOnWinLinux", "To configure the editor to be optimized for usage with a Screen Reader press Control+E now.");
17-
export const auto_on = nls.localize("auto_on", "The editor is configured to be optimized for usage with a Screen Reader.");
18-
export const auto_off = nls.localize("auto_off", "The editor is configured to never be optimized for usage with a Screen Reader");
15+
export const changeConfigToOnMac = nls.localize("changeConfigToOnMac", "To configure the application to be optimized for usage with a Screen Reader press Command+E now.");
16+
export const changeConfigToOnWinLinux = nls.localize("changeConfigToOnWinLinux", "To configure the application to be optimized for usage with a Screen Reader press Control+E now.");
17+
export const auto_on = nls.localize("auto_on", "The application is configured to be optimized for usage with a Screen Reader.");
18+
export const auto_off = nls.localize("auto_off", "The application is configured to never be optimized for usage with a Screen Reader");
19+
export const screenReaderModeEnabled = nls.localize("screenReaderModeEnabled", "Screen Reader Optimized Mode enabled.");
20+
export const screenReaderModeDisabled = nls.localize("screenReaderModeDisabled", "Screen Reader Optimized Mode disabled.");
1921
export const tabFocusModeOnMsg = nls.localize("tabFocusModeOnMsg", "Pressing Tab in the current editor will move focus to the next focusable element. Toggle this behavior by pressing {0}.");
2022
export const tabFocusModeOnMsgNoKb = nls.localize("tabFocusModeOnMsgNoKb", "Pressing Tab in the current editor will move focus to the next focusable element. The command {0} is currently not triggerable by a keybinding.");
2123
export const tabFocusModeOffMsg = nls.localize("tabFocusModeOffMsg", "Pressing Tab in the current editor will insert the tab character. Toggle this behavior by pressing {0}.");

src/vs/workbench/contrib/accessibility/browser/accessibility.contribution.ts

Lines changed: 1 addition & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,11 @@ import { EditorOption } from 'vs/editor/common/config/editorOptions';
1010
import { AccessibilityHelpNLS } from 'vs/editor/common/standaloneStrings';
1111
import { ToggleTabFocusModeAction } from 'vs/editor/contrib/toggleTabFocusMode/browser/toggleTabFocusMode';
1212
import { localize } from 'vs/nls';
13-
import { AccessibilitySupport } from 'vs/platform/accessibility/common/accessibility';
1413
import { InstantiationType, registerSingleton } from 'vs/platform/instantiation/common/extensions';
1514
import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding';
1615
import { AccessibilityHelpAction, AccessibleViewAction, registerAccessibilityConfiguration } from 'vs/workbench/contrib/accessibility/browser/accessibilityContribution';
1716
import { AccessibleViewService, AccessibleViewType, IAccessibleContentProvider, IAccessibleViewOptions, IAccessibleViewService } from 'vs/workbench/contrib/accessibility/browser/accessibleView';
1817
import * as strings from 'vs/base/common/strings';
19-
import * as platform from 'vs/base/common/platform';
2018
import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation';
2119
import { IWorkbenchContributionsRegistry, Extensions as WorkbenchExtensions } from 'vs/workbench/common/contributions';
2220
import { LifecyclePhase } from 'vs/workbench/services/lifecycle/common/lifecycle';
@@ -29,18 +27,16 @@ import { withNullAsUndefined } from 'vs/base/common/types';
2927
registerAccessibilityConfiguration();
3028
registerSingleton(IAccessibleViewService, AccessibleViewService, InstantiationType.Delayed);
3129

32-
class AccessibilityHelpProvider extends Disposable implements IAccessibleContentProvider {
30+
class AccessibilityHelpProvider implements IAccessibleContentProvider {
3331
onClose() {
3432
this._editor.focus();
35-
this.dispose();
3633
}
3734
options: IAccessibleViewOptions = { type: AccessibleViewType.HelpMenu, ariaLabel: localize('editor-help', "editor accessibility help"), readMoreUrl: 'https://go.microsoft.com/fwlink/?linkid=851010' };
3835
id: string = 'editor';
3936
constructor(
4037
private readonly _editor: ICodeEditor,
4138
@IKeybindingService private readonly _keybindingService: IKeybindingService
4239
) {
43-
super();
4440
}
4541

4642
private _descriptionForCommand(commandId: string, msg: string, noKbMsg: string): string {
@@ -69,23 +65,6 @@ class AccessibilityHelpProvider extends Disposable implements IAccessibleContent
6965
}
7066
}
7167

72-
const turnOnMessage = (
73-
platform.isMacintosh
74-
? AccessibilityHelpNLS.changeConfigToOnMac
75-
: AccessibilityHelpNLS.changeConfigToOnWinLinux
76-
);
77-
switch (options.get(EditorOption.accessibilitySupport)) {
78-
case AccessibilitySupport.Unknown:
79-
content.push(turnOnMessage);
80-
break;
81-
case AccessibilitySupport.Enabled:
82-
content.push(AccessibilityHelpNLS.auto_on);
83-
break;
84-
case AccessibilitySupport.Disabled:
85-
content.push(AccessibilityHelpNLS.auto_off, turnOnMessage);
86-
break;
87-
}
88-
8968
if (options.get(EditorOption.tabFocusMode)) {
9069
content.push(this._descriptionForCommand(ToggleTabFocusModeAction.ID, AccessibilityHelpNLS.tabFocusModeOnMsg, AccessibilityHelpNLS.tabFocusModeOnMsgNoKb));
9170
} else {

src/vs/workbench/contrib/accessibility/browser/accessibleView.ts

Lines changed: 36 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55

66
import { IKeyboardEvent } from 'vs/base/browser/keyboardEvent';
77
import { KeyCode } from 'vs/base/common/keyCodes';
8+
import { isMacintosh } from 'vs/base/common/platform';
89
import { Disposable, DisposableStore, IDisposable } from 'vs/base/common/lifecycle';
910
import { URI } from 'vs/base/common/uri';
1011
import { IEditorConstructionOptions } from 'vs/editor/browser/config/editorConfiguration';
@@ -15,6 +16,7 @@ import { IModelService } from 'vs/editor/common/services/model';
1516
import { AccessibilityHelpNLS } from 'vs/editor/common/standaloneStrings';
1617
import { LinkDetector } from 'vs/editor/contrib/links/browser/links';
1718
import { localize } from 'vs/nls';
19+
import { IAccessibilityService } from 'vs/platform/accessibility/common/accessibility';
1820
import { IConfigurationService } from 'vs/platform/configuration/common/configuration';
1921
import { IContextKey, IContextKeyService, RawContextKey } from 'vs/platform/contextkey/common/contextkey';
2022
import { IContextViewDelegate, IContextViewService } from 'vs/platform/contextview/browser/contextView';
@@ -62,13 +64,16 @@ class AccessibleView extends Disposable {
6264
private _accessiblityHelpIsShown: IContextKey<boolean>;
6365
get editorWidget() { return this._editorWidget; }
6466
private _editorContainer: HTMLElement;
67+
private _currentProvider: IAccessibleContentProvider | undefined;
68+
6569
constructor(
6670
@IOpenerService private readonly _openerService: IOpenerService,
6771
@IInstantiationService private readonly _instantiationService: IInstantiationService,
6872
@IConfigurationService private readonly _configurationService: IConfigurationService,
6973
@IModelService private readonly _modelService: IModelService,
7074
@IContextViewService private readonly _contextViewService: IContextViewService,
71-
@IContextKeyService private readonly _contextKeyService: IContextKeyService
75+
@IContextKeyService private readonly _contextKeyService: IContextKeyService,
76+
@IAccessibilityService private readonly _accessibilityService: IAccessibilityService
7277
) {
7378
super();
7479
this._accessiblityHelpIsShown = accessibilityHelpIsShown.bindTo(this._contextKeyService);
@@ -92,6 +97,16 @@ class AccessibleView extends Disposable {
9297
fontFamily: 'var(--monaco-monospace-font)'
9398
};
9499
this._editorWidget = this._register(this._instantiationService.createInstance(CodeEditorWidget, this._editorContainer, editorOptions, codeEditorWidgetOptions));
100+
this._register(this._accessibilityService.onDidChangeScreenReaderOptimized(() => {
101+
if (this._currentProvider && this._accessiblityHelpIsShown.get()) {
102+
this.show(this._currentProvider);
103+
}
104+
}));
105+
this._register(this._configurationService.onDidChangeConfiguration(e => {
106+
if (this._currentProvider && this._accessiblityHelpIsShown.get() && e.affectsConfiguration(`accessibility.verbosity.${this._currentProvider.id}`)) {
107+
this.show(this._currentProvider);
108+
}
109+
}));
95110
}
96111

97112
show(provider: IAccessibleContentProvider): void {
@@ -104,6 +119,7 @@ class AccessibleView extends Disposable {
104119
if (provider.options.type === AccessibleViewType.HelpMenu) {
105120
this._accessiblityHelpIsShown.reset();
106121
}
122+
this._currentProvider = undefined;
107123
}
108124
};
109125
this._contextViewService.showContextView(delegate);
@@ -113,11 +129,29 @@ class AccessibleView extends Disposable {
113129
}
114130

115131
private _render(provider: IAccessibleContentProvider, container: HTMLElement): IDisposable {
132+
this._currentProvider = provider;
116133
const settingKey = `accessibility.verbosity.${provider.id}`;
117134
const value = this._configurationService.getValue(settingKey);
118135
const readMoreLink = provider.options.readMoreUrl ? localize("openDoc", "\nPress H now to open a browser window with more information related to accessibility.\n") : '';
119136
const disableHelpHint = provider.options.type === AccessibleViewType.HelpMenu && !!value ? localize('disable-help-hint', '\nTo disable the `accessibility.verbosity` hint for this feature, press D now.\n') : '\n';
120-
const fragment = provider.provideContent() + readMoreLink + disableHelpHint + localize('exit-tip', 'Exit this menu via the Escape key.');
137+
const accessibilitySupport = this._accessibilityService.isScreenReaderOptimized();
138+
let message = '';
139+
if (provider.options.type === AccessibleViewType.HelpMenu) {
140+
const turnOnMessage = (
141+
isMacintosh
142+
? AccessibilityHelpNLS.changeConfigToOnMac
143+
: AccessibilityHelpNLS.changeConfigToOnWinLinux
144+
);
145+
if (accessibilitySupport && provider.id === 'editor') {
146+
message = AccessibilityHelpNLS.auto_on;
147+
message += '\n';
148+
} else if (!accessibilitySupport) {
149+
message = AccessibilityHelpNLS.auto_off + '\n' + turnOnMessage;
150+
message += '\n';
151+
}
152+
}
153+
154+
const fragment = message + provider.provideContent() + readMoreLink + disableHelpHint + localize('exit-tip', 'Exit this menu via the Escape key.');
121155

122156
this._getTextModel(URI.from({ path: `accessible-view-${provider.id}`, scheme: 'accessible-view', fragment })).then((model) => {
123157
if (!model) {

src/vs/workbench/contrib/codeEditor/browser/accessibility/accessibility.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,9 @@ import { Action2, registerAction2 } from 'vs/platform/actions/common/actions';
1212
import { accessibilityHelpIsShown } from 'vs/workbench/contrib/accessibility/browser/accessibleView';
1313
import { KeybindingWeight } from 'vs/platform/keybinding/common/keybindingsRegistry';
1414
import { KeyCode, KeyMod } from 'vs/base/common/keyCodes';
15+
import { alert } from 'vs/base/browser/ui/aria/aria';
16+
import { AccessibilityHelpNLS } from 'vs/editor/common/standaloneStrings';
17+
1518
class ToggleScreenReaderMode extends Action2 {
1619

1720
constructor() {
@@ -30,7 +33,9 @@ class ToggleScreenReaderMode extends Action2 {
3033
async run(accessor: ServicesAccessor): Promise<void> {
3134
const accessibiiltyService = accessor.get(IAccessibilityService);
3235
const configurationService = accessor.get(IConfigurationService);
33-
configurationService.updateValue('editor.accessibilitySupport', accessibiiltyService.isScreenReaderOptimized() ? 'off' : 'on', ConfigurationTarget.USER);
36+
const isScreenReaderOptimized = accessibiiltyService.isScreenReaderOptimized();
37+
configurationService.updateValue('editor.accessibilitySupport', isScreenReaderOptimized ? 'off' : 'on', ConfigurationTarget.USER);
38+
alert(isScreenReaderOptimized ? AccessibilityHelpNLS.screenReaderModeDisabled : AccessibilityHelpNLS.screenReaderModeEnabled);
3439
}
3540
}
3641

0 commit comments

Comments
 (0)