@@ -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