From 837f94d8f2845ae0928024ce855be9aea1362ec3 Mon Sep 17 00:00:00 2001 From: Andrey Loskutov Date: Mon, 16 Feb 2026 10:58:01 +0100 Subject: [PATCH] Properly register ConsoleManager listeners on workbench windows `ConsoleManager` service is activated on `org.eclipse.terminal.view.ui.internal.UIPlugin.start(BundleContext)` **before** workbench creates any window. This prevents that it can register his window & perspective listeners to any window and so it can't properly manage terminals if they are opened from multiple different terminal view instances existing in parallel. This happens because terminal ui bundle contributes `ExternalExecutablesState` service that is activated very early at workbench startup, **before** window creation. Beside this, `ConsoleManager` service, if ever connected to a window, would only listen to that single window events and would never support other windows. Fixed both issues by moving window & perspective listener registration (and de-registration) of `ConsoleManager` service to already existing `org.eclipse.terminal.view.ui.internal.listeners.AbstractWindowListener`. Fixes https://github.com/eclipse-platform/eclipse.platform/issues/2455 --- .../view/ui/internal/ConsoleManager.java | 19 ++++++++++++++----- .../listeners/AbstractWindowListener.java | 6 ++++++ 2 files changed, 20 insertions(+), 5 deletions(-) diff --git a/terminal/bundles/org.eclipse.terminal.view.ui/src/org/eclipse/terminal/view/ui/internal/ConsoleManager.java b/terminal/bundles/org.eclipse.terminal.view.ui/src/org/eclipse/terminal/view/ui/internal/ConsoleManager.java index 56a87e21dbe..51b7b1ecdf8 100644 --- a/terminal/bundles/org.eclipse.terminal.view.ui/src/org/eclipse/terminal/view/ui/internal/ConsoleManager.java +++ b/terminal/bundles/org.eclipse.terminal.view.ui/src/org/eclipse/terminal/view/ui/internal/ConsoleManager.java @@ -47,6 +47,7 @@ import org.eclipse.ui.IWorkbenchPage; import org.eclipse.ui.IWorkbenchPart; import org.eclipse.ui.IWorkbenchPartReference; +import org.eclipse.ui.IWorkbenchWindow; import org.eclipse.ui.PartInitException; import org.eclipse.ui.PerspectiveAdapter; import org.eclipse.ui.PlatformUI; @@ -156,16 +157,24 @@ public void partInputChanged(IWorkbenchPartReference partRef) { public ConsoleManager() { perspectiveListener = new ConsoleManagerPerspectiveListener(); partListener = new ConsoleManagerPartListener(); + } - if (PlatformUI.isWorkbenchRunning() && PlatformUI.getWorkbench() != null - && PlatformUI.getWorkbench().getActiveWorkbenchWindow() != null) { - PlatformUI.getWorkbench().getActiveWorkbenchWindow().addPerspectiveListener(perspectiveListener); - - IPartService service = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getPartService(); + public void addWindowAndPerspectiveListeners(IWorkbenchWindow window) { + if (PlatformUI.isWorkbenchRunning() && window != null) { + window.addPerspectiveListener(perspectiveListener); + IPartService service = window.getPartService(); service.addPartListener(partListener); } } + public void removeWindowAndPerspectiveListeners(IWorkbenchWindow window) { + if (PlatformUI.isWorkbenchRunning() && window != null) { + window.removePerspectiveListener(perspectiveListener); + IPartService service = window.getPartService(); + service.removePartListener(partListener); + } + } + /** * Returns the active workbench window page if the workbench is still running. * diff --git a/terminal/bundles/org.eclipse.terminal.view.ui/src/org/eclipse/terminal/view/ui/internal/listeners/AbstractWindowListener.java b/terminal/bundles/org.eclipse.terminal.view.ui/src/org/eclipse/terminal/view/ui/internal/listeners/AbstractWindowListener.java index f38bd6dc759..56664ad8257 100644 --- a/terminal/bundles/org.eclipse.terminal.view.ui/src/org/eclipse/terminal/view/ui/internal/listeners/AbstractWindowListener.java +++ b/terminal/bundles/org.eclipse.terminal.view.ui/src/org/eclipse/terminal/view/ui/internal/listeners/AbstractWindowListener.java @@ -11,6 +11,8 @@ *******************************************************************************/ package org.eclipse.terminal.view.ui.internal.listeners; +import org.eclipse.terminal.view.ui.internal.ConsoleManager; +import org.eclipse.terminal.view.ui.launcher.ITerminalConsoleViewManager; import org.eclipse.ui.IPartListener2; import org.eclipse.ui.IPartService; import org.eclipse.ui.IPerspectiveListener; @@ -85,6 +87,8 @@ public void windowClosed(IWorkbenchWindow window) { if (perspectiveListener != null) { window.removePerspectiveListener(perspectiveListener); } + ConsoleManager consoleViewManager = (ConsoleManager) window.getService(ITerminalConsoleViewManager.class); + consoleViewManager.removeWindowAndPerspectiveListeners(window); } } @@ -119,6 +123,8 @@ public void windowOpened(IWorkbenchWindow window) { } } + ConsoleManager consoleViewManager = (ConsoleManager) window.getService(ITerminalConsoleViewManager.class); + consoleViewManager.addWindowAndPerspectiveListeners(window); initialized = true; } }