Skip to content

Commit f0b8ca7

Browse files
committed
Prevent duplicate terminal API data and input events from firing
Fixes microsoft#54096
1 parent e9fb3b2 commit f0b8ca7

1 file changed

Lines changed: 26 additions & 6 deletions

File tree

src/vs/workbench/api/electron-browser/mainThreadTerminalService.ts

Lines changed: 26 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@ export class MainThreadTerminalService implements MainThreadTerminalServiceShape
1616
private _proxy: ExtHostTerminalServiceShape;
1717
private _toDispose: IDisposable[] = [];
1818
private _terminalProcesses: { [id: number]: ITerminalProcessExtHostProxy } = {};
19+
private _terminalOnDidWriteDataListeners: { [id: number]: IDisposable } = {};
20+
private _terminalOnDidAcceptInputListeners: { [id: number]: IDisposable } = {};
1921

2022
constructor(
2123
extHostContext: IExtHostContext,
@@ -114,9 +116,18 @@ export class MainThreadTerminalService implements MainThreadTerminalServiceShape
114116

115117
public $terminalRendererRegisterOnInputListener(terminalId: number): void {
116118
const terminalInstance = this.terminalService.getInstanceFromId(terminalId);
117-
if (terminalInstance) {
118-
terminalInstance.addDisposable(terminalInstance.onRendererInput(data => this._onTerminalRendererInput(terminalId, data)));
119+
if (!terminalInstance) {
120+
return;
121+
}
122+
123+
// Listener already registered
124+
if (this._terminalOnDidAcceptInputListeners.hasOwnProperty(terminalId)) {
125+
return;
119126
}
127+
128+
// Register
129+
this._terminalOnDidAcceptInputListeners[terminalId] = terminalInstance.onRendererInput(data => this._onTerminalRendererInput(terminalId, data));
130+
terminalInstance.addDisposable(this._terminalOnDidAcceptInputListeners[terminalId]);
120131
}
121132

122133
public $sendText(terminalId: number, text: string, addNewLine: boolean): void {
@@ -128,11 +139,20 @@ export class MainThreadTerminalService implements MainThreadTerminalServiceShape
128139

129140
public $registerOnDataListener(terminalId: number): void {
130141
const terminalInstance = this.terminalService.getInstanceFromId(terminalId);
131-
if (terminalInstance) {
132-
terminalInstance.addDisposable(terminalInstance.onData(data => {
133-
this._onTerminalData(terminalId, data);
134-
}));
142+
if (!terminalInstance) {
143+
return;
135144
}
145+
146+
// Listener already registered
147+
if (this._terminalOnDidWriteDataListeners[terminalId]) {
148+
return;
149+
}
150+
151+
// Register
152+
this._terminalOnDidWriteDataListeners[terminalId] = terminalInstance.onData(data => {
153+
this._onTerminalData(terminalId, data);
154+
});
155+
terminalInstance.addDisposable(this._terminalOnDidWriteDataListeners[terminalId]);
136156
}
137157

138158
private _onActiveTerminalChanged(terminalId: number | undefined): void {

0 commit comments

Comments
 (0)