diff --git a/package.json b/package.json index a35d2217e5a..c25c90837b2 100644 --- a/package.json +++ b/package.json @@ -45,7 +45,7 @@ "vscode-debugprotocol": "1.25.0", "vscode-ripgrep": "^0.7.1-patch.0", "vscode-textmate": "^3.2.0", - "vscode-xterm": "3.0.0-beta4", + "vscode-xterm": "3.0.0-beta8", "yauzl": "2.8.0" }, "devDependencies": { diff --git a/src/typings/vscode-xterm.d.ts b/src/typings/vscode-xterm.d.ts index 72172715060..a8000eec916 100644 --- a/src/typings/vscode-xterm.d.ts +++ b/src/typings/vscode-xterm.d.ts @@ -72,6 +72,13 @@ declare module 'vscode-xterm' { */ rows?: number; + /** + * Whether screen reader support is enabled. When on this will expose + * supporting elements in the DOM to support NVDA on Windows and VoiceOver + * on macOS. + */ + screenReaderMode?: boolean; + /** * The amount of scrollback in the terminal. Scrollback is the amount of rows * that are retained when lines are scrolled beyond the initial viewport. diff --git a/src/vs/workbench/parts/terminal/common/terminal.ts b/src/vs/workbench/parts/terminal/common/terminal.ts index 351a062f543..cd837dd9be5 100644 --- a/src/vs/workbench/parts/terminal/common/terminal.ts +++ b/src/vs/workbench/parts/terminal/common/terminal.ts @@ -337,6 +337,12 @@ export interface ITerminalInstance { */ updateConfig(): void; + /** + * Updates the accessibility support state of the terminal instance. + * @param isEnabled Whether it's enabled. + */ + updateAccessibilitySupport(isEnabled: boolean): void; + /** * Configure the dimensions of the terminal instance. * diff --git a/src/vs/workbench/parts/terminal/common/terminalService.ts b/src/vs/workbench/parts/terminal/common/terminalService.ts index d838902de0a..4683d7a6250 100644 --- a/src/vs/workbench/parts/terminal/common/terminalService.ts +++ b/src/vs/workbench/parts/terminal/common/terminalService.ts @@ -12,6 +12,7 @@ import { IPartService } from 'vs/workbench/services/part/common/partService'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { ITerminalService, ITerminalInstance, IShellLaunchConfig, ITerminalConfigHelper, KEYBINDING_CONTEXT_TERMINAL_FOCUS, KEYBINDING_CONTEXT_TERMINAL_FIND_WIDGET_VISIBLE, TERMINAL_PANEL_ID } from 'vs/workbench/parts/terminal/common/terminal'; import { TPromise } from 'vs/base/common/winjs.base'; +import { IEditorOptions } from 'vs/editor/common/config/editorOptions'; export abstract class TerminalService implements ITerminalService { public _serviceBrand: any; @@ -63,6 +64,9 @@ export abstract class TerminalService implements ITerminalService { if (e.affectsConfiguration('terminal.integrated')) { this.updateConfig(); } + if (e.affectsConfiguration('editor.accessibilitySupport')) { + this.updateAccessibilitySupport(); + } }); lifecycleService.onWillShutdown(event => event.veto(this._onWillShutdown())); lifecycleService.onShutdown(() => this._onShutdown()); @@ -240,6 +244,11 @@ export abstract class TerminalService implements ITerminalService { this.terminalInstances.forEach(instance => instance.updateConfig()); } + public updateAccessibilitySupport(): void { + const isEnabled = this._configurationService.getValue('editor').accessibilitySupport === 'on'; + this.terminalInstances.forEach(instance => instance.updateAccessibilitySupport(isEnabled)); + } + public setWorkspaceShellAllowed(isAllowed: boolean): void { this.configHelper.setWorkspaceShellAllowed(isAllowed); } diff --git a/src/vs/workbench/parts/terminal/electron-browser/media/xterm.css b/src/vs/workbench/parts/terminal/electron-browser/media/xterm.css index 31206060c2b..aadbf436fc4 100644 --- a/src/vs/workbench/parts/terminal/electron-browser/media/xterm.css +++ b/src/vs/workbench/parts/terminal/electron-browser/media/xterm.css @@ -126,3 +126,24 @@ .xterm:not(.enable-mouse-events) { cursor: text; } + +.xterm .accessibility { + position: absolute; + left: 0; + top: 0; + bottom: 0; + right: 0; + z-index: 100; +} + +.xterm .accessibility-tree { + color: transparent; +} + +.xterm .live-region { + position: absolute; + left: -9999px; + width: 1px; + height: 1px; + overflow: hidden; +} diff --git a/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.ts b/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.ts index e0f79021139..1b9729cf302 100644 --- a/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.ts +++ b/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.ts @@ -37,6 +37,8 @@ import { ansiColorIdentifiers, TERMINAL_BACKGROUND_COLOR, TERMINAL_FOREGROUND_CO import { PANEL_BACKGROUND } from 'vs/workbench/common/theme'; import { IConfigurationResolverService } from 'vs/workbench/services/configurationResolver/common/configurationResolver'; import { IWorkspaceContextService, IWorkspaceFolder } from 'vs/platform/workspace/common/workspace'; +import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; +import { IEditorOptions } from 'vs/editor/common/config/editorOptions'; /** The amount of time to consider terminal errors to be related to the launch */ const LAUNCHING_DURATION = 500; @@ -125,7 +127,8 @@ export class TerminalInstance implements ITerminalInstance { @IHistoryService private _historyService: IHistoryService, @IThemeService private _themeService: IThemeService, @IConfigurationResolverService private _configurationResolverService: IConfigurationResolverService, - @IWorkspaceContextService private _workspaceContextService: IWorkspaceContextService + @IWorkspaceContextService private _workspaceContextService: IWorkspaceContextService, + @IConfigurationService private _configurationService: IConfigurationService ) { this._instanceDisposables = []; this._processDisposables = []; @@ -260,6 +263,7 @@ export class TerminalInstance implements ITerminalInstance { // Enable the winpty compatibility addon which will simulate wraparound mode Terminal.applyAddon(require.__$__nodeRequire('vscode-xterm/lib/addons/winptyCompat/winptyCompat')); } + const accessibilitySupport = this._configurationService.getValue('editor').accessibilitySupport; const font = this._configHelper.getFont(true); this._xterm = new Terminal({ scrollback: this._configHelper.config.scrollback, @@ -268,7 +272,8 @@ export class TerminalInstance implements ITerminalInstance { fontSize: font.fontSize, lineHeight: font.lineHeight, enableBold: this._configHelper.config.enableBold, - bellStyle: this._configHelper.config.enableBell ? 'sound' : 'none' + bellStyle: this._configHelper.config.enableBell ? 'sound' : 'none', + screenReaderMode: accessibilitySupport === 'on' }); if (this._shellLaunchConfig.initialText) { this._xterm.writeln(this._shellLaunchConfig.initialText); @@ -963,6 +968,10 @@ export class TerminalInstance implements ITerminalInstance { this._setEnableBell(this._configHelper.config.enableBell); } + public updateAccessibilitySupport(isEnabled: boolean): void { + this._xterm.setOption('screenReaderMode', isEnabled); + } + private _setCursorBlink(blink: boolean): void { if (this._xterm && this._xterm.getOption('cursorBlink') !== blink) { this._xterm.setOption('cursorBlink', blink); diff --git a/yarn.lock b/yarn.lock index 329be0de8ee..42e334c53da 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5808,9 +5808,9 @@ vscode-textmate@^3.2.0: fast-plist "^0.1.2" oniguruma "^6.0.1" -vscode-xterm@3.0.0-beta4: - version "3.0.0-beta4" - resolved "https://registry.yarnpkg.com/vscode-xterm/-/vscode-xterm-3.0.0-beta4.tgz#011b580c3ac91181ed70d46a8a33a63a84a17938" +vscode-xterm@3.0.0-beta8: + version "3.0.0-beta8" + resolved "https://registry.yarnpkg.com/vscode-xterm/-/vscode-xterm-3.0.0-beta8.tgz#7e7d5f399d76992e07e5099aea9a1732ad40f7c1" vso-node-api@^6.1.2-preview: version "6.1.2-preview"