@@ -12,7 +12,7 @@ import { URI } from 'vs/base/common/uri';
12
12
import { getSystemShell } from 'vs/base/node/shell' ;
13
13
import { ILogService } from 'vs/platform/log/common/log' ;
14
14
import { RequestStore } from 'vs/platform/terminal/common/requestStore' ;
15
- import { IProcessDataEvent , IProcessReadyEvent , IPtyService , IRawTerminalInstanceLayoutInfo , IReconnectConstants , IRequestResolveVariablesEvent , IShellLaunchConfig , ITerminalInstanceLayoutInfoById , ITerminalLaunchError , ITerminalsLayoutInfo , ITerminalTabLayoutInfoById , TerminalIcon , IProcessProperty , TitleEventSource , ProcessPropertyType , IProcessPropertyMap , IFixedTerminalDimensions , ProcessCapability } from 'vs/platform/terminal/common/terminal' ;
15
+ import { IProcessDataEvent , IProcessReadyEvent , IPtyService , IRawTerminalInstanceLayoutInfo , IReconnectConstants , IRequestResolveVariablesEvent , IShellLaunchConfig , ITerminalDimensionsOverride , ITerminalInstanceLayoutInfoById , ITerminalLaunchError , ITerminalsLayoutInfo , ITerminalTabLayoutInfoById , TerminalIcon , IProcessProperty , TerminalShellType , TitleEventSource , ProcessPropertyType , ProcessCapability , IProcessPropertyMap , IFixedTerminalDimensions } from 'vs/platform/terminal/common/terminal' ;
16
16
import { TerminalDataBufferer } from 'vs/platform/terminal/common/terminalDataBuffering' ;
17
17
import { escapeNonWindowsPath } from 'vs/platform/terminal/common/terminalEnvironment' ;
18
18
import { Terminal as XtermTerminal } from 'xterm-headless' ;
@@ -44,12 +44,24 @@ export class PtyService extends Disposable implements IPtyService {
44
44
readonly onProcessData = this . _onProcessData . event ;
45
45
private readonly _onProcessReplay = this . _register ( new Emitter < { id : number , event : IPtyHostProcessReplayEvent } > ( ) ) ;
46
46
readonly onProcessReplay = this . _onProcessReplay . event ;
47
+ private readonly _onProcessExit = this . _register ( new Emitter < { id : number , event : number | undefined } > ( ) ) ;
48
+ readonly onProcessExit = this . _onProcessExit . event ;
47
49
private readonly _onProcessReady = this . _register ( new Emitter < { id : number , event : { pid : number , cwd : string , capabilities : ProcessCapability [ ] } } > ( ) ) ;
48
50
readonly onProcessReady = this . _onProcessReady . event ;
51
+ private readonly _onProcessTitleChanged = this . _register ( new Emitter < { id : number , event : string } > ( ) ) ;
52
+ readonly onProcessTitleChanged = this . _onProcessTitleChanged . event ;
53
+ private readonly _onProcessShellTypeChanged = this . _register ( new Emitter < { id : number , event : TerminalShellType } > ( ) ) ;
54
+ readonly onProcessShellTypeChanged = this . _onProcessShellTypeChanged . event ;
55
+ private readonly _onProcessOverrideDimensions = this . _register ( new Emitter < { id : number , event : ITerminalDimensionsOverride | undefined } > ( ) ) ;
56
+ readonly onProcessOverrideDimensions = this . _onProcessOverrideDimensions . event ;
57
+ private readonly _onProcessResolvedShellLaunchConfig = this . _register ( new Emitter < { id : number , event : IShellLaunchConfig } > ( ) ) ;
58
+ readonly onProcessResolvedShellLaunchConfig = this . _onProcessResolvedShellLaunchConfig . event ;
49
59
private readonly _onProcessOrphanQuestion = this . _register ( new Emitter < { id : number } > ( ) ) ;
50
60
readonly onProcessOrphanQuestion = this . _onProcessOrphanQuestion . event ;
51
61
private readonly _onDidRequestDetach = this . _register ( new Emitter < { requestId : number , workspaceId : string , instanceId : number } > ( ) ) ;
52
62
readonly onDidRequestDetach = this . _onDidRequestDetach . event ;
63
+ private readonly _onProcessDidChangeHasChildProcesses = this . _register ( new Emitter < { id : number , event : boolean } > ( ) ) ;
64
+ readonly onProcessDidChangeHasChildProcesses = this . _onProcessDidChangeHasChildProcesses . event ;
53
65
private readonly _onDidChangeProperty = this . _register ( new Emitter < { id : number , property : IProcessProperty < any > } > ( ) ) ;
54
66
readonly onDidChangeProperty = this . _onDidChangeProperty . event ;
55
67
@@ -183,21 +195,31 @@ export class PtyService extends Disposable implements IPtyService {
183
195
const id = ++ this . _lastPtyId ;
184
196
const process = new TerminalProcess ( shellLaunchConfig , cwd , cols , rows , env , executableEnv , windowsEnableConpty , this . _logService ) ;
185
197
process . onProcessData ( event => this . _onProcessData . fire ( { id, event } ) ) ;
198
+ process . onProcessExit ( event => this . _onProcessExit . fire ( { id, event } ) ) ;
199
+ if ( process . onProcessOverrideDimensions ) {
200
+ process . onProcessOverrideDimensions ( event => this . _onProcessOverrideDimensions . fire ( { id, event } ) ) ;
201
+ }
202
+ if ( process . onProcessResolvedShellLaunchConfig ) {
203
+ process . onProcessResolvedShellLaunchConfig ( event => this . _onProcessResolvedShellLaunchConfig . fire ( { id, event } ) ) ;
204
+ }
205
+ if ( process . onDidChangeHasChildProcesses ) {
206
+ process . onDidChangeHasChildProcesses ( event => this . _onProcessDidChangeHasChildProcesses . fire ( { id, event } ) ) ;
207
+ }
186
208
const processLaunchOptions : IPersistentTerminalProcessLaunchOptions = {
187
209
env,
188
210
executableEnv,
189
211
windowsEnableConpty
190
212
} ;
191
213
const persistentProcess = new PersistentTerminalProcess ( id , process , workspaceId , workspaceName , shouldPersist , cols , rows , processLaunchOptions , unicodeVersion , this . _reconnectConstants , this . _logService , isReviving ? shellLaunchConfig . initialText : undefined , shellLaunchConfig . icon , shellLaunchConfig . color , shellLaunchConfig . fixedDimensions ) ;
192
- process . onDidChangeProperty ( property => {
193
- if ( property . type === ProcessPropertyType . Exit ) {
194
- persistentProcess . dispose ( ) ;
195
- this . _ptys . delete ( id ) ;
196
- }
197
- this . _onDidChangeProperty . fire ( { id, property } ) ;
214
+ process . onProcessExit ( ( ) => {
215
+ persistentProcess . dispose ( ) ;
216
+ this . _ptys . delete ( id ) ;
198
217
} ) ;
218
+ process . onDidChangeProperty ( property => this . _onDidChangeProperty . fire ( { id, property } ) ) ;
199
219
persistentProcess . onProcessReplay ( event => this . _onProcessReplay . fire ( { id, event } ) ) ;
200
220
persistentProcess . onProcessReady ( event => this . _onProcessReady . fire ( { id, event } ) ) ;
221
+ persistentProcess . onProcessTitleChanged ( event => this . _onProcessTitleChanged . fire ( { id, event } ) ) ;
222
+ persistentProcess . onProcessShellTypeChanged ( event => this . _onProcessShellTypeChanged . fire ( { id, event } ) ) ;
201
223
persistentProcess . onProcessOrphanQuestion ( ( ) => this . _onProcessOrphanQuestion . fire ( { id } ) ) ;
202
224
persistentProcess . onDidChangeProperty ( property => this . _onDidChangeProperty . fire ( { id, property } ) ) ;
203
225
this . _ptys . set ( id , persistentProcess ) ;
@@ -406,6 +428,12 @@ export class PersistentTerminalProcess extends Disposable {
406
428
readonly onProcessReplay = this . _onProcessReplay . event ;
407
429
private readonly _onProcessReady = this . _register ( new Emitter < IProcessReadyEvent > ( ) ) ;
408
430
readonly onProcessReady = this . _onProcessReady . event ;
431
+ private readonly _onProcessTitleChanged = this . _register ( new Emitter < string > ( ) ) ;
432
+ readonly onProcessTitleChanged = this . _onProcessTitleChanged . event ;
433
+ private readonly _onProcessShellTypeChanged = this . _register ( new Emitter < TerminalShellType > ( ) ) ;
434
+ readonly onProcessShellTypeChanged = this . _onProcessShellTypeChanged . event ;
435
+ private readonly _onProcessOverrideDimensions = this . _register ( new Emitter < ITerminalDimensionsOverride | undefined > ( ) ) ;
436
+ readonly onProcessOverrideDimensions = this . _onProcessOverrideDimensions . event ;
409
437
private readonly _onProcessData = this . _register ( new Emitter < string > ( ) ) ;
410
438
readonly onProcessData = this . _onProcessData . event ;
411
439
private readonly _onProcessOrphanQuestion = this . _register ( new Emitter < void > ( ) ) ;
@@ -483,24 +511,20 @@ export class PersistentTerminalProcess extends Disposable {
483
511
this . _logService . info ( `Persistent process "${ this . _persistentProcessId } ": The short reconnection grace time of ${ printTime ( reconnectConstants . shortGraceTime ) } has expired, shutting down pid ${ this . _pid } ` ) ;
484
512
this . shutdown ( true ) ;
485
513
} , reconnectConstants . shortGraceTime ) ) ;
486
- this . _register ( this . _terminalProcess . onDidChangeProperty ( e => {
487
- if ( e . type === ProcessPropertyType . Exit ) {
488
- this . _bufferer . stopBuffering ( this . _persistentProcessId ) ;
489
- }
490
- this . _onDidChangeProperty . fire ( e ) ;
491
- } ) ) ;
514
+
492
515
this . _register ( this . _terminalProcess . onProcessReady ( e => {
493
516
this . _pid = e . pid ;
494
517
this . _cwd = e . cwd ;
495
518
this . _onProcessReady . fire ( e ) ;
496
519
} ) ) ;
497
- this . _register ( this . _terminalProcess . onDidChangeProperty ( e => {
498
- this . _onDidChangeProperty . fire ( e ) ;
499
- } ) ) ;
520
+ this . _register ( this . _terminalProcess . onProcessTitleChanged ( e => this . _onProcessTitleChanged . fire ( e ) ) ) ;
521
+ this . _register ( this . _terminalProcess . onProcessShellTypeChanged ( e => this . _onProcessShellTypeChanged . fire ( e ) ) ) ;
522
+ this . _register ( this . _terminalProcess . onDidChangeProperty ( e => this . _onDidChangeProperty . fire ( e ) ) ) ;
500
523
501
524
// Data buffering to reduce the amount of messages going to the renderer
502
525
this . _bufferer = new TerminalDataBufferer ( ( _ , data ) => this . _onProcessData . fire ( data ) ) ;
503
526
this . _register ( this . _bufferer . startBuffering ( this . _persistentProcessId , this . _terminalProcess . onProcessData ) ) ;
527
+ this . _register ( this . _terminalProcess . onProcessExit ( ( ) => this . _bufferer . stopBuffering ( this . _persistentProcessId ) ) ) ;
504
528
505
529
// Data recording for reconnect
506
530
this . _register ( this . onProcessData ( e => this . _serializer . handleData ( e ) ) ) ;
@@ -555,8 +579,8 @@ export class PersistentTerminalProcess extends Disposable {
555
579
}
556
580
} else {
557
581
this . _onProcessReady . fire ( { pid : this . _pid , cwd : this . _cwd , capabilities : this . _terminalProcess . capabilities , requiresWindowsMode : isWindows && getWindowsBuildNumber ( ) < 21376 } ) ;
558
- this . _onDidChangeProperty . fire ( { type : ProcessPropertyType . Title , value : this . _terminalProcess . currentTitle } ) ;
559
- this . _onDidChangeProperty . fire ( { type : ProcessPropertyType . ShellType , value : this . _terminalProcess . shellType } ) ;
582
+ this . _onProcessTitleChanged . fire ( this . _terminalProcess . currentTitle ) ;
583
+ this . _onProcessShellTypeChanged . fire ( this . _terminalProcess . shellType ) ;
560
584
this . triggerReplay ( ) ;
561
585
}
562
586
return undefined ;
0 commit comments