diff --git a/CHANGELOG.md b/CHANGELOG.md index e8fe184a8ee1c..6f10331a02eba 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,11 @@ - [Previous Changelogs](https://github.com/eclipse-theia/theia/tree/master/doc/changelogs/) +## v1.34.0 - 01/26/2023 + +- [plugin] added support for `isTransient` of `TerminalOptions` and `ExternalTerminalOptions` VS Code API [#12055](https://github.com/eclipse-theia/theia/pull/12055) - Contributed on behalf of STMicroelectronics +- [terminal] added support for preference `terminal.integrated.enablePersistentSessions` to allow disabling restoring terminals on reload [#12055](https://github.com/eclipse-theia/theia/pull/12055) - Contributed on behalf of STMicroelectronics + ## v1.33.0 - 12/20/2022 - [application-package] added support for declaring extensions as peer dependencies [#11808](https://github.com/eclipse-theia/theia/pull/11808) diff --git a/packages/plugin-ext/src/main/browser/terminal-main.ts b/packages/plugin-ext/src/main/browser/terminal-main.ts index 54e2edf88453d..435fd1e684b34 100644 --- a/packages/plugin-ext/src/main/browser/terminal-main.ts +++ b/packages/plugin-ext/src/main/browser/terminal-main.ts @@ -137,7 +137,8 @@ export class TerminalServiceMainImpl implements TerminalServiceMain, TerminalLin attributes: options.attributes, hideFromUser: options.hideFromUser, location: this.getTerminalLocation(options, parentId), - isPseudoTerminal + isPseudoTerminal, + isTransient: options.isTransient }); if (options.message) { terminal.writeLine(options.message); diff --git a/packages/plugin/src/theia.d.ts b/packages/plugin/src/theia.d.ts index 12ac09beb6562..cbe6d3c1ca307 100644 --- a/packages/plugin/src/theia.d.ts +++ b/packages/plugin/src/theia.d.ts @@ -3006,6 +3006,12 @@ export module '@theia/plugin' { */ location?: TerminalLocation | TerminalEditorLocationOptions | TerminalSplitLocationOptions; + /** + * Opt-out of the default terminal persistence on restart and reload. + * This will only take effect when `terminal.integrated.enablePersistentSessions` is enabled. + */ + isTransient?: boolean; + /** * Terminal attributes. Can be useful to apply some implementation specific information. */ @@ -3077,6 +3083,12 @@ export module '@theia/plugin' { * The {@link TerminalLocation} or {@link TerminalEditorLocationOptions} or {@link TerminalSplitLocationOptions} for the terminal. */ location?: TerminalLocation | TerminalEditorLocationOptions | TerminalSplitLocationOptions; + + /** + * Opt-out of the default terminal persistence on restart and reload. + * This will only take effect when `terminal.integrated.enablePersistentSessions` is enabled. + */ + isTransient?: boolean; } /** diff --git a/packages/terminal/src/browser/base/terminal-widget.ts b/packages/terminal/src/browser/base/terminal-widget.ts index e355f8312e6ae..1cbcc1351ff9f 100644 --- a/packages/terminal/src/browser/base/terminal-widget.ts +++ b/packages/terminal/src/browser/base/terminal-widget.ts @@ -231,4 +231,9 @@ export interface TerminalWidgetOptions { readonly hideFromUser?: boolean; readonly location?: TerminalLocationOptions; + + /** + * When enabled, the terminal will not be persisted across window reloads. + */ + readonly isTransient?: boolean; } diff --git a/packages/terminal/src/browser/terminal-preferences.ts b/packages/terminal/src/browser/terminal-preferences.ts index 48913d1676a8b..f1baaf31b83bb 100644 --- a/packages/terminal/src/browser/terminal-preferences.ts +++ b/packages/terminal/src/browser/terminal-preferences.ts @@ -153,6 +153,11 @@ export const TerminalConfigSchema: PreferenceSchema = { nls.localize('theia/terminal/confirmCloseChildren', 'Confirm if there are any terminals that have child processes.'), ], default: 'never' + }, + 'terminal.integrated.enablePersistentSessions': { + type: 'boolean', + description: nls.localizeByDefault('Persist terminal sessions for the workspace across window reloads.'), + default: true } } }; @@ -181,7 +186,8 @@ export interface TerminalConfiguration { 'terminal.integrated.shellArgs.windows': string[], 'terminal.integrated.shellArgs.osx': string[], 'terminal.integrated.shellArgs.linux': string[], - 'terminal.integrated.confirmOnExit': ConfirmOnExitType + 'terminal.integrated.confirmOnExit': ConfirmOnExitType, + 'terminal.integrated.enablePersistentSessions': boolean } type FontWeight = 'normal' | 'bold' | '100' | '200' | '300' | '400' | '500' | '600' | '700' | '800' | '900'; diff --git a/packages/terminal/src/browser/terminal-widget-impl.ts b/packages/terminal/src/browser/terminal-widget-impl.ts index b05ffe8dad995..937e89cddacc5 100644 --- a/packages/terminal/src/browser/terminal-widget-impl.ts +++ b/packages/terminal/src/browser/terminal-widget-impl.ts @@ -407,6 +407,11 @@ export class TerminalWidgetImpl extends TerminalWidget implements StatefulWidget return this.options.hideFromUser ?? false; } + get transient(): boolean { + // The terminal is transient if session persistence is disabled or it's explicitly marked as transient + return !this.preferences['terminal.integrated.enablePersistentSessions'] || !!this.options.isTransient; + } + onDispose(onDispose: () => void): void { this.toDispose.push(Disposable.create(onDispose)); } @@ -421,15 +426,15 @@ export class TerminalWidgetImpl extends TerminalWidget implements StatefulWidget storeState(): object { this.closeOnDispose = false; - if (this.options.isPseudoTerminal) { + if (this.transient || this.options.isPseudoTerminal) { return {}; } return { terminalId: this.terminalId, titleLabel: this.title.label }; } restoreState(oldState: object): void { - // pseudo terminal can not restore - if (this.options.isPseudoTerminal) { + // transient terminals and pseudo terminals are not restored + if (this.transient || this.options.isPseudoTerminal) { this.dispose(); return; }