Skip to content

Commit 8601698

Browse files
committed
Consolidate process data handlers and split by 633;C
1 parent 4080745 commit 8601698

File tree

1 file changed

+25
-10
lines changed

1 file changed

+25
-10
lines changed

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

Lines changed: 25 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1394,10 +1394,6 @@ export class TerminalInstance extends Disposable implements ITerminalInstance {
13941394
}
13951395
}));
13961396

1397-
this._register(processManager.onProcessData(ev => {
1398-
this._initialDataEvents?.push(ev.data);
1399-
this._onData.fire(ev.data);
1400-
}));
14011397
this._register(processManager.onProcessReplayComplete(() => this._onProcessReplayComplete.fire()));
14021398
this._register(processManager.onEnvironmentVariableInfoChanged(e => this._onEnvironmentVariableInfoChanged(e)));
14031399
this._register(processManager.onPtyDisconnect(() => {
@@ -1480,19 +1476,38 @@ export class TerminalInstance extends Disposable implements ITerminalInstance {
14801476
}
14811477

14821478
private _onProcessData(ev: IProcessDataEvent): void {
1483-
if (ev.trackCommit) {
1484-
ev.writePromise = new Promise<void>(r => this._writeProcessData(ev, r));
1479+
// TODO: Move to separate listener
1480+
this._initialDataEvents?.push(ev.data);
1481+
1482+
// Ensure events are split by SI command execute sequence to ensure the output of the
1483+
// command can be read by extensions. This must be done here as xterm.js does not currently
1484+
// have a listener for when individual data events are parsed, only `onWriteParsed` which
1485+
// fires when the write buffer is flushed.
1486+
const execIndex = ev.data.indexOf('\x1b]633;C\x07');
1487+
if (execIndex !== -1) {
1488+
if (ev.trackCommit) {
1489+
this._writeProcessData(ev.data.substring(0, execIndex + '\x1b]633;C\x07'.length));
1490+
ev.writePromise = new Promise<void>(r => this._writeProcessData(ev.data.substring(execIndex + '\x1b]633;C\x07'.length), r));
1491+
} else {
1492+
this._writeProcessData(ev.data.substring(0, execIndex + '\x1b]633;C\x07'.length));
1493+
this._writeProcessData(ev.data.substring(execIndex + '\x1b]633;C\x07'.length));
1494+
}
14851495
} else {
1486-
this._writeProcessData(ev);
1496+
if (ev.trackCommit) {
1497+
ev.writePromise = new Promise<void>(r => this._writeProcessData(ev.data, r));
1498+
} else {
1499+
this._writeProcessData(ev.data);
1500+
}
14871501
}
14881502
}
14891503

1490-
private _writeProcessData(ev: IProcessDataEvent, cb?: () => void) {
1504+
private _writeProcessData(data: string, cb?: () => void) {
14911505
const messageId = ++this._latestXtermWriteData;
1492-
this.xterm?.raw.write(ev.data, () => {
1506+
this.xterm?.raw.write(data, () => {
14931507
this._latestXtermParseData = messageId;
1494-
this._processManager.acknowledgeDataEvent(ev.data.length);
1508+
this._processManager.acknowledgeDataEvent(data.length);
14951509
cb?.();
1510+
this._onData.fire(data);
14961511
});
14971512
}
14981513

0 commit comments

Comments
 (0)