From ffc5c8f456d3ba79ebe5dfd9355957b38c28bc4b Mon Sep 17 00:00:00 2001 From: Maksym Oleksiv Date: Tue, 15 Aug 2023 12:36:40 +0300 Subject: [PATCH] Fixed ability to set terminal tab name programmatically. Fixes #494 --- .../internal/RemoteConnectionManager.java | 2 +- .../terminal/control/ITerminalListener.java | 3 +- .../control/ITerminalViewControl.java | 6 ++- .../control/impl/ITerminalControlForText.java | 2 +- .../terminal/emulator/VT100Emulator.java | 2 +- .../emulator/VT100TerminalControl.java | 4 +- .../provisional/api/ITerminalControl.java | 3 +- .../TerminalConnectorFactoryTest.java | 2 +- .../connector/TerminalConnectorTest.java | 2 +- .../emulator/MockTerminalControlForText.java | 7 +++- .../speedtest/SpeedTestConnection.java | 2 +- .../speedtest/SpeedTestConnector.java | 2 +- .../terminal/test/ui/VT100DataSource.java | 2 +- .../ITerminalsConnectorConstants.java | 8 ++++ .../view/ui/actions/RenameTerminalAction.java | 2 +- .../view/ui/services/TerminalService.java | 8 ++++ .../view/ui/tabs/TabTerminalListener.java | 40 ++++++++++++++++--- 17 files changed, 75 insertions(+), 22 deletions(-) diff --git a/terminal/plugins/org.eclipse.tm.terminal.connector.remote/src/org/eclipse/tm/terminal/connector/remote/internal/RemoteConnectionManager.java b/terminal/plugins/org.eclipse.tm.terminal.connector.remote/src/org/eclipse/tm/terminal/connector/remote/internal/RemoteConnectionManager.java index a05278cf799..7cfec68f8e4 100644 --- a/terminal/plugins/org.eclipse.tm.terminal.connector.remote/src/org/eclipse/tm/terminal/connector/remote/internal/RemoteConnectionManager.java +++ b/terminal/plugins/org.eclipse.tm.terminal.connector.remote/src/org/eclipse/tm/terminal/connector/remote/internal/RemoteConnectionManager.java @@ -126,7 +126,7 @@ protected IStatus run(IProgressMonitor monitor) { control.setVT100LineWrapping(true); connector.setInputStream(remoteProcess.getInputStream()); control.setState(TerminalState.CONNECTED); - control.setTerminalTitle(remoteConnection.getName()); + control.setTerminalTitle(remoteConnection.getName(), "RCM"); connector.setOutputStream(remoteProcess.getOutputStream()); // Initialize terminal size VT100Emulator text = ((VT100TerminalControl) control).getTerminalText(); diff --git a/terminal/plugins/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/control/ITerminalListener.java b/terminal/plugins/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/control/ITerminalListener.java index 62d548c29a0..c6ec0790a65 100644 --- a/terminal/plugins/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/control/ITerminalListener.java +++ b/terminal/plugins/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/control/ITerminalListener.java @@ -30,6 +30,7 @@ public interface ITerminalListener { /** * Set the title of the terminal. * @param title + * @param requestor Who requests update. */ - void setTerminalTitle(String title); + void setTerminalTitle(String title, String requestor); } diff --git a/terminal/plugins/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/control/ITerminalViewControl.java b/terminal/plugins/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/control/ITerminalViewControl.java index d08a36c5586..51d46e2f24b 100644 --- a/terminal/plugins/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/control/ITerminalViewControl.java +++ b/terminal/plugins/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/control/ITerminalViewControl.java @@ -191,9 +191,11 @@ public interface ITerminalViewControl { void removeMouseListener(ITerminalMouseListener listener); /** - * @since 5.1 + * Set the title of the terminal. + * @param newTitle + * @param requestor Who requests update. */ - void setTerminalTitle(String newTitle); + void setTerminalTitle(String newTitle, String requestor); /** * @since 5.2 diff --git a/terminal/plugins/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/control/impl/ITerminalControlForText.java b/terminal/plugins/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/control/impl/ITerminalControlForText.java index 7fa736975e5..aa3d94fb723 100644 --- a/terminal/plugins/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/control/impl/ITerminalControlForText.java +++ b/terminal/plugins/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/control/impl/ITerminalControlForText.java @@ -28,7 +28,7 @@ public interface ITerminalControlForText { void setState(TerminalState state); - void setTerminalTitle(String title); + void setTerminalTitle(String title, String requestor); ITerminalConnector getTerminalConnector(); diff --git a/terminal/plugins/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/emulator/VT100Emulator.java b/terminal/plugins/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/emulator/VT100Emulator.java index 093fa472a9d..2013269c4ab 100644 --- a/terminal/plugins/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/emulator/VT100Emulator.java +++ b/terminal/plugins/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/emulator/VT100Emulator.java @@ -486,7 +486,7 @@ private void processAnsiOsCommand() { Logger.log("Ignoring unsupported ANSI OSC sequence: '" + ansiOsCommand + "'"); //$NON-NLS-1$ //$NON-NLS-2$ return; } - terminal.setTerminalTitle(ansiOsCommand.substring(2)); + terminal.setTerminalTitle(ansiOsCommand.substring(2), "ANSI"); } /** diff --git a/terminal/plugins/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/emulator/VT100TerminalControl.java b/terminal/plugins/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/emulator/VT100TerminalControl.java index 759c16c750a..417c2848428 100644 --- a/terminal/plugins/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/emulator/VT100TerminalControl.java +++ b/terminal/plugins/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/emulator/VT100TerminalControl.java @@ -1260,8 +1260,8 @@ private void processKeyBinding(KeyEvent event, int accelerator) { } @Override - public void setTerminalTitle(String title) { - fTerminalListener.setTerminalTitle(title); + public void setTerminalTitle(String title, String requestor) { + fTerminalListener.setTerminalTitle(title, requestor); } @Override diff --git a/terminal/plugins/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/provisional/api/ITerminalControl.java b/terminal/plugins/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/provisional/api/ITerminalControl.java index 267f7ac5f11..ddee1db05ac 100644 --- a/terminal/plugins/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/provisional/api/ITerminalControl.java +++ b/terminal/plugins/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/provisional/api/ITerminalControl.java @@ -157,8 +157,9 @@ public interface ITerminalControl { /** * Set the title of the terminal view. * @param title + * @param requestor Who requests title update. */ - void setTerminalTitle(String title); + void setTerminalTitle(String title, String requestor); /** * Show an error message during connect. diff --git a/terminal/plugins/org.eclipse.tm.terminal.test/src/org/eclipse/tm/internal/terminal/connector/TerminalConnectorFactoryTest.java b/terminal/plugins/org.eclipse.tm.terminal.test/src/org/eclipse/tm/internal/terminal/connector/TerminalConnectorFactoryTest.java index 9cea03f28e6..bd7f1c7091f 100644 --- a/terminal/plugins/org.eclipse.tm.terminal.test/src/org/eclipse/tm/internal/terminal/connector/TerminalConnectorFactoryTest.java +++ b/terminal/plugins/org.eclipse.tm.terminal.test/src/org/eclipse/tm/internal/terminal/connector/TerminalConnectorFactoryTest.java @@ -96,7 +96,7 @@ public void setState(TerminalState state) { } @Override - public void setTerminalTitle(String title) { + public void setTerminalTitle(String title, String requestor) { } @Override diff --git a/terminal/plugins/org.eclipse.tm.terminal.test/src/org/eclipse/tm/internal/terminal/connector/TerminalConnectorTest.java b/terminal/plugins/org.eclipse.tm.terminal.test/src/org/eclipse/tm/internal/terminal/connector/TerminalConnectorTest.java index 98f7519af63..88fbabf70f8 100644 --- a/terminal/plugins/org.eclipse.tm.terminal.test/src/org/eclipse/tm/internal/terminal/connector/TerminalConnectorTest.java +++ b/terminal/plugins/org.eclipse.tm.terminal.test/src/org/eclipse/tm/internal/terminal/connector/TerminalConnectorTest.java @@ -96,7 +96,7 @@ public void setState(TerminalState state) { } @Override - public void setTerminalTitle(String title) { + public void setTerminalTitle(String title, String requestor) { } @Override diff --git a/terminal/plugins/org.eclipse.tm.terminal.test/src/org/eclipse/tm/internal/terminal/emulator/MockTerminalControlForText.java b/terminal/plugins/org.eclipse.tm.terminal.test/src/org/eclipse/tm/internal/terminal/emulator/MockTerminalControlForText.java index 229691c575b..85eaf6f3e92 100644 --- a/terminal/plugins/org.eclipse.tm.terminal.test/src/org/eclipse/tm/internal/terminal/emulator/MockTerminalControlForText.java +++ b/terminal/plugins/org.eclipse.tm.terminal.test/src/org/eclipse/tm/internal/terminal/emulator/MockTerminalControlForText.java @@ -32,8 +32,11 @@ public void setState(TerminalState state) { } @Override - public void setTerminalTitle(String title) { - allTitles.add(title); + public void setTerminalTitle(String title, String requestor) { + if (requestor.equals("ANSI")) + { + allTitles.add(title); + } } public List getAllTitles() { diff --git a/terminal/plugins/org.eclipse.tm.terminal.test/src/org/eclipse/tm/internal/terminal/speedtest/SpeedTestConnection.java b/terminal/plugins/org.eclipse.tm.terminal.test/src/org/eclipse/tm/internal/terminal/speedtest/SpeedTestConnection.java index 27f00fc404e..236d2faf259 100644 --- a/terminal/plugins/org.eclipse.tm.terminal.test/src/org/eclipse/tm/internal/terminal/speedtest/SpeedTestConnection.java +++ b/terminal/plugins/org.eclipse.tm.terminal.test/src/org/eclipse/tm/internal/terminal/speedtest/SpeedTestConnection.java @@ -114,7 +114,7 @@ private void sleep(int ms) { } private void setTitle(final String title) { - Display.getDefault().asyncExec(() -> fControl.setTerminalTitle(title)); + Display.getDefault().asyncExec(() -> fControl.setTerminalTitle(title, "STC")); } } diff --git a/terminal/plugins/org.eclipse.tm.terminal.test/src/org/eclipse/tm/internal/terminal/speedtest/SpeedTestConnector.java b/terminal/plugins/org.eclipse.tm.terminal.test/src/org/eclipse/tm/internal/terminal/speedtest/SpeedTestConnector.java index f27da80a7ee..1d184ca52ec 100644 --- a/terminal/plugins/org.eclipse.tm.terminal.test/src/org/eclipse/tm/internal/terminal/speedtest/SpeedTestConnector.java +++ b/terminal/plugins/org.eclipse.tm.terminal.test/src/org/eclipse/tm/internal/terminal/speedtest/SpeedTestConnector.java @@ -48,7 +48,7 @@ synchronized public void connect(ITerminalControl control) { return; } fOutputStream = System.out; - fControl.setTerminalTitle(fSettings.getInputFile()); + fControl.setTerminalTitle(fSettings.getInputFile(), "STC"); fConnection = new SpeedTestConnection(fInputStream, fSettings, fControl); fConnection.start(); } diff --git a/terminal/plugins/org.eclipse.tm.terminal.test/src/org/eclipse/tm/internal/terminal/test/ui/VT100DataSource.java b/terminal/plugins/org.eclipse.tm.terminal.test/src/org/eclipse/tm/internal/terminal/test/ui/VT100DataSource.java index e42d99c39f3..bf564626d48 100644 --- a/terminal/plugins/org.eclipse.tm.terminal.test/src/org/eclipse/tm/internal/terminal/test/ui/VT100DataSource.java +++ b/terminal/plugins/org.eclipse.tm.terminal.test/src/org/eclipse/tm/internal/terminal/test/ui/VT100DataSource.java @@ -212,7 +212,7 @@ public void setState(TerminalState state) { } @Override - public void setTerminalTitle(String title) { + public void setTerminalTitle(String title, String requestor) { } @Override diff --git a/terminal/plugins/org.eclipse.tm.terminal.view.core/src/org/eclipse/tm/terminal/view/core/interfaces/constants/ITerminalsConnectorConstants.java b/terminal/plugins/org.eclipse.tm.terminal.view.core/src/org/eclipse/tm/terminal/view/core/interfaces/constants/ITerminalsConnectorConstants.java index 8adb3b37f64..b5608abc237 100644 --- a/terminal/plugins/org.eclipse.tm.terminal.view.core/src/org/eclipse/tm/terminal/view/core/interfaces/constants/ITerminalsConnectorConstants.java +++ b/terminal/plugins/org.eclipse.tm.terminal.view.core/src/org/eclipse/tm/terminal/view/core/interfaces/constants/ITerminalsConnectorConstants.java @@ -71,6 +71,14 @@ public interface ITerminalsConnectorConstants { */ public static final String PROP_TITLE = "title"; //$NON-NLS-1$ + /** + * Property: Flag to set terminal title either using terminal API only or + * using terminal API and ANSI command. + *

+ * Property Type: {@link String} + */ + public static final String PROP_TITLE_UPDATE_API = "titleUpdateAPI"; //$NON-NLS-1$ + /** * Property: The encoding of the terminal tab to open. *

diff --git a/terminal/plugins/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/actions/RenameTerminalAction.java b/terminal/plugins/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/actions/RenameTerminalAction.java index a9cf9a673e8..381e8d3794a 100644 --- a/terminal/plugins/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/actions/RenameTerminalAction.java +++ b/terminal/plugins/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/actions/RenameTerminalAction.java @@ -51,7 +51,7 @@ public void run() { if (inputDialog.open() == Window.OK) { String value = inputDialog.getValue(); if (value != null) { - target.setTerminalTitle(value); + target.setTerminalTitle(value, "Menu"); } } diff --git a/terminal/plugins/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/services/TerminalService.java b/terminal/plugins/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/services/TerminalService.java index c5b8bf263b5..bd326b3eef6 100644 --- a/terminal/plugins/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/services/TerminalService.java +++ b/terminal/plugins/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/services/TerminalService.java @@ -293,6 +293,14 @@ public void doRun(String id, String secondaryId, String title, ITerminalConnecto flags.put(ITerminalsConnectorConstants.PROP_DATA_NO_RECONNECT, (Boolean) properties.get(ITerminalsConnectorConstants.PROP_DATA_NO_RECONNECT)); } + if (properties.get(ITerminalsConnectorConstants.PROP_TITLE_UPDATE_API) instanceof Boolean) { + flags.put(ITerminalsConnectorConstants.PROP_TITLE_UPDATE_API, + (Boolean) properties.get(ITerminalsConnectorConstants.PROP_TITLE_UPDATE_API)); + } + else + { + flags.put(ITerminalsConnectorConstants.PROP_TITLE_UPDATE_API, false); + } // Open the new console CTabItem item; item = ConsoleManager.getInstance().openConsole(id, secondaryId, title, encoding, connector, data, diff --git a/terminal/plugins/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/tabs/TabTerminalListener.java b/terminal/plugins/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/tabs/TabTerminalListener.java index 6df377aa2b3..0fb6afeae1e 100644 --- a/terminal/plugins/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/tabs/TabTerminalListener.java +++ b/terminal/plugins/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/tabs/TabTerminalListener.java @@ -11,6 +11,8 @@ *******************************************************************************/ package org.eclipse.tm.terminal.view.ui.tabs; +import java.util.Map; + import org.eclipse.core.runtime.Assert; import org.eclipse.jface.viewers.ISelectionProvider; import org.eclipse.osgi.util.NLS; @@ -18,6 +20,7 @@ import org.eclipse.swt.widgets.Display; import org.eclipse.tm.internal.terminal.control.ITerminalListener2; import org.eclipse.tm.internal.terminal.provisional.api.TerminalState; +import org.eclipse.tm.terminal.view.core.interfaces.constants.ITerminalsConnectorConstants; import org.eclipse.tm.terminal.view.ui.nls.Messages; /** @@ -114,7 +117,6 @@ private void updateTitle() { if (item == null || item.isDisposed()) { return; } - // Run asynchronously in the display thread item.getDisplay().asyncExec(() -> { // Update the tab item title @@ -161,10 +163,38 @@ protected String getTerminalConsoleTabTitle(TerminalState state) { return newTitle != null && !newTitle.equals(oldTitle) ? newTitle : null; } - @Override - public void setTerminalTitle(String title) { - tabItemTitle = title; - updateTitle(); + /** + * Sets Terminal tilte and checks if originator is ANSI command. + * If originator is ANSI command in terminal and user does not want to use + * ANSI command to upate terminal then return else update title. + * @param title Title to update. + * @param requestor Who requests title update. Can be null. + * @since 11.3 + */ + public void setTerminalTitle(String title, String requestor) { + + CTabItem item = getTabItem(); + if (item == null || item.isDisposed()){ + return; + } + + // Run asynchronously in the display thread + item.getDisplay().asyncExec(() -> { + Boolean flag = false; + // Get the original terminal properties associated with the tab item + Map properties = (Map) item.getData("properties"); //$NON-NLS-1$ + if (properties.containsKey(ITerminalsConnectorConstants.PROP_TITLE_UPDATE_API)) { + flag = (Boolean) properties.get(ITerminalsConnectorConstants.PROP_TITLE_UPDATE_API); + } + // Check if terminal should be updated either using API only (flag == true) + // or using API and ANSI command (flag == false). + if (flag == true && requestor!= null && requestor.equals("ANSI")) { + return; + } + + tabItemTitle = title; + updateTitle(); + }); } /**