Skip to content

Commit

Permalink
Add ability to prevent terminal title updates from ANSI Escape sequence
Browse files Browse the repository at this point in the history
When a more complete implementation of ANSI Escape sequence for
renaming terminal titles was added in
[CDT 10.2](https://github.com/eclipse-cdt/cdt/blob/main/NewAndNoteworthy/CDT-10.2.md#rename-terminal-tab)
it caused a regression in use cases where extenders of the terminal
wanted to retain control of the terminal's title.

This commit adds a new flag that will prevent the title of the
terminal tab from being updated from ANSI escape sequences.

Fixes #494
  • Loading branch information
mmx85 committed Aug 19, 2023
1 parent c9a38e5 commit 422aea1
Show file tree
Hide file tree
Showing 24 changed files with 199 additions and 30 deletions.
7 changes: 7 additions & 0 deletions NewAndNoteworthy/CDT-11.3.md
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,13 @@ In cases where the configured binary parser does not support the launching of GN

# API Changes, current and planned

## New API to create terminal that blocks updating title from ANSI escape sequence

When calling `ITerminalService.openConsole(Map<String, Object> properties, Done done)` the `properties` understands a new key that allows the option to disable updating titles from ASNI Escape Sequences.
By setting `ITerminalsConnectorConstants.PROP_TITLE_DISABLE_ANSI_TITLE` to `true` the title of the tab terminal will not be affected by ANSI escape sequences.

## Breaking API changes

Please see [CHANGELOG-API](CHANGELOG-API.md) for details on the breaking API changes in this release as well as future planned API changes.

# Noteworthy Issues and Pull Requests
Expand Down
12 changes: 12 additions & 0 deletions NewAndNoteworthy/CHANGELOG-API.md
Original file line number Diff line number Diff line change
Expand Up @@ -604,3 +604,15 @@ spelled BuiltinDetectionArgsGeneric instead.
These APIs will be removed and remote connection for attach launch will be moved in the implementation of `IGDBProcesses.attachDebuggerToProcess()`.

See https://github.com/eclipse-cdt/cdt/pull/336

## API Removals after September 2025

### Terminal Control API for setting title without `requestor` will be removed

These APIs will be removed and are replaced by versions with `requestor` parameter.

- org.eclipse.tm.internal.terminal.control.ITerminalListener.setTerminalTitle(String)
- org.eclipse.tm.internal.terminal.provisional.api.ITerminalControl.setTerminalTitle(String)
- org.eclipse.tm.internal.terminal.control.ITerminalViewControl.setTerminalTitle(String)

See https://github.com/eclipse-cdt/cdt/issues/494
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: %pluginName
Bundle-SymbolicName: org.eclipse.tm.terminal.connector.remote;singleton:=true
Bundle-Version: 4.8.0.qualifier
Bundle-Version: 4.8.100.qualifier
Bundle-Vendor: %providerName
Bundle-Localization: plugin
Require-Bundle: org.eclipse.ui,
Expand All @@ -13,8 +13,8 @@ Require-Bundle: org.eclipse.ui,
org.eclipse.core.resources,
org.eclipse.swt,
org.eclipse.jface,
org.eclipse.tm.terminal.view.core;bundle-version="4.5.0";resolution:=optional,
org.eclipse.tm.terminal.view.ui;bundle-version="4.5.0";resolution:=optional,
org.eclipse.tm.terminal.view.core;bundle-version="4.10.0";resolution:=optional,
org.eclipse.tm.terminal.view.ui;bundle-version="4.11.100";resolution:=optional,
org.eclipse.core.expressions
Bundle-RequiredExecutionEnvironment: JavaSE-17
Export-Package: org.eclipse.tm.terminal.connector.remote,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@
import org.eclipse.remote.core.IRemoteProcessTerminalService;
import org.eclipse.remote.core.IRemoteServicesManager;
import org.eclipse.remote.core.exception.RemoteConnectionException;
import org.eclipse.tm.internal.terminal.control.ITerminalListener3.TerminalTitleRequestor;
import org.eclipse.tm.internal.terminal.emulator.VT100Emulator;
import org.eclipse.tm.internal.terminal.emulator.VT100TerminalControl;
import org.eclipse.tm.internal.terminal.provisional.api.ITerminalControl;
Expand Down Expand Up @@ -126,7 +127,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(), TerminalTitleRequestor.OTHER);
connector.setOutputStream(remoteProcess.getOutputStream());
// Initialize terminal size
VT100Emulator text = ((VT100TerminalControl) control).getTerminalText();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: %pluginName
Bundle-SymbolicName: org.eclipse.tm.terminal.control; singleton:=true
Bundle-Version: 5.4.100.qualifier
Bundle-Version: 5.5.0.qualifier
Bundle-Activator: org.eclipse.tm.internal.terminal.control.impl.TerminalPlugin
Bundle-Vendor: %providerName
Bundle-Localization: plugin
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,8 +28,10 @@ public interface ITerminalListener {
void setState(TerminalState state);

/**
* Set the title of the terminal.
* @deprecated Migrate to implementing {@link ITerminalListener3} and
* override {@link ITerminalListener3#setTerminalTitle(String, String)
* @param title
*/
@Deprecated(forRemoval = true)
void setTerminalTitle(String title);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
/*******************************************************************************
* Copyright (c) 2023 Infineon Technologies AG. All Rights Reserved.
*
* This program and the accompanying materials are made available under the terms
* of the Eclipse Public License 2.0 which accompanies this distribution, and is
* available at https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*******************************************************************************/
package org.eclipse.tm.internal.terminal.control;

/**
* Terminal listener allowing to listen to terminal selection changes.
* The interface overrides the deprecated {@link #setTerminalTitle(String)} with
* {@link #setTerminalTitle(String, String)} that should be called instead.
*
* @since 5.5
*/
public interface ITerminalListener3 extends ITerminalListener2 {

/**
* Enum defines terminal title change requestors for
* setTerminalTitle method.
*
* @since 5.5
*/
enum TerminalTitleRequestor {
ANSI, // Terminal tab title change requested using ANSI command in terminal.
MENU, // Terminal tab title change requested from menu.
OTHER; // Terminal tab title change requested by other requestors.
}

/**
* Set the title of the terminal.
*
* @param title Terminal title.
* @param requestor Item that requests terminal title update.
*/
void setTerminalTitle(String title, TerminalTitleRequestor requestor);
}
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
import org.eclipse.swt.dnd.Clipboard;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.widgets.Control;
import org.eclipse.tm.internal.terminal.control.ITerminalListener3.TerminalTitleRequestor;
import org.eclipse.tm.internal.terminal.provisional.api.ITerminalConnector;
import org.eclipse.tm.internal.terminal.provisional.api.ITerminalControl;
import org.eclipse.tm.internal.terminal.provisional.api.TerminalState;
Expand Down Expand Up @@ -192,9 +193,19 @@ public interface ITerminalViewControl {

/**
* @since 5.1
* @deprecated call {@link #setTerminalTitle(String, String)} instead
*/
@Deprecated(forRemoval = true)
void setTerminalTitle(String newTitle);

/**
* Set the title of the terminal.
* @param newTitle
* @param requestor Item that requests terminal title update.
* @since 5.5
*/
void setTerminalTitle(String newTitle, TerminalTitleRequestor requestor);

/**
* @since 5.2
*/
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@

import java.io.OutputStream;

import org.eclipse.tm.internal.terminal.control.ITerminalListener3.TerminalTitleRequestor;
import org.eclipse.tm.internal.terminal.provisional.api.ITerminalConnector;
import org.eclipse.tm.internal.terminal.provisional.api.TerminalState;

Expand All @@ -28,7 +29,13 @@ public interface ITerminalControlForText {

void setState(TerminalState state);

void setTerminalTitle(String title);
/**
* Set the title of the terminal.
*
* @param title Termianl title.
* @param requestor Item that requests terminal title update.
*/
void setTerminalTitle(String title, TerminalTitleRequestor requestor);

ITerminalConnector getTerminalConnector();

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@
import org.eclipse.swt.events.ControlEvent;
import org.eclipse.swt.events.ControlListener;
import org.eclipse.swt.graphics.RGB;
import org.eclipse.tm.internal.terminal.control.ITerminalListener3.TerminalTitleRequestor;
import org.eclipse.tm.internal.terminal.control.impl.ITerminalControlForText;
import org.eclipse.tm.internal.terminal.control.impl.TerminalPlugin;
import org.eclipse.tm.internal.terminal.provisional.api.ITerminalConnector;
Expand Down Expand Up @@ -486,7 +487,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), TerminalTitleRequestor.ANSI);
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,8 @@
import org.eclipse.tm.internal.terminal.control.ICommandInputField;
import org.eclipse.tm.internal.terminal.control.ITerminalListener;
import org.eclipse.tm.internal.terminal.control.ITerminalListener2;
import org.eclipse.tm.internal.terminal.control.ITerminalListener3;
import org.eclipse.tm.internal.terminal.control.ITerminalListener3.TerminalTitleRequestor;
import org.eclipse.tm.internal.terminal.control.ITerminalMouseListener;
import org.eclipse.tm.internal.terminal.control.ITerminalViewControl;
import org.eclipse.tm.internal.terminal.control.impl.ITerminalControlForText;
Expand Down Expand Up @@ -1261,7 +1263,17 @@ private void processKeyBinding(KeyEvent event, int accelerator) {

@Override
public void setTerminalTitle(String title) {
fTerminalListener.setTerminalTitle(title);
setTerminalTitle(title, TerminalTitleRequestor.OTHER);
}

@Override
public void setTerminalTitle(String title, TerminalTitleRequestor requestor) {
if (fTerminalListener instanceof ITerminalListener3 listener3) {
listener3.setTerminalTitle(title, requestor);
} else {
fTerminalListener.setTerminalTitle(title);
}

}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@

import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.tm.internal.terminal.control.ITerminalListener3.TerminalTitleRequestor;

/**
* Represents the terminal view as seen by a terminal connection.
Expand Down Expand Up @@ -155,11 +156,19 @@ public interface ITerminalControl {
OutputStream getRemoteToTerminalOutputStream();

/**
* Set the title of the terminal view.
* @param title
* @deprecated call {@link #setTerminalTitle(String, String)} instead
*/
@Deprecated(forRemoval = true)
void setTerminalTitle(String title);

/**
* Set the title of the terminal view.
* @param title Termianl title.
* @param requestor Item that requests terminal title update.
* @since 5.5
*/
void setTerminalTitle(String title, TerminalTitleRequestor requestor);

/**
* Show an error message during connect.
* @param msg
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
import org.eclipse.core.runtime.Platform;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.tm.internal.terminal.control.ITerminalListener3.TerminalTitleRequestor;
import org.eclipse.tm.internal.terminal.provisional.api.ISettingsStore;
import org.eclipse.tm.internal.terminal.provisional.api.ITerminalControl;
import org.eclipse.tm.internal.terminal.provisional.api.TerminalState;
Expand Down Expand Up @@ -99,6 +100,10 @@ public void setState(TerminalState state) {
public void setTerminalTitle(String title) {
}

@Override
public void setTerminalTitle(String title, TerminalTitleRequestor requestor) {
}

@Override
public void setupTerminal(Composite parent) {
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.tm.internal.terminal.connector.TerminalConnector.Factory;
import org.eclipse.tm.internal.terminal.control.ITerminalListener3.TerminalTitleRequestor;
import org.eclipse.tm.internal.terminal.provisional.api.ISettingsStore;
import org.eclipse.tm.internal.terminal.provisional.api.ITerminalControl;
import org.eclipse.tm.internal.terminal.provisional.api.TerminalState;
Expand Down Expand Up @@ -99,6 +100,10 @@ public void setState(TerminalState state) {
public void setTerminalTitle(String title) {
}

@Override
public void setTerminalTitle(String title, TerminalTitleRequestor requestor) {
}

@Override
public void setupTerminal(Composite parent) {
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
import java.util.Collections;
import java.util.List;

import org.eclipse.tm.internal.terminal.control.ITerminalListener3.TerminalTitleRequestor;
import org.eclipse.tm.internal.terminal.control.impl.ITerminalControlForText;
import org.eclipse.tm.internal.terminal.provisional.api.ITerminalConnector;
import org.eclipse.tm.internal.terminal.provisional.api.TerminalState;
Expand All @@ -32,8 +33,10 @@ public void setState(TerminalState state) {
}

@Override
public void setTerminalTitle(String title) {
allTitles.add(title);
public void setTerminalTitle(String title, TerminalTitleRequestor requestor) {
if (requestor == TerminalTitleRequestor.ANSI) {
allTitles.add(title);
}
}

public List<String> getAllTitles() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
import java.io.OutputStream;

import org.eclipse.swt.widgets.Display;
import org.eclipse.tm.internal.terminal.control.ITerminalListener3.TerminalTitleRequestor;
import org.eclipse.tm.internal.terminal.provisional.api.ITerminalControl;
import org.eclipse.tm.internal.terminal.provisional.api.Logger;
import org.eclipse.tm.internal.terminal.provisional.api.TerminalState;
Expand Down Expand Up @@ -114,7 +115,7 @@ private void sleep(int ms) {
}

private void setTitle(final String title) {
Display.getDefault().asyncExec(() -> fControl.setTerminalTitle(title));
Display.getDefault().asyncExec(() -> fControl.setTerminalTitle(title, TerminalTitleRequestor.OTHER));
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
import java.io.InputStream;
import java.io.OutputStream;

import org.eclipse.tm.internal.terminal.control.ITerminalListener3.TerminalTitleRequestor;
import org.eclipse.tm.internal.terminal.provisional.api.ISettingsStore;
import org.eclipse.tm.internal.terminal.provisional.api.ITerminalControl;
import org.eclipse.tm.internal.terminal.provisional.api.Logger;
Expand Down Expand Up @@ -48,7 +49,7 @@ synchronized public void connect(ITerminalControl control) {
return;
}
fOutputStream = System.out;
fControl.setTerminalTitle(fSettings.getInputFile());
fControl.setTerminalTitle(fSettings.getInputFile(), TerminalTitleRequestor.OTHER);
fConnection = new SpeedTestConnection(fInputStream, fSettings, fControl);
fConnection.start();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
import java.io.Reader;
import java.nio.charset.StandardCharsets;

import org.eclipse.tm.internal.terminal.control.ITerminalListener3.TerminalTitleRequestor;
import org.eclipse.tm.internal.terminal.control.impl.ITerminalControlForText;
import org.eclipse.tm.internal.terminal.emulator.VT100Emulator;
import org.eclipse.tm.internal.terminal.provisional.api.ITerminalConnector;
Expand Down Expand Up @@ -212,7 +213,7 @@ public void setState(TerminalState state) {
}

@Override
public void setTerminalTitle(String title) {
public void setTerminalTitle(String title, TerminalTitleRequestor requestor) {
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: %pluginName
Bundle-SymbolicName: org.eclipse.tm.terminal.view.core;singleton:=true
Bundle-Version: 4.9.100.qualifier
Bundle-Version: 4.10.0.qualifier
Bundle-Activator: org.eclipse.tm.terminal.view.core.activator.CoreBundleActivator
Bundle-Vendor: %providerName
Require-Bundle: org.eclipse.core.expressions;bundle-version="3.4.400",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,14 @@ public interface ITerminalsConnectorConstants {
*/
public static final String PROP_TITLE = "title"; //$NON-NLS-1$

/**
* Property: Flag to disable updating the terminal title from ANSI escape sequences.
* <p>
* Property Type: {@link Boolean}
* @since 4.10
*/
public static final String PROP_TITLE_DISABLE_ANSI_TITLE = "titleDisableAnsiTitle"; //$NON-NLS-1$

/**
* Property: The encoding of the terminal tab to open.
* <p>
Expand Down

0 comments on commit 422aea1

Please sign in to comment.