From 137dcc4463bf7b2efe972ebbedb42e0de95c9d04 Mon Sep 17 00:00:00 2001 From: Rob Lourens Date: Mon, 26 Oct 2020 14:57:10 -0700 Subject: [PATCH] Fix not putting focus in the integrated terminal when it's first shown. This is a little hacky and we might want to rethink it but should be safe and fine --- .../contrib/terminal/browser/terminal.ts | 1 + .../contrib/terminal/browser/terminalTab.ts | 15 +++++++++++++++ .../contrib/terminal/browser/terminalView.ts | 11 +++++++---- 3 files changed, 23 insertions(+), 4 deletions(-) diff --git a/src/vs/workbench/contrib/terminal/browser/terminal.ts b/src/vs/workbench/contrib/terminal/browser/terminal.ts index 2ba4774be33..bb6647fa270 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminal.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminal.ts @@ -59,6 +59,7 @@ export interface ITerminalTab { onDisposed: Event; onInstancesChanged: Event; + setWillFocus(focus: boolean): void; focusPreviousPane(): void; focusNextPane(): void; resizePane(direction: Direction): void; diff --git a/src/vs/workbench/contrib/terminal/browser/terminalTab.ts b/src/vs/workbench/contrib/terminal/browser/terminalTab.ts index a798660b2f7..ac96823f38d 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminalTab.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminalTab.ts @@ -219,6 +219,7 @@ export class TerminalTab extends Disposable implements ITerminalTab { private _activeInstanceIndex: number; private _isVisible: boolean = false; + private _willFocus: boolean = false; public get terminalInstances(): ITerminalInstance[] { return this._terminalInstances; } @@ -248,6 +249,16 @@ export class TerminalTab extends Disposable implements ITerminalTab { } } + /** + * Focus the current active instance, or if there isn't one yet, the first instance added + */ + setWillFocus(focus: boolean): void { + this._willFocus = focus; + if (focus && this.activeInstance) { + this.activeInstance.focusWhenReady(); + } + } + public addInstance(shellLaunchConfigOrInstance: IShellLaunchConfig | ITerminalInstance): void { let instance: ITerminalInstance; if ('id' in shellLaunchConfigOrInstance) { @@ -263,6 +274,10 @@ export class TerminalTab extends Disposable implements ITerminalTab { } this._onInstancesChanged.fire(); + + if (this.terminalInstances.length === 1 && this._willFocus) { + instance.focusWhenReady(); + } } public dispose(): void { diff --git a/src/vs/workbench/contrib/terminal/browser/terminalView.ts b/src/vs/workbench/contrib/terminal/browser/terminalView.ts index 8d9a84d5116..27ba5eba693 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminalView.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminalView.ts @@ -67,6 +67,13 @@ export class TerminalViewPane extends ViewPane { } this._onDidChangeViewWelcomeState.fire(); }); + + this._register(this.onDidFocus(() => { + this._terminalService.getActiveTab()?.setWillFocus(true); + })); + this._register(this.onDidBlur(() => { + this._terminalService.getActiveTab()?.setWillFocus(false); + })); } protected renderBody(container: HTMLElement): void { @@ -212,10 +219,6 @@ export class TerminalViewPane extends ViewPane { return super.getActionViewItem(action); } - public focus(): void { - this._terminalService.getActiveInstance()?.focusWhenReady(true); - } - public focusFindWidget() { const activeInstance = this._terminalService.getActiveInstance(); if (activeInstance && activeInstance.hasSelection() && activeInstance.selection!.indexOf('\n') === -1) {