Skip to content

Commit 8cf99fe

Browse files
authored
Merge pull request microsoft#160701 from microsoft/tyriar/158595_3
Only persist session when icon update was user initiated
2 parents 32579e9 + b55db1f commit 8cf99fe

File tree

11 files changed

+33
-31
lines changed

11 files changed

+33
-31
lines changed

src/vs/platform/terminal/common/terminal.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -317,7 +317,7 @@ export interface IPtyService extends IPtyHostController {
317317
/** Confirm the process is _not_ an orphan. */
318318
orphanQuestionReply(id: number): Promise<void>;
319319
updateTitle(id: number, title: string, titleSource: TitleEventSource): Promise<void>;
320-
updateIcon(id: number, icon: TerminalIcon, color?: string): Promise<void>;
320+
updateIcon(id: number, userInitiated: boolean, icon: TerminalIcon, color?: string): Promise<void>;
321321
installAutoReply(match: string, reply: string): Promise<void>;
322322
uninstallAllAutoReplies(): Promise<void>;
323323
uninstallAutoReply(match: string): Promise<void>;

src/vs/platform/terminal/node/ptyHostService.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -224,8 +224,8 @@ export class PtyHostService extends Disposable implements IPtyService {
224224
updateTitle(id: number, title: string, titleSource: TitleEventSource): Promise<void> {
225225
return this._proxy.updateTitle(id, title, titleSource);
226226
}
227-
updateIcon(id: number, icon: TerminalIcon, color?: string): Promise<void> {
228-
return this._proxy.updateIcon(id, icon, color);
227+
updateIcon(id: number, userInitiated: boolean, icon: TerminalIcon, color?: string): Promise<void> {
228+
return this._proxy.updateIcon(id, userInitiated, icon, color);
229229
}
230230
attachToProcess(id: number): Promise<void> {
231231
return this._proxy.attachToProcess(id);

src/vs/platform/terminal/node/ptyService.ts

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -225,8 +225,8 @@ export class PtyService extends Disposable implements IPtyService {
225225
this._throwIfNoPty(id).setTitle(title, titleSource);
226226
}
227227

228-
async updateIcon(id: number, icon: URI | { light: URI; dark: URI } | { id: string; color?: { id: string } }, color?: string): Promise<void> {
229-
this._throwIfNoPty(id).setIcon(icon, color);
228+
async updateIcon(id: number, userInitiated: boolean, icon: URI | { light: URI; dark: URI } | { id: string; color?: { id: string } }, color?: string): Promise<void> {
229+
this._throwIfNoPty(id).setIcon(userInitiated, icon, color);
230230
}
231231

232232
async refreshProperty<T extends ProcessPropertyType>(id: number, type: T): Promise<IProcessPropertyMap[T]> {
@@ -496,12 +496,14 @@ export class PersistentTerminalProcess extends Disposable {
496496
this._titleSource = titleSource;
497497
}
498498

499-
setIcon(icon: TerminalIcon, color?: string): void {
499+
setIcon(userInitiated: boolean, icon: TerminalIcon, color?: string): void {
500500
if (!this._icon || 'id' in icon && 'id' in this._icon && icon.id !== this._icon.id ||
501501
!this.color || color !== this._color) {
502502

503503
this._serializer.freeRawReviveBuffer();
504-
this._interactionState.setValue(InteractionState.Session, 'setIcon');
504+
if (userInitiated) {
505+
this._interactionState.setValue(InteractionState.Session, 'setIcon');
506+
}
505507
}
506508
this._icon = icon;
507509
this._color = color;

src/vs/workbench/contrib/terminal/browser/remoteTerminalBackend.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -289,8 +289,8 @@ class RemoteTerminalBackend extends BaseTerminalBackend implements ITerminalBack
289289
await this._remoteTerminalChannel?.updateTitle(id, title, titleSource);
290290
}
291291

292-
async updateIcon(id: number, icon: TerminalIcon, color?: string): Promise<void> {
293-
await this._remoteTerminalChannel?.updateIcon(id, icon, color);
292+
async updateIcon(id: number, userInitiated: boolean, icon: TerminalIcon, color?: string): Promise<void> {
293+
await this._remoteTerminalChannel?.updateIcon(id, userInitiated, icon, color);
294294
}
295295

296296
async getDefaultSystemShell(osOverride?: OperatingSystem): Promise<string> {

src/vs/workbench/contrib/terminal/browser/terminal.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -144,8 +144,8 @@ export interface ITerminalService extends ITerminalInstanceHost {
144144
onDidMaximumDimensionsChange: Event<ITerminalInstance>;
145145
onDidRequestStartExtensionTerminal: Event<IStartExtensionTerminalRequest>;
146146
onDidChangeInstanceTitle: Event<ITerminalInstance | undefined>;
147-
onDidChangeInstanceIcon: Event<ITerminalInstance | undefined>;
148-
onDidChangeInstanceColor: Event<ITerminalInstance | undefined>;
147+
onDidChangeInstanceIcon: Event<{ instance: ITerminalInstance; userInitiated: boolean }>;
148+
onDidChangeInstanceColor: Event<{ instance: ITerminalInstance; userInitiated: boolean }>;
149149
onDidChangeInstancePrimaryStatus: Event<ITerminalInstance>;
150150
onDidInputInstanceData: Event<ITerminalInstance>;
151151
onDidRegisterProcessSupport: Event<void>;
@@ -524,7 +524,7 @@ export interface ITerminalInstance {
524524
/**
525525
* An event that fires when the terminal instance's icon changes.
526526
*/
527-
onIconChanged: Event<ITerminalInstance>;
527+
onIconChanged: Event<{ instance: ITerminalInstance; userInitiated: boolean }>;
528528

529529
/**
530530
* An event that fires when the terminal instance is disposed.

src/vs/workbench/contrib/terminal/browser/terminalInstance.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -319,7 +319,7 @@ export class TerminalInstance extends Disposable implements ITerminalInstance {
319319
readonly onLinksReady = this._onLinksReady.event;
320320
private readonly _onTitleChanged = this._register(new Emitter<ITerminalInstance>());
321321
readonly onTitleChanged = this._onTitleChanged.event;
322-
private readonly _onIconChanged = this._register(new Emitter<ITerminalInstance>());
322+
private readonly _onIconChanged = this._register(new Emitter<{ instance: ITerminalInstance; userInitiated: boolean }>());
323323
readonly onIconChanged = this._onIconChanged.event;
324324
private readonly _onData = this._register(new Emitter<string>());
325325
readonly onData = this._onData.event;
@@ -1464,7 +1464,7 @@ export class TerminalInstance extends Disposable implements ITerminalInstance {
14641464
}
14651465
if (originalIcon !== this.shellLaunchConfig.icon || this.shellLaunchConfig.color) {
14661466
this._icon = this._shellLaunchConfig.attachPersistentProcess?.icon || this._shellLaunchConfig.icon;
1467-
this._onIconChanged.fire(this);
1467+
this._onIconChanged.fire({ instance: this, userInitiated: false });
14681468
}
14691469
}
14701470

@@ -2211,7 +2211,7 @@ export class TerminalInstance extends Disposable implements ITerminalInstance {
22112211
});
22122212
if (result) {
22132213
this._icon = result.icon;
2214-
this._onIconChanged.fire(this);
2214+
this._onIconChanged.fire({ instance: this, userInitiated: true });
22152215
}
22162216
}
22172217

@@ -2248,7 +2248,7 @@ export class TerminalInstance extends Disposable implements ITerminalInstance {
22482248

22492249
if (result) {
22502250
this.shellLaunchConfig.color = result.id;
2251-
this._onIconChanged.fire(this);
2251+
this._onIconChanged.fire({ instance: this, userInitiated: true });
22522252
}
22532253

22542254
quickPick.hide();

src/vs/workbench/contrib/terminal/browser/terminalService.ts

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -134,10 +134,10 @@ export class TerminalService implements ITerminalService {
134134
get onDidChangeInstances(): Event<void> { return this._onDidChangeInstances.event; }
135135
private readonly _onDidChangeInstanceTitle = new Emitter<ITerminalInstance | undefined>();
136136
get onDidChangeInstanceTitle(): Event<ITerminalInstance | undefined> { return this._onDidChangeInstanceTitle.event; }
137-
private readonly _onDidChangeInstanceIcon = new Emitter<ITerminalInstance | undefined>();
138-
get onDidChangeInstanceIcon(): Event<ITerminalInstance | undefined> { return this._onDidChangeInstanceIcon.event; }
139-
private readonly _onDidChangeInstanceColor = new Emitter<ITerminalInstance | undefined>();
140-
get onDidChangeInstanceColor(): Event<ITerminalInstance | undefined> { return this._onDidChangeInstanceColor.event; }
137+
private readonly _onDidChangeInstanceIcon = new Emitter<{ instance: ITerminalInstance; userInitiated: boolean }>();
138+
get onDidChangeInstanceIcon(): Event<{ instance: ITerminalInstance; userInitiated: boolean }> { return this._onDidChangeInstanceIcon.event; }
139+
private readonly _onDidChangeInstanceColor = new Emitter<{ instance: ITerminalInstance; userInitiated: boolean }>();
140+
get onDidChangeInstanceColor(): Event<{ instance: ITerminalInstance; userInitiated: boolean }> { return this._onDidChangeInstanceColor.event; }
141141
private readonly _onDidChangeActiveInstance = new Emitter<ITerminalInstance | undefined>();
142142
get onDidChangeActiveInstance(): Event<ITerminalInstance | undefined> { return this._onDidChangeActiveInstance.event; }
143143
private readonly _onDidChangeInstancePrimaryStatus = new Emitter<ITerminalInstance>();
@@ -501,7 +501,7 @@ export class TerminalService implements ITerminalService {
501501
// terminal ID will be stale and the process will be leaked.
502502
this.onDidReceiveProcessId(() => this._saveState());
503503
this.onDidChangeInstanceTitle(instance => this._updateTitle(instance));
504-
this.onDidChangeInstanceIcon(instance => this._updateIcon(instance));
504+
this.onDidChangeInstanceIcon(e => this._updateIcon(e.instance, e.userInitiated));
505505
}
506506

507507
private _handleInstanceContextKeys(): void {
@@ -676,7 +676,7 @@ export class TerminalService implements ITerminalService {
676676
}
677677

678678
@debounce(500)
679-
private _updateTitle(instance?: ITerminalInstance): void {
679+
private _updateTitle(instance: ITerminalInstance | undefined): void {
680680
if (!this.configHelper.config.enablePersistentSessions || !instance || !instance.persistentProcessId || !instance.title || instance.isDisposed) {
681681
return;
682682
}
@@ -688,11 +688,11 @@ export class TerminalService implements ITerminalService {
688688
}
689689

690690
@debounce(500)
691-
private _updateIcon(instance?: ITerminalInstance): void {
691+
private _updateIcon(instance: ITerminalInstance, userInitiated: boolean): void {
692692
if (!this.configHelper.config.enablePersistentSessions || !instance || !instance.persistentProcessId || !instance.icon || instance.isDisposed) {
693693
return;
694694
}
695-
this._primaryBackend?.updateIcon(instance.persistentProcessId, instance.icon, instance.color);
695+
this._primaryBackend?.updateIcon(instance.persistentProcessId, userInitiated, instance.icon, instance.color);
696696
}
697697

698698
refreshActiveGroup(): void {

src/vs/workbench/contrib/terminal/browser/terminalView.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -398,8 +398,8 @@ class SingleTerminalTabActionViewItem extends MenuEntryActionViewItem {
398398
// Register listeners to update the tab
399399
this._register(this._terminalService.onDidChangeInstancePrimaryStatus(e => this.updateLabel(e)));
400400
this._register(this._terminalGroupService.onDidChangeActiveInstance(() => this.updateLabel()));
401-
this._register(this._terminalService.onDidChangeInstanceIcon(e => this.updateLabel(e)));
402-
this._register(this._terminalService.onDidChangeInstanceColor(e => this.updateLabel(e)));
401+
this._register(this._terminalService.onDidChangeInstanceIcon(e => this.updateLabel(e.instance)));
402+
this._register(this._terminalService.onDidChangeInstanceColor(e => this.updateLabel(e.instance)));
403403
this._register(this._terminalService.onDidChangeInstanceTitle(e => {
404404
if (e === this._terminalGroupService.activeInstance) {
405405
this._action.tooltip = getSingleTabTooltip(e, this._terminalService.configHelper.config.tabs.separator);

src/vs/workbench/contrib/terminal/common/remoteTerminalChannel.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -276,8 +276,8 @@ export class RemoteTerminalChannelClient implements IPtyHostController {
276276
return this._channel.call('$updateTitle', [id, title, titleSource]);
277277
}
278278

279-
updateIcon(id: number, icon: TerminalIcon, color?: string): Promise<string> {
280-
return this._channel.call('$updateIcon', [id, icon, color]);
279+
updateIcon(id: number, userInitiated: boolean, icon: TerminalIcon, color?: string): Promise<string> {
280+
return this._channel.call('$updateIcon', [id, userInitiated, icon, color]);
281281
}
282282

283283
refreshProperty<T extends ProcessPropertyType>(id: number, property: T): Promise<IProcessPropertyMap[T]> {

src/vs/workbench/contrib/terminal/common/terminal.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,7 @@ export interface ITerminalBackend {
127127
getShellEnvironment(): Promise<IProcessEnvironment | undefined>;
128128
setTerminalLayoutInfo(layoutInfo?: ITerminalsLayoutInfoById): Promise<void>;
129129
updateTitle(id: number, title: string, titleSource: TitleEventSource): Promise<void>;
130-
updateIcon(id: number, icon: TerminalIcon, color?: string): Promise<void>;
130+
updateIcon(id: number, userInitiated: boolean, icon: TerminalIcon, color?: string): Promise<void>;
131131
getTerminalLayoutInfo(): Promise<ITerminalsLayoutInfo | undefined>;
132132
reduceConnectionGraceTime(): Promise<void>;
133133
requestDetachInstance(workspaceId: string, instanceId: number): Promise<IProcessDetails | undefined>;

0 commit comments

Comments
 (0)