From 90970f8c4a1f1f41cd9a2c9949990520fb7ce9d2 Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Wed, 27 Mar 2024 10:38:28 -0700 Subject: [PATCH 1/2] Don't pass store to Event.filter Fixes #208892 --- .../workbench/api/browser/mainThreadTerminalShellIntegration.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/api/browser/mainThreadTerminalShellIntegration.ts b/src/vs/workbench/api/browser/mainThreadTerminalShellIntegration.ts index 97eefc8b00e..ca3bf0f2315 100644 --- a/src/vs/workbench/api/browser/mainThreadTerminalShellIntegration.ts +++ b/src/vs/workbench/api/browser/mainThreadTerminalShellIntegration.ts @@ -29,7 +29,7 @@ export class MainThreadTerminalShellIntegration extends Disposable implements Ma return Event.map( Event.filter(instance.capabilities.onDidAddCapabilityType, e => { return e === TerminalCapability.CommandDetection; - }, this._store), () => instance + }), () => instance ); }); this._store.add(onDidAddCommandDetection(e => this._proxy.$shellIntegrationChange(e.instanceId))); From 78426fb51c76a6d335141235b2b23ca7abb9a1ba Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Thu, 28 Mar 2024 09:39:48 -0700 Subject: [PATCH 2/2] Properly dispose of ITerminalService.createOnInstanceEvent calls Fixes #208892 --- .../mainThreadTerminalShellIntegration.ts | 4 ++-- .../contrib/terminal/browser/terminal.ts | 4 ++-- .../terminal/browser/terminalService.ts | 20 +++++++++---------- 3 files changed, 14 insertions(+), 14 deletions(-) diff --git a/src/vs/workbench/api/browser/mainThreadTerminalShellIntegration.ts b/src/vs/workbench/api/browser/mainThreadTerminalShellIntegration.ts index ca3bf0f2315..044e9017d7a 100644 --- a/src/vs/workbench/api/browser/mainThreadTerminalShellIntegration.ts +++ b/src/vs/workbench/api/browser/mainThreadTerminalShellIntegration.ts @@ -25,13 +25,13 @@ export class MainThreadTerminalShellIntegration extends Disposable implements Ma this._proxy = extHostContext.getProxy(ExtHostContext.ExtHostTerminalShellIntegration); // onDidChangeTerminalShellIntegration - const onDidAddCommandDetection = this._terminalService.createOnInstanceEvent(instance => { + const onDidAddCommandDetection = this._store.add(this._terminalService.createOnInstanceEvent(instance => { return Event.map( Event.filter(instance.capabilities.onDidAddCapabilityType, e => { return e === TerminalCapability.CommandDetection; }), () => instance ); - }); + })).event; this._store.add(onDidAddCommandDetection(e => this._proxy.$shellIntegrationChange(e.instanceId))); // onDidStartTerminalShellExecution diff --git a/src/vs/workbench/contrib/terminal/browser/terminal.ts b/src/vs/workbench/contrib/terminal/browser/terminal.ts index 70018beda53..2e32099c497 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminal.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminal.ts @@ -6,7 +6,7 @@ import { IDimension } from 'vs/base/browser/dom'; import { Orientation } from 'vs/base/browser/ui/splitview/splitview'; import { Color } from 'vs/base/common/color'; -import { Event, IDynamicListEventMultiplexer } from 'vs/base/common/event'; +import { Event, IDynamicListEventMultiplexer, type DynamicListEventMultiplexer } from 'vs/base/common/event'; import { DisposableStore, IDisposable } from 'vs/base/common/lifecycle'; import { OperatingSystem } from 'vs/base/common/platform'; import { URI } from 'vs/base/common/uri'; @@ -342,7 +342,7 @@ export interface ITerminalService extends ITerminalInstanceHost { * instances and removing old instances as needed. * @param getEvent Maps the instance to the event. */ - createOnInstanceEvent(getEvent: (instance: ITerminalInstance) => Event): Event; + createOnInstanceEvent(getEvent: (instance: ITerminalInstance) => Event): DynamicListEventMultiplexer; /** * Creates a capability event listener that listens to capabilities on all instances, diff --git a/src/vs/workbench/contrib/terminal/browser/terminalService.ts b/src/vs/workbench/contrib/terminal/browser/terminalService.ts index 2b1dc0a6b13..3a9e46ecadd 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminalService.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminalService.ts @@ -155,14 +155,14 @@ export class TerminalService extends Disposable implements ITerminalService { // Lazily initialized events that fire when the specified event fires on _any_ terminal // TODO: Batch events - @memoize get onAnyInstanceData() { return this.createOnInstanceEvent(instance => Event.map(instance.onData, data => ({ instance, data }))); } - @memoize get onAnyInstanceDataInput() { return this.createOnInstanceEvent(e => e.onDidInputData); } - @memoize get onAnyInstanceIconChange() { return this.createOnInstanceEvent(e => e.onIconChanged); } - @memoize get onAnyInstanceMaximumDimensionsChange() { return this.createOnInstanceEvent(e => Event.map(e.onMaximumDimensionsChanged, () => e, e.store)); } - @memoize get onAnyInstancePrimaryStatusChange() { return this.createOnInstanceEvent(e => Event.map(e.statusList.onDidChangePrimaryStatus, () => e, e.store)); } - @memoize get onAnyInstanceProcessIdReady() { return this.createOnInstanceEvent(e => e.onProcessIdReady); } - @memoize get onAnyInstanceSelectionChange() { return this.createOnInstanceEvent(e => e.onDidChangeSelection); } - @memoize get onAnyInstanceTitleChange() { return this.createOnInstanceEvent(e => e.onTitleChanged); } + @memoize get onAnyInstanceData() { return this._register(this.createOnInstanceEvent(instance => Event.map(instance.onData, data => ({ instance, data })))).event; } + @memoize get onAnyInstanceDataInput() { return this._register(this.createOnInstanceEvent(e => e.onDidInputData)).event; } + @memoize get onAnyInstanceIconChange() { return this._register(this.createOnInstanceEvent(e => e.onIconChanged)).event; } + @memoize get onAnyInstanceMaximumDimensionsChange() { return this._register(this.createOnInstanceEvent(e => Event.map(e.onMaximumDimensionsChanged, () => e, e.store))).event; } + @memoize get onAnyInstancePrimaryStatusChange() { return this._register(this.createOnInstanceEvent(e => Event.map(e.statusList.onDidChangePrimaryStatus, () => e, e.store))).event; } + @memoize get onAnyInstanceProcessIdReady() { return this._register(this.createOnInstanceEvent(e => e.onProcessIdReady)).event; } + @memoize get onAnyInstanceSelectionChange() { return this._register(this.createOnInstanceEvent(e => e.onDidChangeSelection)).event; } + @memoize get onAnyInstanceTitleChange() { return this._register(this.createOnInstanceEvent(e => e.onTitleChanged)).event; } constructor( @IContextKeyService private _contextKeyService: IContextKeyService, @@ -1188,8 +1188,8 @@ export class TerminalService extends Disposable implements ITerminalService { this._editingTerminal = instance; } - createOnInstanceEvent(getEvent: (instance: ITerminalInstance) => Event): Event { - return this._register(new DynamicListEventMultiplexer(this.instances, this.onDidCreateInstance, this.onDidDisposeInstance, getEvent)).event; + createOnInstanceEvent(getEvent: (instance: ITerminalInstance) => Event): DynamicListEventMultiplexer { + return new DynamicListEventMultiplexer(this.instances, this.onDidCreateInstance, this.onDidDisposeInstance, getEvent); } createOnInstanceCapabilityEvent(capabilityId: T, getEvent: (capability: ITerminalCapabilityImplMap[T]) => Event): IDynamicListEventMultiplexer<{ instance: ITerminalInstance; data: K }> {