@xterm/xterm 5.6.0-beta.14 → 5.6.0-beta.140

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 (131) hide show
  1. package/README.md +9 -3
  2. package/css/xterm.css +71 -4
  3. package/lib/xterm.js +1 -1
  4. package/lib/xterm.js.map +1 -1
  5. package/lib/xterm.mjs +53 -0
  6. package/lib/xterm.mjs.map +7 -0
  7. package/package.json +45 -33
  8. package/src/browser/AccessibilityManager.ts +54 -26
  9. package/src/browser/{Terminal.ts → CoreBrowserTerminal.ts} +159 -145
  10. package/src/browser/Linkifier.ts +26 -14
  11. package/src/browser/LocalizableStrings.ts +15 -4
  12. package/src/browser/TimeBasedDebouncer.ts +2 -2
  13. package/src/browser/{Types.d.ts → Types.ts} +67 -15
  14. package/src/browser/Viewport.ts +148 -370
  15. package/src/browser/decorations/BufferDecorationRenderer.ts +14 -9
  16. package/src/browser/decorations/OverviewRulerRenderer.ts +40 -44
  17. package/src/browser/input/CompositionHelper.ts +2 -1
  18. package/src/browser/input/MoveToCell.ts +3 -1
  19. package/src/browser/public/Terminal.ts +25 -19
  20. package/src/browser/renderer/dom/DomRenderer.ts +19 -14
  21. package/src/browser/renderer/dom/DomRendererRowFactory.ts +35 -15
  22. package/src/browser/renderer/shared/Constants.ts +0 -8
  23. package/src/browser/renderer/shared/Types.ts +84 -0
  24. package/src/browser/services/CharSizeService.ts +6 -6
  25. package/src/browser/services/CoreBrowserService.ts +16 -20
  26. package/src/browser/services/LinkProviderService.ts +2 -2
  27. package/src/browser/services/RenderService.ts +20 -20
  28. package/src/browser/services/SelectionService.ts +16 -8
  29. package/src/browser/services/Services.ts +13 -13
  30. package/src/browser/services/ThemeService.ts +19 -58
  31. package/src/browser/shared/Constants.ts +8 -0
  32. package/src/common/CircularList.ts +5 -5
  33. package/src/common/CoreTerminal.ts +35 -41
  34. package/src/common/InputHandler.ts +89 -59
  35. package/src/common/TaskQueue.ts +7 -7
  36. package/src/common/{Types.d.ts → Types.ts} +13 -17
  37. package/src/common/buffer/Buffer.ts +15 -7
  38. package/src/common/buffer/BufferReflow.ts +9 -6
  39. package/src/common/buffer/BufferSet.ts +5 -5
  40. package/src/common/buffer/Marker.ts +4 -4
  41. package/src/common/buffer/{Types.d.ts → Types.ts} +2 -2
  42. package/src/common/input/Keyboard.ts +0 -24
  43. package/src/common/input/WriteBuffer.ts +9 -8
  44. package/src/common/parser/EscapeSequenceParser.ts +4 -4
  45. package/src/common/public/BufferNamespaceApi.ts +3 -3
  46. package/src/common/services/BufferService.ts +14 -11
  47. package/src/common/services/CoreMouseService.ts +53 -6
  48. package/src/common/services/CoreService.ts +12 -8
  49. package/src/common/services/DecorationService.ts +8 -9
  50. package/src/common/services/InstantiationService.ts +1 -1
  51. package/src/common/services/LogService.ts +2 -2
  52. package/src/common/services/OptionsService.ts +8 -6
  53. package/src/common/services/ServiceRegistry.ts +1 -1
  54. package/src/common/services/Services.ts +39 -17
  55. package/src/common/services/UnicodeService.ts +2 -2
  56. package/src/vs/base/browser/browser.ts +141 -0
  57. package/src/vs/base/browser/canIUse.ts +49 -0
  58. package/src/vs/base/browser/dom.ts +2369 -0
  59. package/src/vs/base/browser/fastDomNode.ts +316 -0
  60. package/src/vs/base/browser/globalPointerMoveMonitor.ts +112 -0
  61. package/src/vs/base/browser/iframe.ts +135 -0
  62. package/src/vs/base/browser/keyboardEvent.ts +213 -0
  63. package/src/vs/base/browser/mouseEvent.ts +229 -0
  64. package/src/vs/base/browser/touch.ts +372 -0
  65. package/src/vs/base/browser/ui/scrollbar/abstractScrollbar.ts +303 -0
  66. package/src/vs/base/browser/ui/scrollbar/horizontalScrollbar.ts +114 -0
  67. package/src/vs/base/browser/ui/scrollbar/scrollableElement.ts +720 -0
  68. package/src/vs/base/browser/ui/scrollbar/scrollableElementOptions.ts +165 -0
  69. package/src/vs/base/browser/ui/scrollbar/scrollbarArrow.ts +114 -0
  70. package/src/vs/base/browser/ui/scrollbar/scrollbarState.ts +243 -0
  71. package/src/vs/base/browser/ui/scrollbar/scrollbarVisibilityController.ts +118 -0
  72. package/src/vs/base/browser/ui/scrollbar/verticalScrollbar.ts +116 -0
  73. package/src/vs/base/browser/ui/widget.ts +57 -0
  74. package/src/vs/base/browser/window.ts +14 -0
  75. package/src/vs/base/common/arrays.ts +887 -0
  76. package/src/vs/base/common/arraysFind.ts +202 -0
  77. package/src/vs/base/common/assert.ts +71 -0
  78. package/src/vs/base/common/async.ts +1992 -0
  79. package/src/vs/base/common/cancellation.ts +148 -0
  80. package/src/vs/base/common/charCode.ts +450 -0
  81. package/src/vs/base/common/collections.ts +140 -0
  82. package/src/vs/base/common/decorators.ts +130 -0
  83. package/src/vs/base/common/equals.ts +146 -0
  84. package/src/vs/base/common/errors.ts +303 -0
  85. package/src/vs/base/common/event.ts +1778 -0
  86. package/src/vs/base/common/functional.ts +32 -0
  87. package/src/vs/base/common/hash.ts +316 -0
  88. package/src/vs/base/common/iterator.ts +159 -0
  89. package/src/vs/base/common/keyCodes.ts +526 -0
  90. package/src/vs/base/common/keybindings.ts +284 -0
  91. package/src/vs/base/common/lazy.ts +47 -0
  92. package/src/vs/base/common/lifecycle.ts +801 -0
  93. package/src/vs/base/common/linkedList.ts +142 -0
  94. package/src/vs/base/common/map.ts +202 -0
  95. package/src/vs/base/common/numbers.ts +98 -0
  96. package/src/vs/base/common/observable.ts +76 -0
  97. package/src/vs/base/common/observableInternal/api.ts +31 -0
  98. package/src/vs/base/common/observableInternal/autorun.ts +281 -0
  99. package/src/vs/base/common/observableInternal/base.ts +489 -0
  100. package/src/vs/base/common/observableInternal/debugName.ts +145 -0
  101. package/src/vs/base/common/observableInternal/derived.ts +428 -0
  102. package/src/vs/base/common/observableInternal/lazyObservableValue.ts +146 -0
  103. package/src/vs/base/common/observableInternal/logging.ts +328 -0
  104. package/src/vs/base/common/observableInternal/promise.ts +209 -0
  105. package/src/vs/base/common/observableInternal/utils.ts +610 -0
  106. package/src/vs/base/common/platform.ts +281 -0
  107. package/src/vs/base/common/scrollable.ts +522 -0
  108. package/src/vs/base/common/sequence.ts +34 -0
  109. package/src/vs/base/common/stopwatch.ts +43 -0
  110. package/src/vs/base/common/strings.ts +557 -0
  111. package/src/vs/base/common/symbols.ts +9 -0
  112. package/src/vs/base/common/uint.ts +59 -0
  113. package/src/vs/patches/nls.ts +90 -0
  114. package/src/vs/typings/base-common.d.ts +20 -0
  115. package/src/vs/typings/require.d.ts +42 -0
  116. package/src/vs/typings/vscode-globals-nls.d.ts +36 -0
  117. package/src/vs/typings/vscode-globals-product.d.ts +33 -0
  118. package/typings/xterm.d.ts +80 -14
  119. package/src/browser/Lifecycle.ts +0 -33
  120. package/src/browser/renderer/shared/CellColorResolver.ts +0 -236
  121. package/src/browser/renderer/shared/CharAtlasCache.ts +0 -96
  122. package/src/browser/renderer/shared/CharAtlasUtils.ts +0 -75
  123. package/src/browser/renderer/shared/CursorBlinkStateManager.ts +0 -146
  124. package/src/browser/renderer/shared/CustomGlyphs.ts +0 -687
  125. package/src/browser/renderer/shared/DevicePixelObserver.ts +0 -41
  126. package/src/browser/renderer/shared/TextureAtlas.ts +0 -1100
  127. package/src/browser/renderer/shared/Types.d.ts +0 -173
  128. package/src/common/EventEmitter.ts +0 -78
  129. package/src/common/Lifecycle.ts +0 -108
  130. /package/src/browser/selection/{Types.d.ts → Types.ts} +0 -0
  131. /package/src/common/parser/{Types.d.ts → Types.ts} +0 -0
@@ -21,15 +21,13 @@
21
21
  * http://linux.die.net/man/7/urxvt
22
22
  */
23
23
 
24
- import { Disposable, MutableDisposable, toDisposable } from 'common/Lifecycle';
25
24
  import { IInstantiationService, IOptionsService, IBufferService, ILogService, ICharsetService, ICoreService, ICoreMouseService, IUnicodeService, LogLevelEnum, ITerminalOptions, IOscLinkService } from 'common/services/Services';
26
25
  import { InstantiationService } from 'common/services/InstantiationService';
27
26
  import { LogService } from 'common/services/LogService';
28
27
  import { BufferService, MINIMUM_COLS, MINIMUM_ROWS } from 'common/services/BufferService';
29
28
  import { OptionsService } from 'common/services/OptionsService';
30
- import { IDisposable, IAttributeData, ICoreTerminal, IScrollEvent, ScrollSource } from 'common/Types';
29
+ import { IDisposable, IAttributeData, ICoreTerminal, IScrollEvent } from 'common/Types';
31
30
  import { CoreService } from 'common/services/CoreService';
32
- import { EventEmitter, IEvent, forwardEvent } from 'common/EventEmitter';
33
31
  import { CoreMouseService } from 'common/services/CoreMouseService';
34
32
  import { UnicodeService } from 'common/services/UnicodeService';
35
33
  import { CharsetService } from 'common/services/CharsetService';
@@ -39,6 +37,8 @@ import { IBufferSet } from 'common/buffer/Types';
39
37
  import { InputHandler } from 'common/InputHandler';
40
38
  import { WriteBuffer } from 'common/input/WriteBuffer';
41
39
  import { OscLinkService } from 'common/services/OscLinkService';
40
+ import { Emitter, Event } from 'vs/base/common/event';
41
+ import { Disposable, MutableDisposable, toDisposable } from 'vs/base/common/lifecycle';
42
42
 
43
43
  // Only trigger this warning a single time per session
44
44
  let hasWriteSyncWarnHappened = false;
@@ -57,28 +57,28 @@ export abstract class CoreTerminal extends Disposable implements ICoreTerminal {
57
57
 
58
58
  protected _inputHandler: InputHandler;
59
59
  private _writeBuffer: WriteBuffer;
60
- private _windowsWrappingHeuristics = this.register(new MutableDisposable());
60
+ private _windowsWrappingHeuristics = this._register(new MutableDisposable());
61
61
 
62
- private readonly _onBinary = this.register(new EventEmitter<string>());
62
+ private readonly _onBinary = this._register(new Emitter<string>());
63
63
  public readonly onBinary = this._onBinary.event;
64
- private readonly _onData = this.register(new EventEmitter<string>());
64
+ private readonly _onData = this._register(new Emitter<string>());
65
65
  public readonly onData = this._onData.event;
66
- protected _onLineFeed = this.register(new EventEmitter<void>());
66
+ protected _onLineFeed = this._register(new Emitter<void>());
67
67
  public readonly onLineFeed = this._onLineFeed.event;
68
- private readonly _onResize = this.register(new EventEmitter<{ cols: number, rows: number }>());
68
+ private readonly _onResize = this._register(new Emitter<{ cols: number, rows: number }>());
69
69
  public readonly onResize = this._onResize.event;
70
- protected readonly _onWriteParsed = this.register(new EventEmitter<void>());
70
+ protected readonly _onWriteParsed = this._register(new Emitter<void>());
71
71
  public readonly onWriteParsed = this._onWriteParsed.event;
72
72
 
73
73
  /**
74
74
  * Internally we track the source of the scroll but this is meaningless outside the library so
75
75
  * it's filtered out.
76
76
  */
77
- protected _onScrollApi?: EventEmitter<number, void>;
78
- protected _onScroll = this.register(new EventEmitter<IScrollEvent, void>());
79
- public get onScroll(): IEvent<number, void> {
77
+ protected _onScrollApi?: Emitter<number>;
78
+ protected _onScroll = this._register(new Emitter<IScrollEvent>());
79
+ public get onScroll(): Event<number> {
80
80
  if (!this._onScrollApi) {
81
- this._onScrollApi = this.register(new EventEmitter<number, void>());
81
+ this._onScrollApi = this._register(new Emitter<number>());
82
82
  this._onScroll.event(ev => {
83
83
  this._onScrollApi?.fire(ev.position);
84
84
  });
@@ -103,17 +103,17 @@ export abstract class CoreTerminal extends Disposable implements ICoreTerminal {
103
103
 
104
104
  // Setup and initialize services
105
105
  this._instantiationService = new InstantiationService();
106
- this.optionsService = this.register(new OptionsService(options));
106
+ this.optionsService = this._register(new OptionsService(options));
107
107
  this._instantiationService.setService(IOptionsService, this.optionsService);
108
- this._bufferService = this.register(this._instantiationService.createInstance(BufferService));
108
+ this._bufferService = this._register(this._instantiationService.createInstance(BufferService));
109
109
  this._instantiationService.setService(IBufferService, this._bufferService);
110
- this._logService = this.register(this._instantiationService.createInstance(LogService));
110
+ this._logService = this._register(this._instantiationService.createInstance(LogService));
111
111
  this._instantiationService.setService(ILogService, this._logService);
112
- this.coreService = this.register(this._instantiationService.createInstance(CoreService));
112
+ this.coreService = this._register(this._instantiationService.createInstance(CoreService));
113
113
  this._instantiationService.setService(ICoreService, this.coreService);
114
- this.coreMouseService = this.register(this._instantiationService.createInstance(CoreMouseService));
114
+ this.coreMouseService = this._register(this._instantiationService.createInstance(CoreMouseService));
115
115
  this._instantiationService.setService(ICoreMouseService, this.coreMouseService);
116
- this.unicodeService = this.register(this._instantiationService.createInstance(UnicodeService));
116
+ this.unicodeService = this._register(this._instantiationService.createInstance(UnicodeService));
117
117
  this._instantiationService.setService(IUnicodeService, this.unicodeService);
118
118
  this._charsetService = this._instantiationService.createInstance(CharsetService);
119
119
  this._instantiationService.setService(ICharsetService, this._charsetService);
@@ -122,29 +122,24 @@ export abstract class CoreTerminal extends Disposable implements ICoreTerminal {
122
122
 
123
123
 
124
124
  // Register input handler and handle/forward events
125
- this._inputHandler = this.register(new InputHandler(this._bufferService, this._charsetService, this.coreService, this._logService, this.optionsService, this._oscLinkService, this.coreMouseService, this.unicodeService));
126
- this.register(forwardEvent(this._inputHandler.onLineFeed, this._onLineFeed));
127
- this.register(this._inputHandler);
125
+ this._inputHandler = this._register(new InputHandler(this._bufferService, this._charsetService, this.coreService, this._logService, this.optionsService, this._oscLinkService, this.coreMouseService, this.unicodeService));
126
+ this._register(Event.forward(this._inputHandler.onLineFeed, this._onLineFeed));
127
+ this._register(this._inputHandler);
128
128
 
129
129
  // Setup listeners
130
- this.register(forwardEvent(this._bufferService.onResize, this._onResize));
131
- this.register(forwardEvent(this.coreService.onData, this._onData));
132
- this.register(forwardEvent(this.coreService.onBinary, this._onBinary));
133
- this.register(this.coreService.onRequestScrollToBottom(() => this.scrollToBottom()));
134
- this.register(this.coreService.onUserInput(() => this._writeBuffer.handleUserInput()));
135
- this.register(this.optionsService.onMultipleOptionChange(['windowsMode', 'windowsPty'], () => this._handleWindowsPtyOptionChange()));
136
- this.register(this._bufferService.onScroll(event => {
137
- this._onScroll.fire({ position: this._bufferService.buffer.ydisp, source: ScrollSource.TERMINAL });
130
+ this._register(Event.forward(this._bufferService.onResize, this._onResize));
131
+ this._register(Event.forward(this.coreService.onData, this._onData));
132
+ this._register(Event.forward(this.coreService.onBinary, this._onBinary));
133
+ this._register(this.coreService.onRequestScrollToBottom(() => this.scrollToBottom(true)));
134
+ this._register(this.coreService.onUserInput(() => this._writeBuffer.handleUserInput()));
135
+ this._register(this.optionsService.onMultipleOptionChange(['windowsMode', 'windowsPty'], () => this._handleWindowsPtyOptionChange()));
136
+ this._register(this._bufferService.onScroll(() => {
137
+ this._onScroll.fire({ position: this._bufferService.buffer.ydisp });
138
138
  this._inputHandler.markRangeDirty(this._bufferService.buffer.scrollTop, this._bufferService.buffer.scrollBottom);
139
139
  }));
140
- this.register(this._inputHandler.onScroll(event => {
141
- this._onScroll.fire({ position: this._bufferService.buffer.ydisp, source: ScrollSource.TERMINAL });
142
- this._inputHandler.markRangeDirty(this._bufferService.buffer.scrollTop, this._bufferService.buffer.scrollBottom);
143
- }));
144
-
145
140
  // Setup WriteBuffer
146
- this._writeBuffer = this.register(new WriteBuffer((data, promiseResult) => this._inputHandler.parse(data, promiseResult)));
147
- this.register(forwardEvent(this._writeBuffer.onWriteParsed, this._onWriteParsed));
141
+ this._writeBuffer = this._register(new WriteBuffer((data, promiseResult) => this._inputHandler.parse(data, promiseResult)));
142
+ this._register(Event.forward(this._writeBuffer.onWriteParsed, this._onWriteParsed));
148
143
  }
149
144
 
150
145
  public write(data: string | Uint8Array, callback?: () => void): void {
@@ -198,10 +193,9 @@ export abstract class CoreTerminal extends Disposable implements ICoreTerminal {
198
193
  * @param suppressScrollEvent Don't emit the scroll event as scrollLines. This is used to avoid
199
194
  * unwanted events being handled by the viewport when the event was triggered from the viewport
200
195
  * originally.
201
- * @param source Which component the event came from.
202
196
  */
203
- public scrollLines(disp: number, suppressScrollEvent?: boolean, source?: ScrollSource): void {
204
- this._bufferService.scrollLines(disp, suppressScrollEvent, source);
197
+ public scrollLines(disp: number, suppressScrollEvent?: boolean): void {
198
+ this._bufferService.scrollLines(disp, suppressScrollEvent);
205
199
  }
206
200
 
207
201
  public scrollPages(pageCount: number): void {
@@ -212,7 +206,7 @@ export abstract class CoreTerminal extends Disposable implements ICoreTerminal {
212
206
  this.scrollLines(-this._bufferService.buffer.ydisp);
213
207
  }
214
208
 
215
- public scrollToBottom(): void {
209
+ public scrollToBottom(disableSmoothScroll?: boolean): void {
216
210
  this.scrollLines(this._bufferService.buffer.ybase - this._bufferService.buffer.ydisp);
217
211
  }
218
212
 
@@ -8,10 +8,9 @@ import { IInputHandler, IAttributeData, IDisposable, IWindowOptions, IColorEvent
8
8
  import { C0, C1 } from 'common/data/EscapeSequences';
9
9
  import { CHARSETS, DEFAULT_CHARSET } from 'common/data/Charsets';
10
10
  import { EscapeSequenceParser } from 'common/parser/EscapeSequenceParser';
11
- import { Disposable } from 'common/Lifecycle';
11
+ import { Disposable } from 'vs/base/common/lifecycle';
12
12
  import { StringToUtf32, stringFromCodePoint, Utf8ToUtf32 } from 'common/input/TextDecoder';
13
13
  import { BufferLine, DEFAULT_ATTR_DATA } from 'common/buffer/BufferLine';
14
- import { EventEmitter } from 'common/EventEmitter';
15
14
  import { IParsingState, IEscapeSequenceParser, IParams, IFunctionIdentifier } from 'common/parser/Types';
16
15
  import { NULL_CELL_CODE, NULL_CELL_WIDTH, Attributes, FgFlags, BgFlags, Content, UnderlineStyle } from 'common/buffer/Constants';
17
16
  import { CellData } from 'common/buffer/CellData';
@@ -22,6 +21,7 @@ import { OscHandler } from 'common/parser/OscParser';
22
21
  import { DcsHandler } from 'common/parser/DcsParser';
23
22
  import { IBuffer } from 'common/buffer/Types';
24
23
  import { parseColor } from 'common/input/XParseColor';
24
+ import { Emitter } from 'vs/base/common/event';
25
25
 
26
26
  /**
27
27
  * Map collect to glevel. Used in `selectCharset`.
@@ -119,7 +119,6 @@ export class InputHandler extends Disposable implements IInputHandler {
119
119
  private _parseBuffer: Uint32Array = new Uint32Array(4096);
120
120
  private _stringDecoder: StringToUtf32 = new StringToUtf32();
121
121
  private _utf8Decoder: Utf8ToUtf32 = new Utf8ToUtf32();
122
- private _workCell: CellData = new CellData();
123
122
  private _windowTitle = '';
124
123
  private _iconName = '';
125
124
  private _dirtyRowTracker: IDirtyRowTracker;
@@ -132,32 +131,32 @@ export class InputHandler extends Disposable implements IInputHandler {
132
131
 
133
132
  private _activeBuffer: IBuffer;
134
133
 
135
- private readonly _onRequestBell = this.register(new EventEmitter<void>());
134
+ private readonly _onRequestBell = this._register(new Emitter<void>());
136
135
  public readonly onRequestBell = this._onRequestBell.event;
137
- private readonly _onRequestRefreshRows = this.register(new EventEmitter<number, number>());
136
+ private readonly _onRequestRefreshRows = this._register(new Emitter<{ start: number, end: number } | undefined>());
138
137
  public readonly onRequestRefreshRows = this._onRequestRefreshRows.event;
139
- private readonly _onRequestReset = this.register(new EventEmitter<void>());
138
+ private readonly _onRequestReset = this._register(new Emitter<void>());
140
139
  public readonly onRequestReset = this._onRequestReset.event;
141
- private readonly _onRequestSendFocus = this.register(new EventEmitter<void>());
140
+ private readonly _onRequestSendFocus = this._register(new Emitter<void>());
142
141
  public readonly onRequestSendFocus = this._onRequestSendFocus.event;
143
- private readonly _onRequestSyncScrollBar = this.register(new EventEmitter<void>());
142
+ private readonly _onRequestSyncScrollBar = this._register(new Emitter<void>());
144
143
  public readonly onRequestSyncScrollBar = this._onRequestSyncScrollBar.event;
145
- private readonly _onRequestWindowsOptionsReport = this.register(new EventEmitter<WindowsOptionsReportType>());
144
+ private readonly _onRequestWindowsOptionsReport = this._register(new Emitter<WindowsOptionsReportType>());
146
145
  public readonly onRequestWindowsOptionsReport = this._onRequestWindowsOptionsReport.event;
147
146
 
148
- private readonly _onA11yChar = this.register(new EventEmitter<string>());
147
+ private readonly _onA11yChar = this._register(new Emitter<string>());
149
148
  public readonly onA11yChar = this._onA11yChar.event;
150
- private readonly _onA11yTab = this.register(new EventEmitter<number>());
149
+ private readonly _onA11yTab = this._register(new Emitter<number>());
151
150
  public readonly onA11yTab = this._onA11yTab.event;
152
- private readonly _onCursorMove = this.register(new EventEmitter<void>());
151
+ private readonly _onCursorMove = this._register(new Emitter<void>());
153
152
  public readonly onCursorMove = this._onCursorMove.event;
154
- private readonly _onLineFeed = this.register(new EventEmitter<void>());
153
+ private readonly _onLineFeed = this._register(new Emitter<void>());
155
154
  public readonly onLineFeed = this._onLineFeed.event;
156
- private readonly _onScroll = this.register(new EventEmitter<number>());
155
+ private readonly _onScroll = this._register(new Emitter<number>());
157
156
  public readonly onScroll = this._onScroll.event;
158
- private readonly _onTitleChange = this.register(new EventEmitter<string>());
157
+ private readonly _onTitleChange = this._register(new Emitter<string>());
159
158
  public readonly onTitleChange = this._onTitleChange.event;
160
- private readonly _onColor = this.register(new EventEmitter<IColorEvent>());
159
+ private readonly _onColor = this._register(new Emitter<IColorEvent>());
161
160
  public readonly onColor = this._onColor.event;
162
161
 
163
162
  private _parseStack: IParseStack = {
@@ -180,12 +179,12 @@ export class InputHandler extends Disposable implements IInputHandler {
180
179
  private readonly _parser: IEscapeSequenceParser = new EscapeSequenceParser()
181
180
  ) {
182
181
  super();
183
- this.register(this._parser);
182
+ this._register(this._parser);
184
183
  this._dirtyRowTracker = new DirtyRowTracker(this._bufferService);
185
184
 
186
185
  // Track properties used in performance critical code manually to avoid using slow getters
187
186
  this._activeBuffer = this._bufferService.buffer;
188
- this.register(this._bufferService.buffers.onBufferActivate(e => this._activeBuffer = e.activeBuffer));
187
+ this._register(this._bufferService.buffers.onBufferActivate(e => this._activeBuffer = e.activeBuffer));
189
188
 
190
189
  /**
191
190
  * custom fallback handlers
@@ -446,7 +445,10 @@ export class InputHandler extends Disposable implements IInputHandler {
446
445
 
447
446
  // Log debug data, the log level gate is to prevent extra work in this hot path
448
447
  if (this._logService.logLevel <= LogLevelEnum.DEBUG) {
449
- this._logService.debug(`parsing data${typeof data === 'string' ? ` "${data}"` : ` "${Array.prototype.map.call(data, e => String.fromCharCode(e)).join('')}"`}`, typeof data === 'string'
448
+ this._logService.debug(`parsing data ${typeof data === 'string' ? ` "${data}"` : ` "${Array.prototype.map.call(data, e => String.fromCharCode(e)).join('')}"`}`);
449
+ }
450
+ if (this._logService.logLevel === LogLevelEnum.TRACE) {
451
+ this._logService.trace(`parsing data (codes)`, typeof data === 'string'
450
452
  ? data.split('').map(e => e.charCodeAt(0))
451
453
  : data
452
454
  );
@@ -500,7 +502,10 @@ export class InputHandler extends Disposable implements IInputHandler {
500
502
  const viewportEnd = this._dirtyRowTracker.end + (this._bufferService.buffer.ybase - this._bufferService.buffer.ydisp);
501
503
  const viewportStart = this._dirtyRowTracker.start + (this._bufferService.buffer.ybase - this._bufferService.buffer.ydisp);
502
504
  if (viewportStart < this._bufferService.rows) {
503
- this._onRequestRefreshRows.fire(Math.min(viewportStart, this._bufferService.rows - 1), Math.min(viewportEnd, this._bufferService.rows - 1));
505
+ this._onRequestRefreshRows.fire({
506
+ start: Math.min(viewportStart, this._bufferService.rows - 1),
507
+ end: Math.min(viewportEnd, this._bufferService.rows - 1)
508
+ });
504
509
  }
505
510
  }
506
511
 
@@ -604,7 +609,7 @@ export class InputHandler extends Disposable implements IInputHandler {
604
609
  // since an empty cell is only set by fullwidth chars
605
610
  bufferRow.addCodepointToCell(this._activeBuffer.x - offset,
606
611
  code, chWidth);
607
- for (let delta = chWidth - oldWidth; --delta >= 0; ) {
612
+ for (let delta = chWidth - oldWidth; --delta >= 0;) {
608
613
  bufferRow.setCellFromCodepoint(this._activeBuffer.x++, 0, 0, curAttr);
609
614
  }
610
615
  continue;
@@ -1218,12 +1223,27 @@ export class InputHandler extends Disposable implements IInputHandler {
1218
1223
  this._dirtyRowTracker.markDirty(0);
1219
1224
  break;
1220
1225
  case 2:
1221
- j = this._bufferService.rows;
1222
- this._dirtyRowTracker.markDirty(j - 1);
1223
- while (j--) {
1224
- this._resetBufferLine(j, respectProtect);
1226
+ if (this._optionsService.rawOptions.scrollOnEraseInDisplay) {
1227
+ j = this._bufferService.rows;
1228
+ this._dirtyRowTracker.markRangeDirty(0, j - 1);
1229
+ while (j--) {
1230
+ const currentLine = this._activeBuffer.lines.get(this._activeBuffer.ybase + j);
1231
+ if (currentLine?.getTrimmedLength()) {
1232
+ break;
1233
+ }
1234
+ }
1235
+ for (; j >= 0; j--) {
1236
+ this._bufferService.scroll(this._eraseAttrData());
1237
+ }
1238
+ }
1239
+ else {
1240
+ j = this._bufferService.rows;
1241
+ this._dirtyRowTracker.markDirty(j - 1);
1242
+ while (j--) {
1243
+ this._resetBufferLine(j, respectProtect);
1244
+ }
1245
+ this._dirtyRowTracker.markDirty(0);
1225
1246
  }
1226
- this._dirtyRowTracker.markDirty(0);
1227
1247
  break;
1228
1248
  case 3:
1229
1249
  // Clear scrollback (everything not in viewport)
@@ -1605,7 +1625,7 @@ export class InputHandler extends Disposable implements IInputHandler {
1605
1625
  const text = bufferRow.getString(x);
1606
1626
  const data = new Uint32Array(text.length * length);
1607
1627
  let idata = 0;
1608
- for (let itext = 0; itext < text.length; ) {
1628
+ for (let itext = 0; itext < text.length;) {
1609
1629
  const ch = text.codePointAt(itext) || 0;
1610
1630
  data[idata++] = ch;
1611
1631
  itext += ch > 0xffff ? 2 : 1;
@@ -1943,7 +1963,7 @@ export class InputHandler extends Disposable implements IInputHandler {
1943
1963
  case 1047: // alt screen buffer
1944
1964
  this._bufferService.buffers.activateAltBuffer(this._eraseAttrData());
1945
1965
  this._coreService.isCursorInitialized = true;
1946
- this._onRequestRefreshRows.fire(0, this._bufferService.rows - 1);
1966
+ this._onRequestRefreshRows.fire(undefined);
1947
1967
  this._onRequestSyncScrollBar.fire();
1948
1968
  break;
1949
1969
  case 2004: // bracketed paste mode (https://cirw.in/blog/bracketed-paste)
@@ -2171,7 +2191,7 @@ export class InputHandler extends Disposable implements IInputHandler {
2171
2191
  this.restoreCursor();
2172
2192
  }
2173
2193
  this._coreService.isCursorInitialized = true;
2174
- this._onRequestRefreshRows.fire(0, this._bufferService.rows - 1);
2194
+ this._onRequestRefreshRows.fire(undefined);
2175
2195
  this._onRequestSyncScrollBar.fire();
2176
2196
  break;
2177
2197
  case 2004: // bracketed paste mode (https://cirw.in/blog/bracketed-paste)
@@ -2712,7 +2732,7 @@ export class InputHandler extends Disposable implements IInputHandler {
2712
2732
 
2713
2733
  /**
2714
2734
  * CSI Ps SP q Set cursor style (DECSCUSR, VT520).
2715
- * Ps = 0 -> blinking block.
2735
+ * Ps = 0 -> reset to option.
2716
2736
  * Ps = 1 -> blinking block (default).
2717
2737
  * Ps = 2 -> steady block.
2718
2738
  * Ps = 3 -> blinking underline.
@@ -2722,31 +2742,37 @@ export class InputHandler extends Disposable implements IInputHandler {
2722
2742
  *
2723
2743
  * @vt: #Y CSI DECSCUSR "Set Cursor Style" "CSI Ps SP q" "Set cursor style."
2724
2744
  * Supported cursor styles:
2725
- * - empty, 0 or 1: steady block
2726
- * - 2: blink block
2727
- * - 3: steady underline
2728
- * - 4: blink underline
2729
- * - 5: steady bar
2730
- * - 6: blink bar
2745
+ * - 0: reset to option
2746
+ * - empty, 1: blinking block
2747
+ * - 2: steady block
2748
+ * - 3: blinking underline
2749
+ * - 4: steady underline
2750
+ * - 5: blinking bar
2751
+ * - 6: steady bar
2731
2752
  */
2732
2753
  public setCursorStyle(params: IParams): boolean {
2733
- const param = params.params[0] || 1;
2734
- switch (param) {
2735
- case 1:
2736
- case 2:
2737
- this._optionsService.options.cursorStyle = 'block';
2738
- break;
2739
- case 3:
2740
- case 4:
2741
- this._optionsService.options.cursorStyle = 'underline';
2742
- break;
2743
- case 5:
2744
- case 6:
2745
- this._optionsService.options.cursorStyle = 'bar';
2746
- break;
2754
+ const param = params.length === 0 ? 1 : params.params[0];
2755
+ if (param === 0) {
2756
+ this._coreService.decPrivateModes.cursorStyle = undefined;
2757
+ this._coreService.decPrivateModes.cursorBlink = undefined;
2758
+ } else {
2759
+ switch (param) {
2760
+ case 1:
2761
+ case 2:
2762
+ this._coreService.decPrivateModes.cursorStyle = 'block';
2763
+ break;
2764
+ case 3:
2765
+ case 4:
2766
+ this._coreService.decPrivateModes.cursorStyle = 'underline';
2767
+ break;
2768
+ case 5:
2769
+ case 6:
2770
+ this._coreService.decPrivateModes.cursorStyle = 'bar';
2771
+ break;
2772
+ }
2773
+ const isBlinking = param % 2 === 1;
2774
+ this._coreService.decPrivateModes.cursorBlink = isBlinking;
2747
2775
  }
2748
- const isBlinking = param % 2 === 1;
2749
- this._optionsService.options.cursorBlink = isBlinking;
2750
2776
  return true;
2751
2777
  }
2752
2778
 
@@ -2972,14 +2998,18 @@ export class InputHandler extends Disposable implements IInputHandler {
2972
2998
  * feedback. Use `OSC 8 ; ; BEL` to finish the current hyperlink.
2973
2999
  */
2974
3000
  public setHyperlink(data: string): boolean {
2975
- const args = data.split(';');
2976
- if (args.length < 2) {
2977
- return false;
3001
+ // Arg parsing is special cases to support unencoded semi-colons in the URIs (#4944)
3002
+ const idx = data.indexOf(';');
3003
+ if (idx === -1) {
3004
+ // malformed sequence, just return as handled
3005
+ return true;
2978
3006
  }
2979
- if (args[1]) {
2980
- return this._createHyperlink(args[0], args[1]);
3007
+ const id = data.slice(0, idx).trim();
3008
+ const uri = data.slice(idx + 1);
3009
+ if (uri) {
3010
+ return this._createHyperlink(id, uri);
2981
3011
  }
2982
- if (args[0].trim()) {
3012
+ if (id.trim()) {
2983
3013
  return false;
2984
3014
  }
2985
3015
  return this._finishHyperlink();
@@ -3452,6 +3482,6 @@ class DirtyRowTracker implements IDirtyRowTracker {
3452
3482
  }
3453
3483
  }
3454
3484
 
3455
- function isValidColorIndex(value: number): value is ColorIndex {
3485
+ export function isValidColorIndex(value: number): value is ColorIndex {
3456
3486
  return 0 <= value && value < 256;
3457
3487
  }
@@ -74,14 +74,14 @@ abstract class TaskQueue implements ITaskQueue {
74
74
  let lastDeadlineRemaining = deadline.timeRemaining();
75
75
  let deadlineRemaining = 0;
76
76
  while (this._i < this._tasks.length) {
77
- taskDuration = Date.now();
77
+ taskDuration = performance.now();
78
78
  if (!this._tasks[this._i]()) {
79
79
  this._i++;
80
80
  }
81
- // other than performance.now, Date.now might not be stable (changes on wall clock changes),
82
- // this is not an issue here as a clock change during a short running task is very unlikely
83
- // in case it still happened and leads to negative duration, simply assume 1 msec
84
- taskDuration = Math.max(1, Date.now() - taskDuration);
81
+ // other than performance.now, performance.now might not be stable (changes on wall clock
82
+ // changes), this is not an issue here as a clock change during a short running task is very
83
+ // unlikely in case it still happened and leads to negative duration, simply assume 1 msec
84
+ taskDuration = Math.max(1, performance.now() - taskDuration);
85
85
  longestTask = Math.max(taskDuration, longestTask);
86
86
  // Guess the following task will take a similar time to the longest task in this batch, allow
87
87
  // additional room to try avoid exceeding the deadline
@@ -116,9 +116,9 @@ export class PriorityTaskQueue extends TaskQueue {
116
116
  }
117
117
 
118
118
  private _createDeadline(duration: number): ITaskDeadline {
119
- const end = Date.now() + duration;
119
+ const end = performance.now() + duration;
120
120
  return {
121
- timeRemaining: () => Math.max(0, end - Date.now())
121
+ timeRemaining: () => Math.max(0, end - performance.now())
122
122
  };
123
123
  }
124
124
  }
@@ -4,12 +4,12 @@
4
4
  */
5
5
 
6
6
  import { IDeleteEvent, IInsertEvent } from 'common/CircularList';
7
- import { IEvent, IEventEmitter } from 'common/EventEmitter';
8
7
  import { Attributes, UnderlineStyle } from 'common/buffer/Constants'; // eslint-disable-line no-unused-vars
9
8
  import { IBufferSet } from 'common/buffer/Types';
10
9
  import { IParams } from 'common/parser/Types';
11
10
  import { ICoreMouseService, ICoreService, IOptionsService, IUnicodeService } from 'common/services/Services';
12
11
  import { IFunctionIdentifier, ITerminalOptions as IPublicTerminalOptions } from '@xterm/xterm';
12
+ import type { Emitter, Event } from 'vs/base/common/event';
13
13
 
14
14
  export interface ICoreTerminal {
15
15
  coreMouseService: ICoreMouseService;
@@ -60,12 +60,6 @@ export interface IKeyboardEvent {
60
60
 
61
61
  export interface IScrollEvent {
62
62
  position: number;
63
- source: ScrollSource;
64
- }
65
-
66
- export const enum ScrollSource {
67
- TERMINAL,
68
- VIEWPORT,
69
63
  }
70
64
 
71
65
  export interface ICircularList<T> {
@@ -73,12 +67,12 @@ export interface ICircularList<T> {
73
67
  maxLength: number;
74
68
  isFull: boolean;
75
69
 
76
- onDeleteEmitter: IEventEmitter<IDeleteEvent>;
77
- onDelete: IEvent<IDeleteEvent>;
78
- onInsertEmitter: IEventEmitter<IInsertEvent>;
79
- onInsert: IEvent<IInsertEvent>;
80
- onTrimEmitter: IEventEmitter<number>;
81
- onTrim: IEvent<number>;
70
+ onDeleteEmitter: Emitter<IDeleteEvent>;
71
+ onDelete: Event<IDeleteEvent>;
72
+ onInsertEmitter: Emitter<IInsertEvent>;
73
+ onInsert: Event<IInsertEvent>;
74
+ onTrimEmitter: Emitter<number>;
75
+ onTrim: Event<number>;
82
76
 
83
77
  get(index: number): T | undefined;
84
78
  set(index: number, value: T): void;
@@ -264,7 +258,7 @@ export interface IMarker extends IDisposable {
264
258
  readonly id: number;
265
259
  readonly isDisposed: boolean;
266
260
  readonly line: number;
267
- onDispose: IEvent<void>;
261
+ onDispose: Event<void>;
268
262
  }
269
263
  export interface IModes {
270
264
  insertMode: boolean;
@@ -274,6 +268,8 @@ export interface IDecPrivateModes {
274
268
  applicationCursorKeys: boolean;
275
269
  applicationKeypad: boolean;
276
270
  bracketedPasteMode: boolean;
271
+ cursorBlink: boolean | undefined;
272
+ cursorStyle: CursorStyle | undefined;
277
273
  origin: boolean;
278
274
  reverseWraparound: boolean;
279
275
  sendFocus: boolean;
@@ -425,8 +421,8 @@ type Enumerate<N extends number, Acc extends number[] = []> = Acc['length'] exte
425
421
  : Enumerate<N, [...Acc, Acc['length']]>;
426
422
  type IntRange<F extends number, T extends number> = Exclude<Enumerate<T>, Enumerate<F>>;
427
423
 
428
- type ColorIndex = IntRange<0, 256>; // number from 0 to 255
429
- type AllColorIndex = ColorIndex | SpecialColorIndex;
424
+ export type ColorIndex = IntRange<0, 256>; // number from 0 to 255
425
+ export type AllColorIndex = ColorIndex | SpecialColorIndex;
430
426
  export const enum SpecialColorIndex {
431
427
  FOREGROUND = 256,
432
428
  BACKGROUND = 257,
@@ -452,7 +448,7 @@ export type IColorEvent = (IColorReportRequest | IColorSetRequest | IColorRestor
452
448
  * Calls the parser and handles actions generated by the parser.
453
449
  */
454
450
  export interface IInputHandler {
455
- onTitleChange: IEvent<string>;
451
+ onTitleChange: Event<string>;
456
452
 
457
453
  parse(data: string | Uint8Array, promiseResult?: boolean): void | Promise<boolean>;
458
454
  print(data: Uint32Array, start: number, end: number): void;
@@ -161,6 +161,10 @@ export class Buffer implements IBuffer {
161
161
  this.lines.maxLength = newMaxLength;
162
162
  }
163
163
 
164
+ // if (this._cols > newCols) {
165
+ // console.log('increase!');
166
+ // }
167
+
164
168
  // The following adjustments should only happen if the buffer has been
165
169
  // initialized/filled.
166
170
  if (this.lines.length > 0) {
@@ -311,7 +315,8 @@ export class Buffer implements IBuffer {
311
315
  }
312
316
 
313
317
  private _reflowLarger(newCols: number, newRows: number): void {
314
- const toRemove: number[] = reflowLargerGetLinesToRemove(this.lines, this._cols, newCols, this.ybase + this.y, this.getNullCell(DEFAULT_ATTR_DATA));
318
+ const reflowCursorLine = this._optionsService.rawOptions.reflowCursorLine;
319
+ const toRemove: number[] = reflowLargerGetLinesToRemove(this.lines, this._cols, newCols, this.ybase + this.y, this.getNullCell(DEFAULT_ATTR_DATA), reflowCursorLine);
315
320
  if (toRemove.length > 0) {
316
321
  const newLayoutResult = reflowLargerCreateNewLayout(this.lines, toRemove);
317
322
  reflowLargerApplyNewLayout(this.lines, newLayoutResult.layout);
@@ -343,6 +348,7 @@ export class Buffer implements IBuffer {
343
348
  }
344
349
 
345
350
  private _reflowSmaller(newCols: number, newRows: number): void {
351
+ const reflowCursorLine = this._optionsService.rawOptions.reflowCursorLine;
346
352
  const nullCell = this.getNullCell(DEFAULT_ATTR_DATA);
347
353
  // Gather all BufferLines that need to be inserted into the Buffer here so that they can be
348
354
  // batched up and only committed once
@@ -363,11 +369,13 @@ export class Buffer implements IBuffer {
363
369
  wrappedLines.unshift(nextLine);
364
370
  }
365
371
 
366
- // If these lines contain the cursor don't touch them, the program will handle fixing up
367
- // wrapped lines with the cursor
368
- const absoluteY = this.ybase + this.y;
369
- if (absoluteY >= y && absoluteY < y + wrappedLines.length) {
370
- continue;
372
+ if (!reflowCursorLine) {
373
+ // If these lines contain the cursor don't touch them, the program will handle fixing up
374
+ // wrapped lines with the cursor
375
+ const absoluteY = this.ybase + this.y;
376
+ if (absoluteY >= y && absoluteY < y + wrappedLines.length) {
377
+ continue;
378
+ }
371
379
  }
372
380
 
373
381
  const lastLineLength = wrappedLines[wrappedLines.length - 1].getTrimmedLength();
@@ -611,8 +619,8 @@ export class Buffer implements IBuffer {
611
619
  this._isClearing = true;
612
620
  for (let i = 0; i < this.markers.length; i++) {
613
621
  this.markers[i].dispose();
614
- this.markers.splice(i--, 1);
615
622
  }
623
+ this.markers.length = 0;
616
624
  this._isClearing = false;
617
625
  }
618
626
 
@@ -20,8 +20,9 @@ export interface INewLayoutResult {
20
20
  * @param newCols The columns after resize.
21
21
  * @param bufferAbsoluteY The absolute y position of the cursor (baseY + cursorY).
22
22
  * @param nullCell The cell data to use when filling in empty cells.
23
+ * @param reflowCursorLine Whether to reflow the line containing the cursor.
23
24
  */
24
- export function reflowLargerGetLinesToRemove(lines: CircularList<IBufferLine>, oldCols: number, newCols: number, bufferAbsoluteY: number, nullCell: ICellData): number[] {
25
+ export function reflowLargerGetLinesToRemove(lines: CircularList<IBufferLine>, oldCols: number, newCols: number, bufferAbsoluteY: number, nullCell: ICellData, reflowCursorLine: boolean): number[] {
25
26
  // Gather all BufferLines that need to be removed from the Buffer here so that they can be
26
27
  // batched up and only committed once
27
28
  const toRemove: number[] = [];
@@ -41,11 +42,13 @@ export function reflowLargerGetLinesToRemove(lines: CircularList<IBufferLine>, o
41
42
  nextLine = lines.get(++i) as BufferLine;
42
43
  }
43
44
 
44
- // If these lines contain the cursor don't touch them, the program will handle fixing up wrapped
45
- // lines with the cursor
46
- if (bufferAbsoluteY >= y && bufferAbsoluteY < i) {
47
- y += wrappedLines.length - 1;
48
- continue;
45
+ if (!reflowCursorLine) {
46
+ // If these lines contain the cursor don't touch them, the program will handle fixing up
47
+ // wrapped lines with the cursor
48
+ if (bufferAbsoluteY >= y && bufferAbsoluteY < i) {
49
+ y += wrappedLines.length - 1;
50
+ continue;
51
+ }
49
52
  }
50
53
 
51
54
  // Copy buffer data to new locations