Skip to content

Commit

Permalink
Merge pull request #161620 from microsoft/tyriar/lazy_find
Browse files Browse the repository at this point in the history
Create terminal find widget lazily
  • Loading branch information
Tyriar committed Sep 23, 2022
2 parents e42b88d + 430f212 commit 7245303
Show file tree
Hide file tree
Showing 5 changed files with 46 additions and 22 deletions.
5 changes: 4 additions & 1 deletion src/vs/workbench/contrib/terminal/browser/terminal.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
import { Orientation } from 'vs/base/browser/ui/splitview/splitview';
import { IAction } from 'vs/base/common/actions';
import { Event } from 'vs/base/common/event';
import { Lazy } from 'vs/base/common/lazy';
import { IDisposable } from 'vs/base/common/lifecycle';
import { OperatingSystem } from 'vs/base/common/platform';
import { URI } from 'vs/base/common/uri';
Expand Down Expand Up @@ -460,7 +461,7 @@ export interface ITerminalInstance {

contextualActions: IContextualAction | undefined;

readonly findWidget: TerminalFindWidget;
readonly findWidget: Lazy<TerminalFindWidget>;

/**
* The process ID of the shell process, this is undefined when there is no process associated
Expand Down Expand Up @@ -583,6 +584,8 @@ export interface ITerminalInstance {

onDidChangeFindResults: Event<{ resultIndex: number; resultCount: number } | undefined>;

onDidFocusFindWidget: Event<void>;

readonly exitCode: number | undefined;

readonly exitReason: TerminalExitReason | undefined;
Expand Down
24 changes: 15 additions & 9 deletions src/vs/workbench/contrib/terminal/browser/terminalActions.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1091,7 +1091,7 @@ export function registerTerminalActions() {
});
}
run(accessor: ServicesAccessor) {
accessor.get(ITerminalService).activeInstance?.findWidget.reveal();
accessor.get(ITerminalService).activeInstance?.findWidget.getValue().reveal();
}
});
registerAction2(class extends Action2 {
Expand All @@ -1111,7 +1111,7 @@ export function registerTerminalActions() {
});
}
run(accessor: ServicesAccessor) {
accessor.get(ITerminalService).activeInstance?.findWidget.hide();
accessor.get(ITerminalService).activeInstance?.findWidget.getValue().hide();
}
});

Expand Down Expand Up @@ -1464,7 +1464,7 @@ export function registerTerminalActions() {
}
run(accessor: ServicesAccessor) {
const terminalService = accessor.get(ITerminalService);
const state = terminalService.activeInstance?.findWidget.findState;
const state = terminalService.activeInstance?.findWidget.getValue().findState;
state?.change({ isRegex: !state.isRegex }, false);
}
});
Expand All @@ -1486,7 +1486,7 @@ export function registerTerminalActions() {
}
run(accessor: ServicesAccessor) {
const terminalService = accessor.get(ITerminalService);
const state = terminalService.activeInstance?.findWidget.findState;
const state = terminalService.activeInstance?.findWidget.getValue().findState;
state?.change({ wholeWord: !state.wholeWord }, false);
}
});
Expand All @@ -1508,7 +1508,7 @@ export function registerTerminalActions() {
}
run(accessor: ServicesAccessor) {
const terminalService = accessor.get(ITerminalService);
const state = terminalService.activeInstance?.findWidget.findState;
const state = terminalService.activeInstance?.findWidget.getValue().findState;
state?.change({ matchCase: !state.matchCase }, false);
}
});
Expand Down Expand Up @@ -1537,8 +1537,11 @@ export function registerTerminalActions() {
}
run(accessor: ServicesAccessor) {
const terminalService = accessor.get(ITerminalService);
terminalService.activeInstance?.findWidget.show();
terminalService.activeInstance?.findWidget.find(false);
const findWidget = terminalService.activeInstance?.findWidget.getValue();
if (findWidget) {
findWidget.show();
findWidget.find(false);
}
}
});
registerAction2(class extends Action2 {
Expand Down Expand Up @@ -1566,8 +1569,11 @@ export function registerTerminalActions() {
}
run(accessor: ServicesAccessor) {
const terminalService = accessor.get(ITerminalService);
terminalService.activeInstance?.findWidget.show();
terminalService.activeInstance?.findWidget.find(true);
const findWidget = terminalService.activeInstance?.findWidget.getValue();
if (findWidget) {
findWidget.show();
findWidget.find(true);
}
}
});
registerAction2(class extends Action2 {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,7 @@ export class TerminalEditor extends EditorPane {
// panel and the editors, this is needed so that the active instance gets set
// when focus changes between them.
this._register(this._editorInput.terminalInstance.onDidFocus(() => this._setActiveInstance()));
this._register(this._editorInput.terminalInstance.findWidget.focusTracker.onDidFocus(() => this._setActiveInstance()));
this._register(this._editorInput.terminalInstance.onDidFocusFindWidget(() => this._setActiveInstance()));
this._editorInput.setCopyLaunchConfig(this._editorInput.terminalInstance.shellLaunchConfig);
}
}
Expand Down
2 changes: 1 addition & 1 deletion src/vs/workbench/contrib/terminal/browser/terminalGroup.ts
Original file line number Diff line number Diff line change
Expand Up @@ -369,7 +369,7 @@ export class TerminalGroup extends Disposable implements ITerminalGroup {
this._setActiveInstance(instance);
this._onDidFocusInstance.fire(instance);
}),
instance.findWidget.focusTracker.onDidFocus(() => this._setActiveInstance(instance)),
instance.onDidFocusFindWidget(() => this._setActiveInstance(instance)),
instance.capabilities.onDidAddCapability(() => this._onDidChangeInstanceCapability.fire(instance)),
instance.capabilities.onDidRemoveCapability(() => this._onDidChangeInstanceCapability.fire(instance)),
]);
Expand Down
35 changes: 25 additions & 10 deletions src/vs/workbench/contrib/terminal/browser/terminalInstance.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ import { ErrorNoTelemetry } from 'vs/base/common/errors';
import { Emitter, Event } from 'vs/base/common/event';
import { KeyCode } from 'vs/base/common/keyCodes';
import { ISeparator, template } from 'vs/base/common/labels';
import { Lazy } from 'vs/base/common/lazy';
import { Disposable, dispose, IDisposable, toDisposable } from 'vs/base/common/lifecycle';
import { Schemas } from 'vs/base/common/network';
import * as path from 'vs/base/common/path';
Expand Down Expand Up @@ -218,7 +219,7 @@ export class TerminalInstance extends Disposable implements ITerminalInstance {
*/
get contextualActions(): IContextualAction | undefined { return this._contextualActionAddon; }

readonly findWidget: TerminalFindWidget;
readonly findWidget: Lazy<TerminalFindWidget>;

xterm?: XtermTerminal;
disableLayout: boolean = false;
Expand Down Expand Up @@ -355,6 +356,8 @@ export class TerminalInstance extends Disposable implements ITerminalInstance {
readonly onDidChangeHasChildProcesses = this._onDidChangeHasChildProcesses.event;
private readonly _onDidChangeFindResults = new Emitter<{ resultIndex: number; resultCount: number } | undefined>();
readonly onDidChangeFindResults = this._onDidChangeFindResults.event;
private readonly _onDidFocusFindWidget = new Emitter<void>();
readonly onDidFocusFindWidget = this._onDidFocusFindWidget.event;

constructor(
private readonly _terminalShellTypeContextKey: IContextKey<string>,
Expand Down Expand Up @@ -446,7 +449,18 @@ export class TerminalInstance extends Disposable implements ITerminalInstance {
this._terminalAltBufferActiveContextKey = TerminalContextKeys.altBufferActive.bindTo(scopedContextKeyService);
this._terminalShellIntegrationEnabledContextKey = TerminalContextKeys.terminalShellIntegrationEnabled.bindTo(scopedContextKeyService);

this.findWidget = this._scopedInstantiationService.createInstance(TerminalFindWidget, new FindReplaceState(), this);
this.findWidget = new Lazy(() => {
const findWidget = this._scopedInstantiationService.createInstance(TerminalFindWidget, new FindReplaceState(), this);
this._register(findWidget.focusTracker.onDidFocus(() => {
this._container?.classList.toggle('find-focused', true);
this._onDidFocusFindWidget.fire();
}));
this._register(findWidget.focusTracker.onDidBlur(() => this._container?.classList.toggle('find-focused', false)));
if (this._container) {
this._container.appendChild(findWidget.getDomNode());
}
return findWidget;
});

this._logService.trace(`terminalInstance#ctor (instanceId: ${this.instanceId})`, this._shellLaunchConfig);
this._register(this.capabilities.onDidAddCapability(e => {
Expand Down Expand Up @@ -573,9 +587,6 @@ export class TerminalInstance extends Disposable implements ITerminalInstance {
window.clearTimeout(initialDataEventsTimeout);
}
}));

this._register(this.findWidget.focusTracker.onDidFocus(() => this._container?.classList.toggle('find-focused', true)));
this._register(this.findWidget.focusTracker.onDidBlur(() => this._container?.classList.toggle('find-focused', false)));
}

private _getIcon(): TerminalIcon | undefined {
Expand Down Expand Up @@ -881,7 +892,9 @@ export class TerminalInstance extends Disposable implements ITerminalInstance {
// The container changed, reattach
this._container = container;
this._container.appendChild(this._wrapperElement);
this._container.appendChild(this.findWidget.getDomNode());
if (this.findWidget.hasValue()) {
this._container.appendChild(this.findWidget.getValue().getDomNode());
}
setTimeout(() => this._initDragAndDrop(container));
}

Expand All @@ -903,7 +916,9 @@ export class TerminalInstance extends Disposable implements ITerminalInstance {
this._wrapperElement.appendChild(xtermElement);

this._container.appendChild(this._wrapperElement);
this._container.appendChild(this.findWidget.getDomNode());
if (this.findWidget.hasValue()) {
this._container.appendChild(this.findWidget.getValue().getDomNode());
}

const xterm = this.xterm;

Expand All @@ -912,7 +927,7 @@ export class TerminalInstance extends Disposable implements ITerminalInstance {

const screenElement = xterm.attachToElement(xtermElement);

this._register(xterm.onDidChangeFindResults(() => this.findWidget.updateResultCount()));
this._register(xterm.onDidChangeFindResults(() => this.findWidget.getValue().updateResultCount()));
this._register(xterm.shellIntegration.onDidChangeStatus(() => {
if (this.hasFocus) {
this._setShellIntegrationContextKey();
Expand Down Expand Up @@ -1183,7 +1198,7 @@ export class TerminalInstance extends Disposable implements ITerminalInstance {
dispose(this._linkManager);
this._linkManager = undefined;
dispose(this._widgetManager);
dispose(this.findWidget);
dispose(this.findWidget.rawValue);

if (this.xterm?.raw.element) {
this._hadFocusOnExit = this.hasFocus;
Expand Down Expand Up @@ -1838,7 +1853,7 @@ export class TerminalInstance extends Disposable implements ITerminalInstance {
}

this._resize();
this.findWidget.layout(dimension.width);
this.findWidget.rawValue?.layout(dimension.width);

// Signal the container is ready
this._containerReadyBarrier.open();
Expand Down

0 comments on commit 7245303

Please sign in to comment.