Skip to content

Commit e550098

Browse files
authored
Merge pull request #197258 from microsoft/merogge/focus-view
add setting to focus accessible view on command execution
2 parents a2516df + 625fb19 commit e550098

File tree

4 files changed

+46
-3
lines changed

4 files changed

+46
-3
lines changed

src/vs/platform/terminal/common/terminal.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,7 @@ export const enum TerminalSettingId {
117117
IgnoreBracketedPasteMode = 'terminal.integrated.ignoreBracketedPasteMode',
118118
FocusAfterRun = 'terminal.integrated.focusAfterRun',
119119
AccessibleViewPreserveCursorPosition = 'terminal.integrated.accessibleViewPreserveCursorPosition',
120+
AccessibleViewFocusOnCommandExecution = 'terminal.integrated.accessibleViewFocusOnCommandExecution',
120121

121122
// Debug settings that are hidden from user
122123

src/vs/workbench/contrib/terminal/common/terminalConfiguration.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -619,7 +619,12 @@ const terminalConfiguration: IConfigurationNode = {
619619
markdownDescription: localize('terminal.integrated.accessibleViewPreserveCursorPosition', "Preserve the cursor position on reopen of the terminal's accessible view rather than setting it to the bottom of the buffer."),
620620
type: 'boolean',
621621
default: false
622-
}
622+
},
623+
[TerminalSettingId.AccessibleViewFocusOnCommandExecution]: {
624+
markdownDescription: localize('terminal.integrated.accessibleViewFocusOnCommandExecution', "Focus the terminal accessible view when a command is executed."),
625+
type: 'boolean',
626+
default: false
627+
},
623628
}
624629
};
625630

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

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
*--------------------------------------------------------------------------------------------*/
55

66
import { KeyCode, KeyMod } from 'vs/base/common/keyCodes';
7-
import { Disposable, DisposableStore } from 'vs/base/common/lifecycle';
7+
import { Disposable, DisposableStore, IDisposable, MutableDisposable } from 'vs/base/common/lifecycle';
88
import { localize } from 'vs/nls';
99
import { CONTEXT_ACCESSIBILITY_MODE_ENABLED } from 'vs/platform/accessibility/common/accessibility';
1010
import { Action2, registerAction2 } from 'vs/platform/actions/common/actions';
@@ -66,6 +66,8 @@ export class TerminalAccessibleViewContribution extends Disposable implements IT
6666
private _bufferTracker: BufferContentTracker | undefined;
6767
private _bufferProvider: TerminalAccessibleBufferProvider | undefined;
6868
private _xterm: Pick<IXtermTerminal, 'shellIntegration' | 'getFont'> & { raw: Terminal } | undefined;
69+
private _onCommandExecutedShowListener: MutableDisposable<IDisposable> = new MutableDisposable();
70+
6971
constructor(
7072
private readonly _instance: ITerminalInstance,
7173
processManager: ITerminalProcessManager,
@@ -91,7 +93,18 @@ export class TerminalAccessibleViewContribution extends Disposable implements IT
9193
this.show();
9294
}
9395
}));
96+
this._register(this._configurationService.onDidChangeConfiguration(e => {
97+
if (e.affectsConfiguration(TerminalSettingId.AccessibleViewFocusOnCommandExecution)) {
98+
this._updateCommandExecutedListener();
99+
}
100+
}));
101+
this._register(this._instance.capabilities.onDidAddCapability(e => {
102+
if (e.capability.type === TerminalCapability.CommandDetection) {
103+
this._updateCommandExecutedListener();
104+
}
105+
}));
94106
}
107+
95108
xtermReady(xterm: IXtermTerminal & { raw: Terminal }): void {
96109
const addon = this._instantiationService.createInstance(TextAreaSyncAddon, this._instance.capabilities);
97110
xterm.raw.loadAddon(addon);
@@ -111,6 +124,25 @@ export class TerminalAccessibleViewContribution extends Disposable implements IT
111124
}));
112125
}
113126

127+
private _updateCommandExecutedListener(): void {
128+
if (!this._instance.capabilities.has(TerminalCapability.CommandDetection)) {
129+
return;
130+
}
131+
if (!this._configurationService.getValue(TerminalSettingId.AccessibleViewFocusOnCommandExecution)) {
132+
this._onCommandExecutedShowListener.clear();
133+
return;
134+
} else if (this._onCommandExecutedShowListener.value) {
135+
return;
136+
}
137+
138+
const capability = this._instance.capabilities.get(TerminalCapability.CommandDetection)!;
139+
this._onCommandExecutedShowListener.value = this._register(capability.onCommandExecuted(() => {
140+
if (this._instance.hasFocus) {
141+
this.show();
142+
}
143+
}));
144+
}
145+
114146
private _isTerminalAccessibleViewOpen(): boolean {
115147
return accessibleViewCurrentProviderId.getValue(this._contextKeyService) === AccessibleViewProviderId.Terminal;
116148
}

src/vs/workbench/contrib/terminalContrib/accessibility/browser/terminalAccessibilityHelp.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import { AccessibilityCommandId } from 'vs/workbench/contrib/accessibility/commo
1818
import { ITerminalInstance, IXtermTerminal } from 'vs/workbench/contrib/terminal/browser/terminal';
1919
import { TerminalCommandId } from 'vs/workbench/contrib/terminal/common/terminal';
2020
import type { Terminal } from '@xterm/xterm';
21+
import { IConfigurationService } from 'vs/platform/configuration/common/configuration';
2122

2223
export const enum ClassName {
2324
Active = 'active',
@@ -49,7 +50,8 @@ export class TerminalAccessibilityHelpProvider extends Disposable implements IAc
4950
@IKeybindingService private readonly _keybindingService: IKeybindingService,
5051
@IContextKeyService private readonly _contextKeyService: IContextKeyService,
5152
@ICommandService private readonly _commandService: ICommandService,
52-
@IAccessibilityService private readonly _accessibilityService: IAccessibilityService
53+
@IAccessibilityService private readonly _accessibilityService: IAccessibilityService,
54+
@IConfigurationService private readonly _configurationService: IConfigurationService
5355
) {
5456
super();
5557
this._hasShellIntegration = _xterm.shellIntegration.status === ShellIntegrationStatus.VSCode;
@@ -77,6 +79,9 @@ export class TerminalAccessibilityHelpProvider extends Disposable implements IAc
7779
const content = [];
7880
content.push(this._descriptionForCommand(TerminalCommandId.FocusAccessibleBuffer, localize('focusAccessibleTerminalView', 'The Focus Accessible Terminal View ({0}) command enables screen readers to read terminal contents.'), localize('focusAccessibleTerminalViewNoKb', 'The Focus Terminal Accessible View command enables screen readers to read terminal contents and is currently not triggerable by a keybinding.')));
7981
content.push(localize('preserveCursor', 'Customize the behavior of the cursor when toggling between the terminal and accessible view with `terminal.integrated.accessibleViewPreserveCursorPosition.`'));
82+
if (!this._configurationService.getValue(TerminalSettingId.AccessibleViewFocusOnCommandExecution)) {
83+
content.push(localize('focusViewOnExecution', 'Enable `terminal.integrated.accessibleViewFocusOnCommandExecution` to automatically focus the terminal accessible view when a command is executed in the terminal.'));
84+
}
8085
if (this._instance.shellType === WindowsShellType.CommandPrompt) {
8186
content.push(localize('commandPromptMigration', "Consider using powershell instead of command prompt for an improved experience"));
8287
}

0 commit comments

Comments
 (0)