@xterm/xterm 6.1.0-beta.21 → 6.1.0-beta.210

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (158) hide show
  1. package/README.md +61 -38
  2. package/css/xterm.css +29 -22
  3. package/lib/xterm.js +1 -1
  4. package/lib/xterm.js.map +1 -1
  5. package/lib/xterm.mjs +8 -34
  6. package/lib/xterm.mjs.map +4 -4
  7. package/package.json +24 -13
  8. package/src/browser/AccessibilityManager.ts +6 -3
  9. package/src/browser/Clipboard.ts +6 -3
  10. package/src/browser/CoreBrowserTerminal.ts +147 -318
  11. package/src/browser/Dom.ts +178 -0
  12. package/src/browser/Linkifier.ts +11 -11
  13. package/src/browser/OscLinkProvider.ts +3 -1
  14. package/src/browser/RenderDebouncer.ts +2 -2
  15. package/src/browser/TimeBasedDebouncer.ts +2 -2
  16. package/src/browser/Types.ts +12 -11
  17. package/src/browser/Viewport.ts +55 -20
  18. package/src/browser/decorations/BufferDecorationRenderer.ts +1 -1
  19. package/src/browser/decorations/OverviewRulerRenderer.ts +33 -17
  20. package/src/browser/input/CompositionHelper.ts +44 -8
  21. package/src/browser/public/Terminal.ts +25 -28
  22. package/src/browser/renderer/dom/DomRenderer.ts +205 -41
  23. package/src/browser/renderer/dom/DomRendererRowFactory.ts +19 -13
  24. package/src/browser/renderer/dom/WidthCache.ts +54 -52
  25. package/src/browser/renderer/shared/Constants.ts +7 -0
  26. package/src/browser/renderer/shared/TextBlinkStateManager.ts +97 -0
  27. package/src/browser/renderer/shared/Types.ts +8 -2
  28. package/src/browser/scrollable/abstractScrollbar.ts +300 -0
  29. package/src/browser/scrollable/fastDomNode.ts +126 -0
  30. package/src/browser/scrollable/globalPointerMoveMonitor.ts +90 -0
  31. package/src/browser/scrollable/horizontalScrollbar.ts +85 -0
  32. package/src/browser/scrollable/mouseEvent.ts +292 -0
  33. package/src/browser/scrollable/scrollable.ts +486 -0
  34. package/src/browser/scrollable/scrollableElement.ts +579 -0
  35. package/src/browser/scrollable/scrollableElementOptions.ts +161 -0
  36. package/src/browser/scrollable/scrollbarArrow.ts +110 -0
  37. package/src/browser/scrollable/scrollbarState.ts +246 -0
  38. package/src/browser/scrollable/scrollbarVisibilityController.ts +113 -0
  39. package/src/browser/scrollable/touch.ts +485 -0
  40. package/src/browser/scrollable/verticalScrollbar.ts +143 -0
  41. package/src/browser/scrollable/widget.ts +23 -0
  42. package/src/browser/services/CharSizeService.ts +2 -2
  43. package/src/browser/services/CoreBrowserService.ts +7 -5
  44. package/src/browser/services/KeyboardService.ts +67 -0
  45. package/src/browser/services/LinkProviderService.ts +1 -1
  46. package/src/browser/services/MouseCoordsService.ts +47 -0
  47. package/src/browser/services/MouseService.ts +518 -25
  48. package/src/browser/services/RenderService.ts +22 -15
  49. package/src/browser/services/SelectionService.ts +16 -8
  50. package/src/browser/services/Services.ts +40 -17
  51. package/src/browser/services/ThemeService.ts +2 -2
  52. package/src/common/Async.ts +105 -0
  53. package/src/common/CircularList.ts +2 -2
  54. package/src/common/Color.ts +8 -0
  55. package/src/common/CoreTerminal.ts +28 -18
  56. package/src/common/Event.ts +118 -0
  57. package/src/common/InputHandler.ts +263 -43
  58. package/src/common/Lifecycle.ts +113 -0
  59. package/src/common/Platform.ts +13 -3
  60. package/src/common/SortedList.ts +7 -3
  61. package/src/common/TaskQueue.ts +14 -5
  62. package/src/common/Types.ts +35 -15
  63. package/src/common/Version.ts +9 -0
  64. package/src/common/buffer/Buffer.ts +20 -14
  65. package/src/common/buffer/BufferLine.ts +4 -5
  66. package/src/common/buffer/BufferSet.ts +7 -6
  67. package/src/common/buffer/CellData.ts +57 -0
  68. package/src/common/buffer/Marker.ts +2 -2
  69. package/src/common/buffer/Types.ts +6 -2
  70. package/src/common/data/EscapeSequences.ts +71 -70
  71. package/src/common/input/Keyboard.ts +14 -7
  72. package/src/common/input/KittyKeyboard.ts +519 -0
  73. package/src/common/input/Win32InputMode.ts +297 -0
  74. package/src/common/input/WriteBuffer.ts +34 -2
  75. package/src/common/input/XParseColor.ts +2 -2
  76. package/src/common/parser/ApcParser.ts +245 -0
  77. package/src/common/parser/Constants.ts +22 -4
  78. package/src/common/parser/DcsParser.ts +5 -5
  79. package/src/common/parser/EscapeSequenceParser.ts +167 -57
  80. package/src/common/parser/OscParser.ts +5 -5
  81. package/src/common/parser/Params.ts +13 -0
  82. package/src/common/parser/Types.ts +36 -2
  83. package/src/common/public/BufferLineApiView.ts +2 -2
  84. package/src/common/public/BufferNamespaceApi.ts +2 -2
  85. package/src/common/public/ParserApi.ts +3 -0
  86. package/src/common/services/BufferService.ts +8 -5
  87. package/src/common/services/CharsetService.ts +4 -0
  88. package/src/common/services/CoreService.ts +18 -4
  89. package/src/common/services/DecorationService.ts +24 -8
  90. package/src/common/services/LogService.ts +1 -31
  91. package/src/common/services/{CoreMouseService.ts → MouseStateService.ts} +21 -132
  92. package/src/common/services/OptionsService.ts +13 -4
  93. package/src/common/services/Services.ts +47 -40
  94. package/src/common/services/UnicodeService.ts +1 -1
  95. package/typings/xterm.d.ts +316 -32
  96. package/src/common/TypedArrayUtils.ts +0 -17
  97. package/src/vs/base/browser/browser.ts +0 -141
  98. package/src/vs/base/browser/canIUse.ts +0 -49
  99. package/src/vs/base/browser/dom.ts +0 -2369
  100. package/src/vs/base/browser/fastDomNode.ts +0 -316
  101. package/src/vs/base/browser/globalPointerMoveMonitor.ts +0 -112
  102. package/src/vs/base/browser/iframe.ts +0 -135
  103. package/src/vs/base/browser/keyboardEvent.ts +0 -213
  104. package/src/vs/base/browser/mouseEvent.ts +0 -229
  105. package/src/vs/base/browser/touch.ts +0 -372
  106. package/src/vs/base/browser/ui/scrollbar/abstractScrollbar.ts +0 -303
  107. package/src/vs/base/browser/ui/scrollbar/horizontalScrollbar.ts +0 -114
  108. package/src/vs/base/browser/ui/scrollbar/scrollableElement.ts +0 -720
  109. package/src/vs/base/browser/ui/scrollbar/scrollableElementOptions.ts +0 -165
  110. package/src/vs/base/browser/ui/scrollbar/scrollbarArrow.ts +0 -114
  111. package/src/vs/base/browser/ui/scrollbar/scrollbarState.ts +0 -243
  112. package/src/vs/base/browser/ui/scrollbar/scrollbarVisibilityController.ts +0 -118
  113. package/src/vs/base/browser/ui/scrollbar/verticalScrollbar.ts +0 -116
  114. package/src/vs/base/browser/ui/widget.ts +0 -57
  115. package/src/vs/base/browser/window.ts +0 -14
  116. package/src/vs/base/common/arrays.ts +0 -887
  117. package/src/vs/base/common/arraysFind.ts +0 -202
  118. package/src/vs/base/common/assert.ts +0 -71
  119. package/src/vs/base/common/async.ts +0 -1992
  120. package/src/vs/base/common/cancellation.ts +0 -148
  121. package/src/vs/base/common/charCode.ts +0 -450
  122. package/src/vs/base/common/collections.ts +0 -140
  123. package/src/vs/base/common/decorators.ts +0 -130
  124. package/src/vs/base/common/equals.ts +0 -146
  125. package/src/vs/base/common/errors.ts +0 -303
  126. package/src/vs/base/common/event.ts +0 -1778
  127. package/src/vs/base/common/functional.ts +0 -32
  128. package/src/vs/base/common/hash.ts +0 -316
  129. package/src/vs/base/common/iterator.ts +0 -159
  130. package/src/vs/base/common/keyCodes.ts +0 -526
  131. package/src/vs/base/common/keybindings.ts +0 -284
  132. package/src/vs/base/common/lazy.ts +0 -47
  133. package/src/vs/base/common/lifecycle.ts +0 -801
  134. package/src/vs/base/common/linkedList.ts +0 -142
  135. package/src/vs/base/common/map.ts +0 -202
  136. package/src/vs/base/common/numbers.ts +0 -98
  137. package/src/vs/base/common/observable.ts +0 -76
  138. package/src/vs/base/common/observableInternal/api.ts +0 -31
  139. package/src/vs/base/common/observableInternal/autorun.ts +0 -281
  140. package/src/vs/base/common/observableInternal/base.ts +0 -489
  141. package/src/vs/base/common/observableInternal/debugName.ts +0 -145
  142. package/src/vs/base/common/observableInternal/derived.ts +0 -428
  143. package/src/vs/base/common/observableInternal/lazyObservableValue.ts +0 -146
  144. package/src/vs/base/common/observableInternal/logging.ts +0 -328
  145. package/src/vs/base/common/observableInternal/promise.ts +0 -209
  146. package/src/vs/base/common/observableInternal/utils.ts +0 -610
  147. package/src/vs/base/common/platform.ts +0 -281
  148. package/src/vs/base/common/scrollable.ts +0 -522
  149. package/src/vs/base/common/sequence.ts +0 -34
  150. package/src/vs/base/common/stopwatch.ts +0 -43
  151. package/src/vs/base/common/strings.ts +0 -557
  152. package/src/vs/base/common/symbols.ts +0 -9
  153. package/src/vs/base/common/uint.ts +0 -59
  154. package/src/vs/patches/nls.ts +0 -90
  155. package/src/vs/typings/base-common.d.ts +0 -20
  156. package/src/vs/typings/require.d.ts +0 -42
  157. package/src/vs/typings/vscode-globals-nls.d.ts +0 -36
  158. package/src/vs/typings/vscode-globals-product.d.ts +0 -33
@@ -3,13 +3,14 @@
3
3
  * @license MIT
4
4
  */
5
5
 
6
- import { IParsingState, IDcsHandler, IEscapeSequenceParser, IParams, IOscHandler, IHandlerCollection, CsiHandlerType, OscFallbackHandlerType, IOscParser, EscHandlerType, IDcsParser, DcsFallbackHandlerType, IFunctionIdentifier, ExecuteFallbackHandlerType, CsiFallbackHandlerType, EscFallbackHandlerType, PrintHandlerType, PrintFallbackHandlerType, ExecuteHandlerType, IParserStackState, ParserStackType, ResumableHandlersType } from 'common/parser/Types';
6
+ import { IParsingState, IDcsHandler, IEscapeSequenceParser, IParams, IOscHandler, IHandlerCollection, CsiHandlerType, OscFallbackHandlerType, IOscParser, EscHandlerType, IDcsParser, DcsFallbackHandlerType, IFunctionIdentifier, ExecuteFallbackHandlerType, CsiFallbackHandlerType, EscFallbackHandlerType, PrintHandlerType, PrintFallbackHandlerType, ExecuteHandlerType, IParserStackState, ParserStackType, ResumableHandlersType, IApcHandler, IApcParser, ApcFallbackHandlerType } from 'common/parser/Types';
7
7
  import { ParserState, ParserAction } from 'common/parser/Constants';
8
- import { Disposable, toDisposable } from 'vs/base/common/lifecycle';
8
+ import { Disposable, toDisposable } from 'common/Lifecycle';
9
9
  import { IDisposable } from 'common/Types';
10
10
  import { Params } from 'common/parser/Params';
11
11
  import { OscParser } from 'common/parser/OscParser';
12
12
  import { DcsParser } from 'common/parser/DcsParser';
13
+ import { ApcParser } from 'common/parser/ApcParser';
13
14
 
14
15
  /**
15
16
  * Table values are generated like this:
@@ -17,8 +18,8 @@ import { DcsParser } from 'common/parser/DcsParser';
17
18
  * value: action << TableValue.TRANSITION_ACTION_SHIFT | nextState
18
19
  */
19
20
  const enum TableAccess {
20
- TRANSITION_ACTION_SHIFT = 4,
21
- TRANSITION_STATE_MASK = 15,
21
+ TRANSITION_ACTION_SHIFT = 8,
22
+ TRANSITION_STATE_MASK = 255,
22
23
  INDEX_STATE_SHIFT = 8
23
24
  }
24
25
 
@@ -26,10 +27,10 @@ const enum TableAccess {
26
27
  * Transition table for EscapeSequenceParser.
27
28
  */
28
29
  export class TransitionTable {
29
- public table: Uint8Array;
30
+ public table: Uint16Array;
30
31
 
31
32
  constructor(length: number) {
32
- this.table = new Uint8Array(length);
33
+ this.table = new Uint16Array(length);
33
34
  }
34
35
 
35
36
  /**
@@ -89,22 +90,22 @@ export const VT500_TRANSITION_TABLE = (function (): TransitionTable {
89
90
  EXECUTABLES.push(0x19);
90
91
  EXECUTABLES.push.apply(EXECUTABLES, r(0x1c, 0x20));
91
92
 
92
- const states: number[] = r(ParserState.GROUND, ParserState.DCS_PASSTHROUGH + 1);
93
- let state: any;
93
+ const states: number[] = r(ParserState.GROUND, ParserState.STATE_LENGTH);
94
94
 
95
95
  // set default transition
96
96
  table.setDefault(ParserAction.ERROR, ParserState.GROUND);
97
97
  // printables
98
98
  table.addMany(PRINTABLES, ParserState.GROUND, ParserAction.PRINT, ParserState.GROUND);
99
99
  // global anywhere rules
100
- for (state in states) {
100
+ for (const state of states) {
101
101
  table.addMany([0x18, 0x1a, 0x99, 0x9a], state, ParserAction.EXECUTE, ParserState.GROUND);
102
102
  table.addMany(r(0x80, 0x90), state, ParserAction.EXECUTE, ParserState.GROUND);
103
103
  table.addMany(r(0x90, 0x98), state, ParserAction.EXECUTE, ParserState.GROUND);
104
104
  table.add(0x9c, state, ParserAction.IGNORE, ParserState.GROUND); // ST as terminator
105
105
  table.add(0x1b, state, ParserAction.CLEAR, ParserState.ESCAPE); // ESC
106
106
  table.add(0x9d, state, ParserAction.OSC_START, ParserState.OSC_STRING); // OSC
107
- table.addMany([0x98, 0x9e, 0x9f], state, ParserAction.IGNORE, ParserState.SOS_PM_APC_STRING);
107
+ table.addMany([0x98, 0x9e], state, ParserAction.IGNORE, ParserState.SOS_PM_STRING); // SOS, PM
108
+ table.add(0x9f, state, ParserAction.APC_START, ParserState.APC_STRING); // APC
108
109
  table.add(0x9b, state, ParserAction.CLEAR, ParserState.CSI_ENTRY); // CSI
109
110
  table.add(0x90, state, ParserAction.CLEAR, ParserState.DCS_ENTRY); // DCS
110
111
  }
@@ -128,12 +129,18 @@ export const VT500_TRANSITION_TABLE = (function (): TransitionTable {
128
129
  table.add(0x7f, ParserState.OSC_STRING, ParserAction.OSC_PUT, ParserState.OSC_STRING);
129
130
  table.addMany([0x9c, 0x1b, 0x18, 0x1a, 0x07], ParserState.OSC_STRING, ParserAction.OSC_END, ParserState.GROUND);
130
131
  table.addMany(r(0x1c, 0x20), ParserState.OSC_STRING, ParserAction.IGNORE, ParserState.OSC_STRING);
131
- // sos/pm/apc does nothing
132
- table.addMany([0x58, 0x5e, 0x5f], ParserState.ESCAPE, ParserAction.IGNORE, ParserState.SOS_PM_APC_STRING);
133
- table.addMany(PRINTABLES, ParserState.SOS_PM_APC_STRING, ParserAction.IGNORE, ParserState.SOS_PM_APC_STRING);
134
- table.addMany(EXECUTABLES, ParserState.SOS_PM_APC_STRING, ParserAction.IGNORE, ParserState.SOS_PM_APC_STRING);
135
- table.add(0x9c, ParserState.SOS_PM_APC_STRING, ParserAction.IGNORE, ParserState.GROUND);
136
- table.add(0x7f, ParserState.SOS_PM_APC_STRING, ParserAction.IGNORE, ParserState.SOS_PM_APC_STRING);
132
+ // sos/pm
133
+ table.addMany([0x58, 0x5e], ParserState.ESCAPE, ParserAction.IGNORE, ParserState.SOS_PM_STRING);
134
+ table.addMany(PRINTABLES, ParserState.SOS_PM_STRING, ParserAction.IGNORE, ParserState.SOS_PM_STRING);
135
+ table.addMany(EXECUTABLES, ParserState.SOS_PM_STRING, ParserAction.IGNORE, ParserState.SOS_PM_STRING);
136
+ table.add(0x9c, ParserState.SOS_PM_STRING, ParserAction.IGNORE, ParserState.GROUND);
137
+ table.add(0x7f, ParserState.SOS_PM_STRING, ParserAction.IGNORE, ParserState.SOS_PM_STRING);
138
+ // apc
139
+ table.add(0x5f, ParserState.ESCAPE, ParserAction.APC_START, ParserState.APC_STRING);
140
+ table.addMany(PRINTABLES, ParserState.APC_STRING, ParserAction.APC_PUT, ParserState.APC_STRING);
141
+ table.addMany(EXECUTABLES, ParserState.APC_STRING, ParserAction.IGNORE, ParserState.APC_STRING);
142
+ table.add(0x7f, ParserState.APC_STRING, ParserAction.IGNORE, ParserState.APC_STRING);
143
+ table.addMany([0x1b, 0x9c, 0x18, 0x1a], ParserState.APC_STRING, ParserAction.APC_END, ParserState.GROUND);
137
144
  // csi entries
138
145
  table.add(0x5b, ParserState.ESCAPE, ParserAction.CLEAR, ParserState.CSI_ENTRY);
139
146
  table.addMany(r(0x40, 0x7f), ParserState.CSI_ENTRY, ParserAction.CSI_DISPATCH, ParserState.GROUND);
@@ -193,6 +200,7 @@ export const VT500_TRANSITION_TABLE = (function (): TransitionTable {
193
200
  table.add(NON_ASCII_PRINTABLE, ParserState.CSI_IGNORE, ParserAction.IGNORE, ParserState.CSI_IGNORE);
194
201
  table.add(NON_ASCII_PRINTABLE, ParserState.DCS_IGNORE, ParserAction.IGNORE, ParserState.DCS_IGNORE);
195
202
  table.add(NON_ASCII_PRINTABLE, ParserState.DCS_PASSTHROUGH, ParserAction.DCS_PUT, ParserState.DCS_PASSTHROUGH);
203
+ table.add(NON_ASCII_PRINTABLE, ParserState.APC_STRING, ParserAction.APC_PUT, ParserState.APC_STRING);
196
204
  return table;
197
205
  })();
198
206
 
@@ -239,10 +247,13 @@ export class EscapeSequenceParser extends Disposable implements IEscapeSequenceP
239
247
  // handler lookup containers
240
248
  protected _printHandler: PrintHandlerType;
241
249
  protected _executeHandlers: { [flag: number]: ExecuteHandlerType };
250
+ // fast path for EXE bytes < 0x18
251
+ protected _executeHandlersArr: (ExecuteHandlerType | undefined)[];
242
252
  protected _csiHandlers: IHandlerCollection<CsiHandlerType>;
243
253
  protected _escHandlers: IHandlerCollection<EscHandlerType>;
244
254
  protected readonly _oscParser: IOscParser;
245
255
  protected readonly _dcsParser: IDcsParser;
256
+ protected readonly _apcParser: IApcParser;
246
257
  protected _errorHandler: (state: IParsingState) => IParsingState;
247
258
 
248
259
  // fallback handlers
@@ -281,15 +292,18 @@ export class EscapeSequenceParser extends Disposable implements IEscapeSequenceP
281
292
  this._errorHandlerFb = (state: IParsingState): IParsingState => state;
282
293
  this._printHandler = this._printHandlerFb;
283
294
  this._executeHandlers = Object.create(null);
295
+ this._executeHandlersArr = new Array(0x18).fill(undefined);
284
296
  this._csiHandlers = Object.create(null);
285
297
  this._escHandlers = Object.create(null);
286
298
  this._register(toDisposable(() => {
287
299
  this._csiHandlers = Object.create(null);
288
300
  this._executeHandlers = Object.create(null);
301
+ this._executeHandlersArr = new Array(0x18).fill(undefined);
289
302
  this._escHandlers = Object.create(null);
290
303
  }));
291
304
  this._oscParser = this._register(new OscParser());
292
305
  this._dcsParser = this._register(new DcsParser());
306
+ this._apcParser = this._register(new ApcParser());
293
307
  this._errorHandler = this._errorHandlerFb;
294
308
 
295
309
  // swallow 7bit ST (ESC+\)
@@ -351,9 +365,7 @@ export class EscapeSequenceParser extends Disposable implements IEscapeSequenceP
351
365
 
352
366
  public registerEscHandler(id: IFunctionIdentifier, handler: EscHandlerType): IDisposable {
353
367
  const ident = this._identifier(id, [0x30, 0x7e]);
354
- if (this._escHandlers[ident] === undefined) {
355
- this._escHandlers[ident] = [];
356
- }
368
+ this._escHandlers[ident] ??= [];
357
369
  const handlerList = this._escHandlers[ident];
358
370
  handlerList.push(handler);
359
371
  return {
@@ -373,10 +385,14 @@ export class EscapeSequenceParser extends Disposable implements IEscapeSequenceP
373
385
  }
374
386
 
375
387
  public setExecuteHandler(flag: string, handler: ExecuteHandlerType): void {
376
- this._executeHandlers[flag.charCodeAt(0)] = handler;
388
+ const code = flag.charCodeAt(0);
389
+ this._executeHandlers[code] = handler;
390
+ if (code < 0x18) this._executeHandlersArr[code] = handler;
377
391
  }
378
392
  public clearExecuteHandler(flag: string): void {
379
- if (this._executeHandlers[flag.charCodeAt(0)]) delete this._executeHandlers[flag.charCodeAt(0)];
393
+ const code = flag.charCodeAt(0);
394
+ if (this._executeHandlers[code]) delete this._executeHandlers[code];
395
+ if (code < 0x18) this._executeHandlersArr[code] = undefined;
380
396
  }
381
397
  public setExecuteHandlerFallback(handler: ExecuteFallbackHandlerType): void {
382
398
  this._executeHandlerFb = handler;
@@ -384,9 +400,7 @@ export class EscapeSequenceParser extends Disposable implements IEscapeSequenceP
384
400
 
385
401
  public registerCsiHandler(id: IFunctionIdentifier, handler: CsiHandlerType): IDisposable {
386
402
  const ident = this._identifier(id);
387
- if (this._csiHandlers[ident] === undefined) {
388
- this._csiHandlers[ident] = [];
389
- }
403
+ this._csiHandlers[ident] ??= [];
390
404
  const handlerList = this._csiHandlers[ident];
391
405
  handlerList.push(handler);
392
406
  return {
@@ -425,6 +439,16 @@ export class EscapeSequenceParser extends Disposable implements IEscapeSequenceP
425
439
  this._oscParser.setHandlerFallback(handler);
426
440
  }
427
441
 
442
+ public registerApcHandler(ident: number, handler: IApcHandler): IDisposable {
443
+ return this._apcParser.registerHandler(ident, handler);
444
+ }
445
+ public clearApcHandler(ident: number): void {
446
+ this._apcParser.clearHandler(ident);
447
+ }
448
+ public setApcHandlerFallback(handler: ApcFallbackHandlerType): void {
449
+ this._apcParser.setHandlerFallback(handler);
450
+ }
451
+
428
452
  public setErrorHandler(callback: (state: IParsingState) => IParsingState): void {
429
453
  this._errorHandler = callback;
430
454
  }
@@ -445,8 +469,8 @@ export class EscapeSequenceParser extends Disposable implements IEscapeSequenceP
445
469
  this.currentState = this.initialState;
446
470
  this._oscParser.reset();
447
471
  this._dcsParser.reset();
448
- this._params.reset();
449
- this._params.addParam(0); // ZDM
472
+ this._apcParser.reset();
473
+ this._params.resetZdm();
450
474
  this._collect = 0;
451
475
  this.precedingJoinState = 0;
452
476
  // abort pending continuation from async handler
@@ -489,6 +513,10 @@ export class EscapeSequenceParser extends Disposable implements IEscapeSequenceP
489
513
  * - OSC_STRING:OSC_PUT
490
514
  * - DCS_PASSTHROUGH:DCS_PUT
491
515
  *
516
+ * Additionally the following fast paths exist before the table lookup:
517
+ * - EXE bytes < 0x18 in non-payload states (avoids table lookup entirely)
518
+ * - 7-bit CSI sequences without intermediates (ESC [ params final)
519
+ *
492
520
  * Note on asynchronous handler support:
493
521
  * Any handler returning a promise will be treated as asynchronous.
494
522
  * To keep the in-band blocking working for async handlers, `parse` pauses execution,
@@ -591,8 +619,7 @@ export class EscapeSequenceParser extends Disposable implements IEscapeSequenceP
591
619
  return handlerResult;
592
620
  }
593
621
  if (code === 0x1b) this._parseStack.transition |= ParserState.ESCAPE;
594
- this._params.reset();
595
- this._params.addParam(0); // ZDM
622
+ this._params.resetZdm();
596
623
  this._collect = 0;
597
624
  break;
598
625
  case ParserStackType.OSC:
@@ -602,8 +629,17 @@ export class EscapeSequenceParser extends Disposable implements IEscapeSequenceP
602
629
  return handlerResult;
603
630
  }
604
631
  if (code === 0x1b) this._parseStack.transition |= ParserState.ESCAPE;
605
- this._params.reset();
606
- this._params.addParam(0); // ZDM
632
+ this._params.resetZdm();
633
+ this._collect = 0;
634
+ break;
635
+ case ParserStackType.APC:
636
+ code = data[this._parseStack.chunkPos];
637
+ handlerResult = this._apcParser.end(code !== 0x18 && code !== 0x1a, promiseResult);
638
+ if (handlerResult) {
639
+ return handlerResult;
640
+ }
641
+ if (code === 0x1b) this._parseStack.transition |= ParserState.ESCAPE;
642
+ this._params.resetZdm();
607
643
  this._collect = 0;
608
644
  break;
609
645
  }
@@ -621,34 +657,87 @@ export class EscapeSequenceParser extends Disposable implements IEscapeSequenceP
621
657
  for (let i = start; i < length; ++i) {
622
658
  code = data[i];
623
659
 
660
+ // EXE fast-path: common control bytes (0x00-0x17) in non-payload states
661
+ if (code < 0x18 && this.currentState <= ParserState.CSI_IGNORE) {
662
+ (this._executeHandlersArr[code] ?? this._executeHandlerFb)(code);
663
+ this.precedingJoinState = 0;
664
+ continue;
665
+ }
666
+
667
+ // CSI fast-path: collapse ESC [ into a single entry, parse params+final in a tight loop
668
+ if (code === 0x1b
669
+ && this.currentState < ParserState.OSC_STRING
670
+ && i + 2 < length && data[i + 1] === 0x5b
671
+ ) {
672
+ this._params.resetZdm();
673
+ this._collect = 0;
674
+ let k = i + 2;
675
+ let ch = data[k];
676
+ if (ch >= 0x3c && ch <= 0x3f) {
677
+ this._collect = ch;
678
+ k++;
679
+ }
680
+ let csiDone = false;
681
+ for (; k < length; k++) {
682
+ ch = data[k];
683
+ if (ch >= 0x30 && ch <= 0x39) {
684
+ this._params.addDigit(ch - 48);
685
+ } else if (ch === 0x3b) {
686
+ this._params.addParam(0);
687
+ } else if (ch === 0x3a) {
688
+ this._params.addSubParam(-1);
689
+ } else if (ch >= 0x40 && ch <= 0x7e) {
690
+ const handlers = this._csiHandlers[this._collect << 8 | ch];
691
+ let j = handlers ? handlers.length - 1 : -1;
692
+ for (; j >= 0; j--) {
693
+ handlerResult = handlers[j](this._params);
694
+ if (handlerResult === true) {
695
+ break;
696
+ } else if (handlerResult instanceof Promise) {
697
+ transition = ParserAction.CSI_DISPATCH << TableAccess.TRANSITION_ACTION_SHIFT | ParserState.GROUND;
698
+ this._preserveStack(ParserStackType.CSI, handlers, j, transition, k);
699
+ return handlerResult;
700
+ }
701
+ }
702
+ if (j < 0) {
703
+ this._csiHandlerFb(this._collect << 8 | ch, this._params);
704
+ }
705
+ this.precedingJoinState = 0;
706
+ i = k;
707
+ this.currentState = ParserState.GROUND;
708
+ csiDone = true;
709
+ break;
710
+ } else {
711
+ break;
712
+ }
713
+ }
714
+ if (!csiDone) {
715
+ i = k - 1;
716
+ this.currentState = ParserState.CSI_PARAM;
717
+ }
718
+ continue;
719
+ }
720
+
624
721
  // normal transition & action lookup
625
722
  transition = this._transitions.table[this.currentState << TableAccess.INDEX_STATE_SHIFT | (code < 0xa0 ? code : NON_ASCII_PRINTABLE)];
626
723
  switch (transition >> TableAccess.TRANSITION_ACTION_SHIFT) {
627
724
  case ParserAction.PRINT:
628
- // read ahead with loop unrolling
629
725
  // Note: 0x20 (SP) is included, 0x7F (DEL) is excluded
630
- for (let j = i + 1; ; ++j) {
631
- if (j >= length || (code = data[j]) < 0x20 || (code > 0x7e && code < NON_ASCII_PRINTABLE)) {
632
- this._printHandler(data, i, j);
633
- i = j - 1;
634
- break;
635
- }
636
- if (++j >= length || (code = data[j]) < 0x20 || (code > 0x7e && code < NON_ASCII_PRINTABLE)) {
637
- this._printHandler(data, i, j);
638
- i = j - 1;
639
- break;
640
- }
641
- if (++j >= length || (code = data[j]) < 0x20 || (code > 0x7e && code < NON_ASCII_PRINTABLE)) {
642
- this._printHandler(data, i, j);
643
- i = j - 1;
644
- break;
645
- }
646
- if (++j >= length || (code = data[j]) < 0x20 || (code > 0x7e && code < NON_ASCII_PRINTABLE)) {
647
- this._printHandler(data, i, j);
648
- i = j - 1;
649
- break;
726
+ let c = i;
727
+ const l4 = length - 4;
728
+ while (c < l4
729
+ && data[++c] >= 0x20 && (data[c] <= 0x7e || data[c] >= NON_ASCII_PRINTABLE)
730
+ && data[++c] >= 0x20 && (data[c] <= 0x7e || data[c] >= NON_ASCII_PRINTABLE)
731
+ && data[++c] >= 0x20 && (data[c] <= 0x7e || data[c] >= NON_ASCII_PRINTABLE)
732
+ && data[++c] >= 0x20 && (data[c] <= 0x7e || data[c] >= NON_ASCII_PRINTABLE)
733
+ ) {}
734
+ if (c >= l4) {
735
+ while (c < length && data[c] >= 0x20 && (data[c] <= 0x7e || data[c] >= NON_ASCII_PRINTABLE)) {
736
+ c++;
650
737
  }
651
738
  }
739
+ this._printHandler(data, i, c);
740
+ i = c - 1;
652
741
  break;
653
742
  case ParserAction.EXECUTE:
654
743
  if (this._executeHandlers[code]) this._executeHandlers[code]();
@@ -730,8 +819,7 @@ export class EscapeSequenceParser extends Disposable implements IEscapeSequenceP
730
819
  this.precedingJoinState = 0;
731
820
  break;
732
821
  case ParserAction.CLEAR:
733
- this._params.reset();
734
- this._params.addParam(0); // ZDM
822
+ this._params.resetZdm();
735
823
  this._collect = 0;
736
824
  break;
737
825
  case ParserAction.DCS_HOOK:
@@ -755,8 +843,7 @@ export class EscapeSequenceParser extends Disposable implements IEscapeSequenceP
755
843
  return handlerResult;
756
844
  }
757
845
  if (code === 0x1b) transition |= ParserState.ESCAPE;
758
- this._params.reset();
759
- this._params.addParam(0); // ZDM
846
+ this._params.resetZdm();
760
847
  this._collect = 0;
761
848
  this.precedingJoinState = 0;
762
849
  break;
@@ -780,8 +867,31 @@ export class EscapeSequenceParser extends Disposable implements IEscapeSequenceP
780
867
  return handlerResult;
781
868
  }
782
869
  if (code === 0x1b) transition |= ParserState.ESCAPE;
783
- this._params.reset();
784
- this._params.addParam(0); // ZDM
870
+ this._params.resetZdm();
871
+ this._collect = 0;
872
+ this.precedingJoinState = 0;
873
+ break;
874
+ case ParserAction.APC_START:
875
+ this._apcParser.start();
876
+ break;
877
+ case ParserAction.APC_PUT:
878
+ // inner loop - exit APC_PUT: 0x18, 0x1a, 0x1b, 0x9c
879
+ for (let j = i + 1; ; ++j) {
880
+ if (j >= length || (code = data[j]) === 0x18 || code === 0x1a || code === 0x1b || code === 0x9c || (code > 0x7f && code < NON_ASCII_PRINTABLE)) {
881
+ this._apcParser.put(data, i, j);
882
+ i = j - 1;
883
+ break;
884
+ }
885
+ }
886
+ break;
887
+ case ParserAction.APC_END:
888
+ handlerResult = this._apcParser.end(code !== 0x18 && code !== 0x1a);
889
+ if (handlerResult) {
890
+ this._preserveStack(ParserStackType.APC, [], 0, transition, i);
891
+ return handlerResult;
892
+ }
893
+ if (code === 0x1b) transition |= ParserState.ESCAPE;
894
+ this._params.resetZdm();
785
895
  this._collect = 0;
786
896
  this.precedingJoinState = 0;
787
897
  break;
@@ -4,7 +4,7 @@
4
4
  */
5
5
 
6
6
  import { IOscHandler, IHandlerCollection, OscFallbackHandlerType, IOscParser, ISubParserStackState } from 'common/parser/Types';
7
- import { OscState, PAYLOAD_LIMIT } from 'common/parser/Constants';
7
+ import { OscState, ParserConstants } from 'common/parser/Constants';
8
8
  import { utf32ToString } from 'common/input/TextDecoder';
9
9
  import { IDisposable } from 'common/Types';
10
10
 
@@ -23,9 +23,7 @@ export class OscParser implements IOscParser {
23
23
  };
24
24
 
25
25
  public registerHandler(ident: number, handler: IOscHandler): IDisposable {
26
- if (this._handlers[ident] === undefined) {
27
- this._handlers[ident] = [];
28
- }
26
+ this._handlers[ident] ??= [];
29
27
  const handlerList = this._handlers[ident];
30
28
  handlerList.push(handler);
31
29
  return {
@@ -194,6 +192,8 @@ export class OscParser implements IOscParser {
194
192
  * as OSC handlers.
195
193
  */
196
194
  export class OscHandler implements IOscHandler {
195
+ private static _payloadLimit = ParserConstants.PAYLOAD_LIMIT;
196
+
197
197
  private _data = '';
198
198
  private _hitLimit: boolean = false;
199
199
 
@@ -209,7 +209,7 @@ export class OscHandler implements IOscHandler {
209
209
  return;
210
210
  }
211
211
  this._data += utf32ToString(data, start, end);
212
- if (this._data.length > PAYLOAD_LIMIT) {
212
+ if (this._data.length > OscHandler._payloadLimit) {
213
213
  this._data = '';
214
214
  this._hitLimit = true;
215
215
  }
@@ -129,6 +129,19 @@ export class Params implements IParams {
129
129
  this._digitIsSub = false;
130
130
  }
131
131
 
132
+ /**
133
+ * Reset and add 0 as first param (ZDM).
134
+ */
135
+ public resetZdm(): void {
136
+ this.length = 1;
137
+ this._subParamsLength = 0;
138
+ this._rejectDigits = false;
139
+ this._rejectSubDigits = false;
140
+ this._digitIsSub = false;
141
+ this._subParamsIdx[0] = 0;
142
+ this.params[0] = 0;
143
+ }
144
+
132
145
  /**
133
146
  * Add a parameter value.
134
147
  * `Params` only stores up to `maxLength` parameters, any later
@@ -32,6 +32,7 @@ export interface IParams {
32
32
  clone(): IParams;
33
33
  toArray(): ParamsArray;
34
34
  reset(): void;
35
+ resetZdm(): void;
35
36
  addParam(value: number): void;
36
37
  addSubParam(value: number): void;
37
38
  hasSubParams(idx: number): boolean;
@@ -107,7 +108,7 @@ export type EscFallbackHandlerType = (identifier: number) => void;
107
108
  /**
108
109
  * EXECUTE handler types.
109
110
  */
110
- export type ExecuteHandlerType = () => boolean;
111
+ export type ExecuteHandlerType = (ident?: number) => boolean;
111
112
  export type ExecuteFallbackHandlerType = (ident: number) => void;
112
113
 
113
114
  /**
@@ -134,6 +135,29 @@ export interface IOscHandler {
134
135
  }
135
136
  export type OscFallbackHandlerType = (ident: number, action: 'START' | 'PUT' | 'END', payload?: any) => void;
136
137
 
138
+ /**
139
+ * APC handler types.
140
+ */
141
+ export interface IApcHandler {
142
+ /**
143
+ * Announces start of this APC command.
144
+ * Prepare needed data structures here.
145
+ */
146
+ start(): void;
147
+ /**
148
+ * Incoming data chunk.
149
+ */
150
+ put(data: Uint32Array, start: number, end: number): void;
151
+ /**
152
+ * End of APC command. `success` indicates whether the
153
+ * command finished normally or got aborted, thus final
154
+ * execution of the command should depend on `success`.
155
+ * To save memory also cleanup data structures here.
156
+ */
157
+ end(success: boolean): boolean | Promise<boolean>;
158
+ }
159
+ export type ApcFallbackHandlerType = (ident: number, action: 'START' | 'PUT' | 'END', payload?: any) => void;
160
+
137
161
  /**
138
162
  * PRINT handler types.
139
163
  */
@@ -196,6 +220,10 @@ export interface IEscapeSequenceParser extends IDisposable {
196
220
  clearOscHandler(ident: number): void;
197
221
  setOscHandlerFallback(handler: OscFallbackHandlerType): void;
198
222
 
223
+ registerApcHandler(ident: number, handler: IApcHandler): IDisposable;
224
+ clearApcHandler(ident: number): void;
225
+ setApcHandlerFallback(handler: ApcFallbackHandlerType): void;
226
+
199
227
  setErrorHandler(handler: (state: IParsingState) => IParsingState): void;
200
228
  clearErrorHandler(): void;
201
229
  }
@@ -223,6 +251,11 @@ export interface IDcsParser extends ISubParser<IDcsHandler, DcsFallbackHandlerTy
223
251
  unhook(success: boolean, promiseResult?: boolean): void | Promise<boolean>;
224
252
  }
225
253
 
254
+ export interface IApcParser extends ISubParser<IApcHandler, ApcFallbackHandlerType> {
255
+ start(): void;
256
+ end(success: boolean, promiseResult?: boolean): void | Promise<boolean>;
257
+ }
258
+
226
259
  /**
227
260
  * Interface to denote a specific ESC, CSI or DCS handler slot.
228
261
  * The values are used to create an integer respresentation during handler
@@ -252,7 +285,8 @@ export const enum ParserStackType {
252
285
  CSI,
253
286
  ESC,
254
287
  OSC,
255
- DCS
288
+ DCS,
289
+ APC
256
290
  }
257
291
 
258
292
  // aggregate of resumable handler lists
@@ -18,10 +18,10 @@ export class BufferLineApiView implements IBufferLineApi {
18
18
  }
19
19
 
20
20
  if (cell) {
21
- this._line.loadCell(x, cell as ICellData);
21
+ this._line.loadCell(x, cell as unknown as ICellData);
22
22
  return cell;
23
23
  }
24
- return this._line.loadCell(x, new CellData());
24
+ return this._line.loadCell(x, new CellData()) as unknown as IBufferCellApi;
25
25
  }
26
26
  public translateToString(trimRight?: boolean, startColumn?: number, endColumn?: number): string {
27
27
  return this._line.translateToString(trimRight, startColumn, endColumn);
@@ -6,8 +6,8 @@
6
6
  import { IBuffer as IBufferApi, IBufferNamespace as IBufferNamespaceApi } from '@xterm/xterm';
7
7
  import { BufferApiView } from 'common/public/BufferApiView';
8
8
  import { ICoreTerminal } from 'common/Types';
9
- import { Disposable } from 'vs/base/common/lifecycle';
10
- import { Emitter } from 'vs/base/common/event';
9
+ import { Disposable } from 'common/Lifecycle';
10
+ import { Emitter } from 'common/Event';
11
11
 
12
12
  export class BufferNamespaceApi extends Disposable implements IBufferNamespaceApi {
13
13
  private _normal: BufferApiView;
@@ -34,4 +34,7 @@ export class ParserApi implements IParser {
34
34
  public addOscHandler(ident: number, callback: (data: string) => boolean | Promise<boolean>): IDisposable {
35
35
  return this.registerOscHandler(ident, callback);
36
36
  }
37
+ public registerApcHandler(ident: number, callback: (data: string) => boolean | Promise<boolean>): IDisposable {
38
+ return this._core.registerApcHandler(ident, callback);
39
+ }
37
40
  }
@@ -3,12 +3,12 @@
3
3
  * @license MIT
4
4
  */
5
5
 
6
- import { Disposable } from 'vs/base/common/lifecycle';
6
+ import { Disposable } from 'common/Lifecycle';
7
7
  import { IAttributeData, IBufferLine } from 'common/Types';
8
8
  import { BufferSet } from 'common/buffer/BufferSet';
9
9
  import { IBuffer, IBufferSet } from 'common/buffer/Types';
10
- import { IBufferService, IOptionsService, type IBufferResizeEvent } from 'common/services/Services';
11
- import { Emitter } from 'vs/base/common/event';
10
+ import { IBufferService, ILogService, IOptionsService, type IBufferResizeEvent } from 'common/services/Services';
11
+ import { Emitter } from 'common/Event';
12
12
 
13
13
  export const MINIMUM_COLS = 2; // Less than 2 can mess with wide chars
14
14
  export const MINIMUM_ROWS = 1;
@@ -32,11 +32,14 @@ export class BufferService extends Disposable implements IBufferService {
32
32
  /** An IBufferline to clone/copy from for new blank lines */
33
33
  private _cachedBlankLine: IBufferLine | undefined;
34
34
 
35
- constructor(@IOptionsService optionsService: IOptionsService) {
35
+ constructor(
36
+ @IOptionsService optionsService: IOptionsService,
37
+ @ILogService logService: ILogService
38
+ ) {
36
39
  super();
37
40
  this.cols = Math.max(optionsService.rawOptions.cols || 0, MINIMUM_COLS);
38
41
  this.rows = Math.max(optionsService.rawOptions.rows || 0, MINIMUM_ROWS);
39
- this.buffers = this._register(new BufferSet(optionsService, this));
42
+ this.buffers = this._register(new BufferSet(optionsService, this, logService));
40
43
  this._register(this.buffers.onBufferActivate(e => {
41
44
  this._onScroll.fire(e.activeBuffer.ydisp);
42
45
  }));
@@ -14,6 +14,10 @@ export class CharsetService implements ICharsetService {
14
14
 
15
15
  private _charsets: (ICharset | undefined)[] = [];
16
16
 
17
+ public get charsets(): (ICharset | undefined)[] {
18
+ return this._charsets;
19
+ }
20
+
17
21
  public reset(): void {
18
22
  this.charset = undefined;
19
23
  this._charsets = [];