diff --git a/src/vs/workbench/contrib/accessibility/browser/accessibleView.ts b/src/vs/workbench/contrib/accessibility/browser/accessibleView.ts index bbde0f86f2c..568d0719d21 100644 --- a/src/vs/workbench/contrib/accessibility/browser/accessibleView.ts +++ b/src/vs/workbench/contrib/accessibility/browser/accessibleView.ts @@ -101,6 +101,7 @@ export interface IAccessibleViewOptions { */ language?: string; type: AccessibleViewType; + positionBottom?: boolean; } export class AccessibleView extends Disposable { @@ -412,6 +413,14 @@ export class AccessibleView extends Disposable { } this._editorWidget.updateOptions({ ariaLabel }); this._editorWidget.focus(); + if (this._currentProvider?.options.positionBottom) { + const lastLine = this.editorWidget.getModel()?.getLineCount(); + const position = lastLine !== undefined && lastLine > 0 ? new Position(lastLine, 1) : undefined; + if (position) { + this._editorWidget.setPosition(position); + this._editorWidget.revealLine(position.lineNumber); + } + } }); this._updateToolbar(provider.actions, provider.options.type); diff --git a/src/vs/workbench/contrib/terminalContrib/accessibility/browser/terminal.accessibility.contribution.ts b/src/vs/workbench/contrib/terminalContrib/accessibility/browser/terminal.accessibility.contribution.ts index 88e56b61679..bd9d7f3b50b 100644 --- a/src/vs/workbench/contrib/terminalContrib/accessibility/browser/terminal.accessibility.contribution.ts +++ b/src/vs/workbench/contrib/terminalContrib/accessibility/browser/terminal.accessibility.contribution.ts @@ -8,7 +8,7 @@ import { Disposable, DisposableStore } from 'vs/base/common/lifecycle'; import { localize } from 'vs/nls'; import { CONTEXT_ACCESSIBILITY_MODE_ENABLED } from 'vs/platform/accessibility/common/accessibility'; import { Action2, registerAction2 } from 'vs/platform/actions/common/actions'; -import { ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey'; +import { ContextKeyExpr, IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; import { IInstantiationService, ServicesAccessor } from 'vs/platform/instantiation/common/instantiation'; import { KeybindingWeight } from 'vs/platform/keybinding/common/keybindingsRegistry'; import { ITerminalCommand, TerminalCapability } from 'vs/platform/terminal/common/capabilities/capabilities'; @@ -68,7 +68,8 @@ export class TerminalAccessibleViewContribution extends Disposable implements IT @IAccessibleViewService private readonly _accessibleViewService: IAccessibleViewService, @IInstantiationService private readonly _instantiationService: IInstantiationService, @ITerminalService private readonly _terminalService: ITerminalService, - @IConfigurationService configurationService: IConfigurationService) { + @IConfigurationService configurationService: IConfigurationService, + @IContextKeyService private readonly _contextKeyService: IContextKeyService) { super(); this._register(AccessibleViewAction.addImplementation(90, 'terminal', () => { if (this._terminalService.activeInstance !== this._instance) { @@ -92,14 +93,24 @@ export class TerminalAccessibleViewContribution extends Disposable implements IT addon.activate(xterm.raw); this._xterm = xterm; this._register(this._xterm.raw.onWriteParsed(async () => { - if (this._xterm!.raw.buffer.active.baseY === 0) { + if (this._isTerminalAccessibleViewOpen() && this._xterm!.raw.buffer.active.baseY === 0) { this._bufferTracker?.update(); this.show(); } })); + const onRequestUpdateEditor = Event.latch(this._xterm.raw.onScroll); - this._register(onRequestUpdateEditor(() => this.show())); + this._register(onRequestUpdateEditor(() => { + if (this._isTerminalAccessibleViewOpen()) { + this.show(); + } + })); } + + private _isTerminalAccessibleViewOpen(): boolean { + return accessibleViewCurrentProviderId.getValue(this._contextKeyService) === AccessibleViewProviderId.Terminal; + } + show(): void { if (!this._xterm) { return; @@ -108,14 +119,6 @@ export class TerminalAccessibleViewContribution extends Disposable implements IT this._bufferTracker = this._register(this._instantiationService.createInstance(BufferContentTracker, this._xterm)); } this._accessibleViewService.show(this._instantiationService.createInstance(TerminalAccessibleBufferProvider, this._instance, this._bufferTracker)); - // wait for the render to happen so that the line count is correct and - // the cursor is at the bottom of the buffer - setTimeout(() => { - const lastPosition = this._accessibleViewService.getLastPosition(); - if (lastPosition) { - this._accessibleViewService.setPosition(lastPosition, true); - } - }, 50); } navigateToCommand(type: NavigationType): void { const currentLine = this._accessibleViewService.getPosition()?.lineNumber || this._accessibleViewService.getLastPosition()?.lineNumber; diff --git a/src/vs/workbench/contrib/terminalContrib/accessibility/browser/terminalAccessibleBufferProvider.ts b/src/vs/workbench/contrib/terminalContrib/accessibility/browser/terminalAccessibleBufferProvider.ts index 7b870c37e52..07d4b28f474 100644 --- a/src/vs/workbench/contrib/terminalContrib/accessibility/browser/terminalAccessibleBufferProvider.ts +++ b/src/vs/workbench/contrib/terminalContrib/accessibility/browser/terminalAccessibleBufferProvider.ts @@ -16,7 +16,7 @@ import { BufferContentTracker } from 'vs/workbench/contrib/terminalContrib/acces import type { Terminal } from 'xterm'; export class TerminalAccessibleBufferProvider extends DisposableStore implements IAccessibleContentProvider { - options: IAccessibleViewOptions = { type: AccessibleViewType.View, language: 'terminal' }; + options: IAccessibleViewOptions = { type: AccessibleViewType.View, language: 'terminal', positionBottom: true }; verbositySettingKey = AccessibilityVerbositySettingId.Terminal; private _xterm: IXtermTerminal & { raw: Terminal } | undefined; constructor(