diff --git a/src/vs/base/common/event.ts b/src/vs/base/common/event.ts index 2e5b842fc1c6aa851dc1fb2faa36818f6a42d399..ac6ffd0e16abce4722a7983cf4b9698ef3882566 100644 --- a/src/vs/base/common/event.ts +++ b/src/vs/base/common/event.ts @@ -576,18 +576,34 @@ export function echo(event: Event, nextTick = false, buffer: T[] = []): Ev export class Relay implements IDisposable { - private emitter = new Emitter(); - readonly event: Event = this.emitter.event; + private listening = false; + private inputEvent: Event = Event.None; + private inputEventListener: IDisposable = Disposable.None; + + private emitter = new Emitter({ + onFirstListenerDidAdd: () => { + this.listening = true; + this.inputEventListener = this.inputEvent(this.emitter.fire, this.emitter); + }, + onLastListenerRemove: () => { + this.listening = false; + this.inputEventListener.dispose(); + } + }); - private disposable: IDisposable = Disposable.None; + readonly event: Event = this.emitter.event; set input(event: Event) { - this.disposable.dispose(); - this.disposable = event(this.emitter.fire, this.emitter); + this.inputEvent = event; + + if (this.listening) { + this.inputEventListener.dispose(); + this.inputEventListener = event(this.emitter.fire, this.emitter); + } } dispose() { - this.disposable.dispose(); + this.inputEventListener.dispose(); this.emitter.dispose(); } }