From fbb59af76ade2b37e47671c508016ecf14510d8a Mon Sep 17 00:00:00 2001 From: Murat Aslan Date: Fri, 2 Jan 2026 15:43:55 +0300 Subject: [PATCH 1/2] Fix: Replace terminal view lifecycle hack with Event.once --- src/vs/workbench/contrib/terminal/browser/terminalView.ts | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/vs/workbench/contrib/terminal/browser/terminalView.ts b/src/vs/workbench/contrib/terminal/browser/terminalView.ts index 628e1313ba5c..01b62d5c1d2c 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminalView.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminalView.ts @@ -337,10 +337,8 @@ export class TerminalViewPane extends ViewPane { // be focused. So wait for connection to finish, then focus. const previousActiveElement = this.element.ownerDocument.activeElement; if (previousActiveElement) { - // TODO: Improve lifecycle management this event should be disposed after first fire - this._register(this._terminalService.onDidChangeConnectionState(() => { + this._register(Event.once(this._terminalService.onDidChangeConnectionState)(() => { // Only focus the terminal if the activeElement has not changed since focus() was called - // TODO: Hack if (previousActiveElement && dom.isActiveElement(previousActiveElement)) { this._terminalGroupService.showPanel(true); } From f786f435a8d368331aca5655c61697e72778333e Mon Sep 17 00:00:00 2001 From: Murat Aslan Date: Fri, 2 Jan 2026 17:35:25 +0300 Subject: [PATCH 2/2] fix(terminal): properly dispose Event.once listener in terminalView --- src/vs/workbench/contrib/terminal/browser/terminalView.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/vs/workbench/contrib/terminal/browser/terminalView.ts b/src/vs/workbench/contrib/terminal/browser/terminalView.ts index 01b62d5c1d2c..9a7457274151 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminalView.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminalView.ts @@ -337,11 +337,12 @@ export class TerminalViewPane extends ViewPane { // be focused. So wait for connection to finish, then focus. const previousActiveElement = this.element.ownerDocument.activeElement; if (previousActiveElement) { - this._register(Event.once(this._terminalService.onDidChangeConnectionState)(() => { + const listener = this._register(Event.once(this._terminalService.onDidChangeConnectionState)(() => { // Only focus the terminal if the activeElement has not changed since focus() was called if (previousActiveElement && dom.isActiveElement(previousActiveElement)) { this._terminalGroupService.showPanel(true); } + this._store.delete(listener); })); } }