groove-dev 0.16.0 → 0.16.2

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 (211) hide show
  1. package/node_modules/@groove-dev/daemon/src/api.js +122 -1
  2. package/node_modules/@groove-dev/daemon/src/index.js +25 -7
  3. package/node_modules/@groove-dev/daemon/src/mimetypes.js +43 -0
  4. package/node_modules/@groove-dev/daemon/src/terminal-pty.js +129 -0
  5. package/node_modules/@groove-dev/gui/dist/assets/{index-Gfb8Zxy9.css → index-BhjOFLBc.css} +32 -1
  6. package/node_modules/@groove-dev/gui/dist/assets/index-DeXW9EFU.js +153 -0
  7. package/node_modules/@groove-dev/gui/dist/index.html +2 -2
  8. package/node_modules/@groove-dev/gui/package.json +3 -0
  9. package/node_modules/@groove-dev/gui/src/components/EditorTabs.jsx +1 -1
  10. package/node_modules/@groove-dev/gui/src/components/FileTree.jsx +308 -23
  11. package/node_modules/@groove-dev/gui/src/components/MediaViewer.jsx +104 -0
  12. package/node_modules/@groove-dev/gui/src/components/Terminal.jsx +154 -0
  13. package/node_modules/@groove-dev/gui/src/stores/groove.js +131 -2
  14. package/node_modules/@groove-dev/gui/src/views/FileEditor.jsx +104 -36
  15. package/node_modules/@xterm/addon-fit/LICENSE +19 -0
  16. package/node_modules/@xterm/addon-fit/README.md +24 -0
  17. package/node_modules/@xterm/addon-fit/lib/addon-fit.js +2 -0
  18. package/node_modules/@xterm/addon-fit/lib/addon-fit.js.map +1 -0
  19. package/node_modules/@xterm/addon-fit/lib/addon-fit.mjs +18 -0
  20. package/node_modules/@xterm/addon-fit/lib/addon-fit.mjs.map +7 -0
  21. package/node_modules/@xterm/addon-fit/package.json +26 -0
  22. package/node_modules/@xterm/addon-fit/src/FitAddon.ts +92 -0
  23. package/node_modules/@xterm/addon-fit/typings/addon-fit.d.ts +55 -0
  24. package/node_modules/@xterm/addon-web-links/LICENSE +19 -0
  25. package/node_modules/@xterm/addon-web-links/README.md +21 -0
  26. package/node_modules/@xterm/addon-web-links/lib/addon-web-links.js +2 -0
  27. package/node_modules/@xterm/addon-web-links/lib/addon-web-links.js.map +1 -0
  28. package/node_modules/@xterm/addon-web-links/lib/addon-web-links.mjs +18 -0
  29. package/node_modules/@xterm/addon-web-links/lib/addon-web-links.mjs.map +7 -0
  30. package/node_modules/@xterm/addon-web-links/package.json +26 -0
  31. package/node_modules/@xterm/addon-web-links/src/WebLinkProvider.ts +199 -0
  32. package/node_modules/@xterm/addon-web-links/src/WebLinksAddon.ts +58 -0
  33. package/node_modules/@xterm/addon-web-links/typings/addon-web-links.d.ts +57 -0
  34. package/node_modules/@xterm/xterm/LICENSE +21 -0
  35. package/node_modules/@xterm/xterm/README.md +243 -0
  36. package/node_modules/@xterm/xterm/css/xterm.css +285 -0
  37. package/node_modules/@xterm/xterm/lib/xterm.js +2 -0
  38. package/node_modules/@xterm/xterm/lib/xterm.js.map +1 -0
  39. package/node_modules/@xterm/xterm/lib/xterm.mjs +53 -0
  40. package/node_modules/@xterm/xterm/lib/xterm.mjs.map +7 -0
  41. package/node_modules/@xterm/xterm/package.json +111 -0
  42. package/node_modules/@xterm/xterm/src/browser/AccessibilityManager.ts +435 -0
  43. package/node_modules/@xterm/xterm/src/browser/Clipboard.ts +93 -0
  44. package/node_modules/@xterm/xterm/src/browser/ColorContrastCache.ts +34 -0
  45. package/node_modules/@xterm/xterm/src/browser/CoreBrowserTerminal.ts +1339 -0
  46. package/node_modules/@xterm/xterm/src/browser/Linkifier.ts +403 -0
  47. package/node_modules/@xterm/xterm/src/browser/LocalizableStrings.ts +23 -0
  48. package/node_modules/@xterm/xterm/src/browser/OscLinkProvider.ts +129 -0
  49. package/node_modules/@xterm/xterm/src/browser/RenderDebouncer.ts +84 -0
  50. package/node_modules/@xterm/xterm/src/browser/TimeBasedDebouncer.ts +86 -0
  51. package/node_modules/@xterm/xterm/src/browser/Types.ts +226 -0
  52. package/node_modules/@xterm/xterm/src/browser/Viewport.ts +192 -0
  53. package/node_modules/@xterm/xterm/src/browser/decorations/BufferDecorationRenderer.ts +139 -0
  54. package/node_modules/@xterm/xterm/src/browser/decorations/ColorZoneStore.ts +117 -0
  55. package/node_modules/@xterm/xterm/src/browser/decorations/OverviewRulerRenderer.ts +214 -0
  56. package/node_modules/@xterm/xterm/src/browser/input/CompositionHelper.ts +248 -0
  57. package/node_modules/@xterm/xterm/src/browser/input/Mouse.ts +54 -0
  58. package/node_modules/@xterm/xterm/src/browser/input/MoveToCell.ts +251 -0
  59. package/node_modules/@xterm/xterm/src/browser/public/Terminal.ts +275 -0
  60. package/node_modules/@xterm/xterm/src/browser/renderer/dom/DomRenderer.ts +542 -0
  61. package/node_modules/@xterm/xterm/src/browser/renderer/dom/DomRendererRowFactory.ts +546 -0
  62. package/node_modules/@xterm/xterm/src/browser/renderer/dom/WidthCache.ts +167 -0
  63. package/node_modules/@xterm/xterm/src/browser/renderer/shared/Constants.ts +6 -0
  64. package/node_modules/@xterm/xterm/src/browser/renderer/shared/RendererUtils.ts +95 -0
  65. package/node_modules/@xterm/xterm/src/browser/renderer/shared/SelectionRenderModel.ts +93 -0
  66. package/node_modules/@xterm/xterm/src/browser/renderer/shared/Types.ts +84 -0
  67. package/node_modules/@xterm/xterm/src/browser/selection/SelectionModel.ts +144 -0
  68. package/node_modules/@xterm/xterm/src/browser/selection/Types.ts +15 -0
  69. package/node_modules/@xterm/xterm/src/browser/services/CharSizeService.ts +127 -0
  70. package/node_modules/@xterm/xterm/src/browser/services/CharacterJoinerService.ts +339 -0
  71. package/node_modules/@xterm/xterm/src/browser/services/CoreBrowserService.ts +137 -0
  72. package/node_modules/@xterm/xterm/src/browser/services/LinkProviderService.ts +28 -0
  73. package/node_modules/@xterm/xterm/src/browser/services/MouseService.ts +46 -0
  74. package/node_modules/@xterm/xterm/src/browser/services/RenderService.ts +376 -0
  75. package/node_modules/@xterm/xterm/src/browser/services/SelectionService.ts +1039 -0
  76. package/node_modules/@xterm/xterm/src/browser/services/Services.ts +158 -0
  77. package/node_modules/@xterm/xterm/src/browser/services/ThemeService.ts +198 -0
  78. package/node_modules/@xterm/xterm/src/browser/shared/Constants.ts +8 -0
  79. package/node_modules/@xterm/xterm/src/common/CircularList.ts +241 -0
  80. package/node_modules/@xterm/xterm/src/common/Clone.ts +23 -0
  81. package/node_modules/@xterm/xterm/src/common/Color.ts +376 -0
  82. package/node_modules/@xterm/xterm/src/common/CoreTerminal.ts +283 -0
  83. package/node_modules/@xterm/xterm/src/common/InputHandler.ts +3495 -0
  84. package/node_modules/@xterm/xterm/src/common/MultiKeyMap.ts +42 -0
  85. package/node_modules/@xterm/xterm/src/common/Platform.ts +44 -0
  86. package/node_modules/@xterm/xterm/src/common/SortedList.ts +194 -0
  87. package/node_modules/@xterm/xterm/src/common/TaskQueue.ts +166 -0
  88. package/node_modules/@xterm/xterm/src/common/TypedArrayUtils.ts +17 -0
  89. package/node_modules/@xterm/xterm/src/common/Types.ts +552 -0
  90. package/node_modules/@xterm/xterm/src/common/WindowsMode.ts +27 -0
  91. package/node_modules/@xterm/xterm/src/common/buffer/AttributeData.ts +211 -0
  92. package/node_modules/@xterm/xterm/src/common/buffer/Buffer.ts +662 -0
  93. package/node_modules/@xterm/xterm/src/common/buffer/BufferLine.ts +551 -0
  94. package/node_modules/@xterm/xterm/src/common/buffer/BufferRange.ts +13 -0
  95. package/node_modules/@xterm/xterm/src/common/buffer/BufferReflow.ts +226 -0
  96. package/node_modules/@xterm/xterm/src/common/buffer/BufferSet.ts +134 -0
  97. package/node_modules/@xterm/xterm/src/common/buffer/CellData.ts +94 -0
  98. package/node_modules/@xterm/xterm/src/common/buffer/Constants.ts +157 -0
  99. package/node_modules/@xterm/xterm/src/common/buffer/Marker.ts +43 -0
  100. package/node_modules/@xterm/xterm/src/common/buffer/Types.ts +52 -0
  101. package/node_modules/@xterm/xterm/src/common/data/Charsets.ts +256 -0
  102. package/node_modules/@xterm/xterm/src/common/data/EscapeSequences.ts +153 -0
  103. package/node_modules/@xterm/xterm/src/common/input/Keyboard.ts +373 -0
  104. package/node_modules/@xterm/xterm/src/common/input/TextDecoder.ts +346 -0
  105. package/node_modules/@xterm/xterm/src/common/input/UnicodeV6.ts +145 -0
  106. package/node_modules/@xterm/xterm/src/common/input/WriteBuffer.ts +247 -0
  107. package/node_modules/@xterm/xterm/src/common/input/XParseColor.ts +80 -0
  108. package/node_modules/@xterm/xterm/src/common/parser/Constants.ts +58 -0
  109. package/node_modules/@xterm/xterm/src/common/parser/DcsParser.ts +192 -0
  110. package/node_modules/@xterm/xterm/src/common/parser/EscapeSequenceParser.ts +792 -0
  111. package/node_modules/@xterm/xterm/src/common/parser/OscParser.ts +238 -0
  112. package/node_modules/@xterm/xterm/src/common/parser/Params.ts +229 -0
  113. package/node_modules/@xterm/xterm/src/common/parser/Types.ts +275 -0
  114. package/node_modules/@xterm/xterm/src/common/public/AddonManager.ts +53 -0
  115. package/node_modules/@xterm/xterm/src/common/public/BufferApiView.ts +35 -0
  116. package/node_modules/@xterm/xterm/src/common/public/BufferLineApiView.ts +29 -0
  117. package/node_modules/@xterm/xterm/src/common/public/BufferNamespaceApi.ts +36 -0
  118. package/node_modules/@xterm/xterm/src/common/public/ParserApi.ts +37 -0
  119. package/node_modules/@xterm/xterm/src/common/public/UnicodeApi.ts +27 -0
  120. package/node_modules/@xterm/xterm/src/common/services/BufferService.ts +154 -0
  121. package/node_modules/@xterm/xterm/src/common/services/CharsetService.ts +34 -0
  122. package/node_modules/@xterm/xterm/src/common/services/CoreMouseService.ts +365 -0
  123. package/node_modules/@xterm/xterm/src/common/services/CoreService.ts +92 -0
  124. package/node_modules/@xterm/xterm/src/common/services/DecorationService.ts +140 -0
  125. package/node_modules/@xterm/xterm/src/common/services/InstantiationService.ts +85 -0
  126. package/node_modules/@xterm/xterm/src/common/services/LogService.ts +124 -0
  127. package/node_modules/@xterm/xterm/src/common/services/OptionsService.ts +212 -0
  128. package/node_modules/@xterm/xterm/src/common/services/OscLinkService.ts +115 -0
  129. package/node_modules/@xterm/xterm/src/common/services/ServiceRegistry.ts +49 -0
  130. package/node_modules/@xterm/xterm/src/common/services/Services.ts +396 -0
  131. package/node_modules/@xterm/xterm/src/common/services/UnicodeService.ts +111 -0
  132. package/node_modules/@xterm/xterm/src/vs/base/browser/browser.ts +141 -0
  133. package/node_modules/@xterm/xterm/src/vs/base/browser/canIUse.ts +49 -0
  134. package/node_modules/@xterm/xterm/src/vs/base/browser/dom.ts +2369 -0
  135. package/node_modules/@xterm/xterm/src/vs/base/browser/fastDomNode.ts +316 -0
  136. package/node_modules/@xterm/xterm/src/vs/base/browser/globalPointerMoveMonitor.ts +112 -0
  137. package/node_modules/@xterm/xterm/src/vs/base/browser/iframe.ts +135 -0
  138. package/node_modules/@xterm/xterm/src/vs/base/browser/keyboardEvent.ts +213 -0
  139. package/node_modules/@xterm/xterm/src/vs/base/browser/mouseEvent.ts +229 -0
  140. package/node_modules/@xterm/xterm/src/vs/base/browser/touch.ts +372 -0
  141. package/node_modules/@xterm/xterm/src/vs/base/browser/ui/scrollbar/abstractScrollbar.ts +303 -0
  142. package/node_modules/@xterm/xterm/src/vs/base/browser/ui/scrollbar/horizontalScrollbar.ts +114 -0
  143. package/node_modules/@xterm/xterm/src/vs/base/browser/ui/scrollbar/scrollableElement.ts +720 -0
  144. package/node_modules/@xterm/xterm/src/vs/base/browser/ui/scrollbar/scrollableElementOptions.ts +165 -0
  145. package/node_modules/@xterm/xterm/src/vs/base/browser/ui/scrollbar/scrollbarArrow.ts +114 -0
  146. package/node_modules/@xterm/xterm/src/vs/base/browser/ui/scrollbar/scrollbarState.ts +243 -0
  147. package/node_modules/@xterm/xterm/src/vs/base/browser/ui/scrollbar/scrollbarVisibilityController.ts +118 -0
  148. package/node_modules/@xterm/xterm/src/vs/base/browser/ui/scrollbar/verticalScrollbar.ts +116 -0
  149. package/node_modules/@xterm/xterm/src/vs/base/browser/ui/widget.ts +57 -0
  150. package/node_modules/@xterm/xterm/src/vs/base/browser/window.ts +14 -0
  151. package/node_modules/@xterm/xterm/src/vs/base/common/arrays.ts +887 -0
  152. package/node_modules/@xterm/xterm/src/vs/base/common/arraysFind.ts +202 -0
  153. package/node_modules/@xterm/xterm/src/vs/base/common/assert.ts +71 -0
  154. package/node_modules/@xterm/xterm/src/vs/base/common/async.ts +1992 -0
  155. package/node_modules/@xterm/xterm/src/vs/base/common/cancellation.ts +148 -0
  156. package/node_modules/@xterm/xterm/src/vs/base/common/charCode.ts +450 -0
  157. package/node_modules/@xterm/xterm/src/vs/base/common/collections.ts +140 -0
  158. package/node_modules/@xterm/xterm/src/vs/base/common/decorators.ts +130 -0
  159. package/node_modules/@xterm/xterm/src/vs/base/common/equals.ts +146 -0
  160. package/node_modules/@xterm/xterm/src/vs/base/common/errors.ts +303 -0
  161. package/node_modules/@xterm/xterm/src/vs/base/common/event.ts +1778 -0
  162. package/node_modules/@xterm/xterm/src/vs/base/common/functional.ts +32 -0
  163. package/node_modules/@xterm/xterm/src/vs/base/common/hash.ts +316 -0
  164. package/node_modules/@xterm/xterm/src/vs/base/common/iterator.ts +159 -0
  165. package/node_modules/@xterm/xterm/src/vs/base/common/keyCodes.ts +526 -0
  166. package/node_modules/@xterm/xterm/src/vs/base/common/keybindings.ts +284 -0
  167. package/node_modules/@xterm/xterm/src/vs/base/common/lazy.ts +47 -0
  168. package/node_modules/@xterm/xterm/src/vs/base/common/lifecycle.ts +801 -0
  169. package/node_modules/@xterm/xterm/src/vs/base/common/linkedList.ts +142 -0
  170. package/node_modules/@xterm/xterm/src/vs/base/common/map.ts +202 -0
  171. package/node_modules/@xterm/xterm/src/vs/base/common/numbers.ts +98 -0
  172. package/node_modules/@xterm/xterm/src/vs/base/common/observable.ts +76 -0
  173. package/node_modules/@xterm/xterm/src/vs/base/common/observableInternal/api.ts +31 -0
  174. package/node_modules/@xterm/xterm/src/vs/base/common/observableInternal/autorun.ts +281 -0
  175. package/node_modules/@xterm/xterm/src/vs/base/common/observableInternal/base.ts +489 -0
  176. package/node_modules/@xterm/xterm/src/vs/base/common/observableInternal/debugName.ts +145 -0
  177. package/node_modules/@xterm/xterm/src/vs/base/common/observableInternal/derived.ts +428 -0
  178. package/node_modules/@xterm/xterm/src/vs/base/common/observableInternal/lazyObservableValue.ts +146 -0
  179. package/node_modules/@xterm/xterm/src/vs/base/common/observableInternal/logging.ts +328 -0
  180. package/node_modules/@xterm/xterm/src/vs/base/common/observableInternal/promise.ts +209 -0
  181. package/node_modules/@xterm/xterm/src/vs/base/common/observableInternal/utils.ts +610 -0
  182. package/node_modules/@xterm/xterm/src/vs/base/common/platform.ts +281 -0
  183. package/node_modules/@xterm/xterm/src/vs/base/common/scrollable.ts +522 -0
  184. package/node_modules/@xterm/xterm/src/vs/base/common/sequence.ts +34 -0
  185. package/node_modules/@xterm/xterm/src/vs/base/common/stopwatch.ts +43 -0
  186. package/node_modules/@xterm/xterm/src/vs/base/common/strings.ts +557 -0
  187. package/node_modules/@xterm/xterm/src/vs/base/common/symbols.ts +9 -0
  188. package/node_modules/@xterm/xterm/src/vs/base/common/uint.ts +59 -0
  189. package/node_modules/@xterm/xterm/src/vs/patches/nls.ts +90 -0
  190. package/node_modules/@xterm/xterm/src/vs/typings/base-common.d.ts +20 -0
  191. package/node_modules/@xterm/xterm/src/vs/typings/require.d.ts +42 -0
  192. package/node_modules/@xterm/xterm/src/vs/typings/vscode-globals-nls.d.ts +36 -0
  193. package/node_modules/@xterm/xterm/src/vs/typings/vscode-globals-product.d.ts +33 -0
  194. package/node_modules/@xterm/xterm/typings/xterm.d.ts +1957 -0
  195. package/package.json +1 -1
  196. package/packages/daemon/src/api.js +122 -1
  197. package/packages/daemon/src/index.js +25 -7
  198. package/packages/daemon/src/mimetypes.js +43 -0
  199. package/packages/daemon/src/terminal-pty.js +129 -0
  200. package/packages/gui/dist/assets/{index-Gfb8Zxy9.css → index-BhjOFLBc.css} +32 -1
  201. package/packages/gui/dist/assets/index-DeXW9EFU.js +153 -0
  202. package/packages/gui/dist/index.html +2 -2
  203. package/packages/gui/package.json +3 -0
  204. package/packages/gui/src/components/EditorTabs.jsx +1 -1
  205. package/packages/gui/src/components/FileTree.jsx +308 -23
  206. package/packages/gui/src/components/MediaViewer.jsx +104 -0
  207. package/packages/gui/src/components/Terminal.jsx +154 -0
  208. package/packages/gui/src/stores/groove.js +131 -2
  209. package/packages/gui/src/views/FileEditor.jsx +104 -36
  210. package/node_modules/@groove-dev/gui/dist/assets/index-Dxg9hdf3.js +0 -103
  211. package/packages/gui/dist/assets/index-Dxg9hdf3.js +0 -103
@@ -0,0 +1,376 @@
1
+ /**
2
+ * Copyright (c) 2019 The xterm.js authors. All rights reserved.
3
+ * @license MIT
4
+ */
5
+
6
+ import { RenderDebouncer } from 'browser/RenderDebouncer';
7
+ import { IRenderDebouncerWithCallback } from 'browser/Types';
8
+ import { IRenderDimensions, IRenderer } from 'browser/renderer/shared/Types';
9
+ import { ICharSizeService, ICoreBrowserService, IRenderService, IThemeService } from 'browser/services/Services';
10
+ import { Disposable, MutableDisposable, toDisposable } from 'vs/base/common/lifecycle';
11
+ import { DebouncedIdleTask } from 'common/TaskQueue';
12
+ import { IBufferService, ICoreService, IDecorationService, IOptionsService } from 'common/services/Services';
13
+ import { Emitter } from 'vs/base/common/event';
14
+
15
+ interface ISelectionState {
16
+ start: [number, number] | undefined;
17
+ end: [number, number] | undefined;
18
+ columnSelectMode: boolean;
19
+ }
20
+
21
+ const enum Constants {
22
+ SYNCHRONIZED_OUTPUT_TIMEOUT_MS = 1000
23
+ }
24
+
25
+ export class RenderService extends Disposable implements IRenderService {
26
+ public serviceBrand: undefined;
27
+
28
+ private _renderer: MutableDisposable<IRenderer> = this._register(new MutableDisposable());
29
+ private _renderDebouncer: IRenderDebouncerWithCallback;
30
+ private _pausedResizeTask = new DebouncedIdleTask();
31
+ private _observerDisposable = this._register(new MutableDisposable());
32
+
33
+ private _isPaused: boolean = false;
34
+ private _needsFullRefresh: boolean = false;
35
+ private _isNextRenderRedrawOnly: boolean = true;
36
+ private _needsSelectionRefresh: boolean = false;
37
+ private _canvasWidth: number = 0;
38
+ private _canvasHeight: number = 0;
39
+ private _syncOutputHandler: SynchronizedOutputHandler;
40
+ private _selectionState: ISelectionState = {
41
+ start: undefined,
42
+ end: undefined,
43
+ columnSelectMode: false
44
+ };
45
+
46
+ private readonly _onDimensionsChange = this._register(new Emitter<IRenderDimensions>());
47
+ public readonly onDimensionsChange = this._onDimensionsChange.event;
48
+ private readonly _onRenderedViewportChange = this._register(new Emitter<{ start: number, end: number }>());
49
+ public readonly onRenderedViewportChange = this._onRenderedViewportChange.event;
50
+ private readonly _onRender = this._register(new Emitter<{ start: number, end: number }>());
51
+ public readonly onRender = this._onRender.event;
52
+ private readonly _onRefreshRequest = this._register(new Emitter<{ start: number, end: number }>());
53
+ public readonly onRefreshRequest = this._onRefreshRequest.event;
54
+
55
+ public get dimensions(): IRenderDimensions { return this._renderer.value!.dimensions; }
56
+
57
+ constructor(
58
+ private _rowCount: number,
59
+ screenElement: HTMLElement,
60
+ @IOptionsService private readonly _optionsService: IOptionsService,
61
+ @ICharSizeService private readonly _charSizeService: ICharSizeService,
62
+ @ICoreService private readonly _coreService: ICoreService,
63
+ @IDecorationService decorationService: IDecorationService,
64
+ @IBufferService bufferService: IBufferService,
65
+ @ICoreBrowserService private readonly _coreBrowserService: ICoreBrowserService,
66
+ @IThemeService themeService: IThemeService
67
+ ) {
68
+ super();
69
+
70
+ this._renderDebouncer = new RenderDebouncer((start, end) => this._renderRows(start, end), this._coreBrowserService);
71
+ this._register(this._renderDebouncer);
72
+
73
+ this._syncOutputHandler = new SynchronizedOutputHandler(
74
+ this._coreBrowserService,
75
+ this._coreService,
76
+ () => this._fullRefresh()
77
+ );
78
+ this._register(toDisposable(() => this._syncOutputHandler.dispose()));
79
+
80
+ this._register(this._coreBrowserService.onDprChange(() => this.handleDevicePixelRatioChange()));
81
+
82
+ this._register(bufferService.onResize(() => this._fullRefresh()));
83
+ this._register(bufferService.buffers.onBufferActivate(() => this._renderer.value?.clear()));
84
+ this._register(this._optionsService.onOptionChange(() => this._handleOptionsChanged()));
85
+ this._register(this._charSizeService.onCharSizeChange(() => this.handleCharSizeChanged()));
86
+
87
+ // Do a full refresh whenever any decoration is added or removed. This may not actually result
88
+ // in changes but since decorations should be used sparingly or added/removed all in the same
89
+ // frame this should have minimal performance impact.
90
+ this._register(decorationService.onDecorationRegistered(() => this._fullRefresh()));
91
+ this._register(decorationService.onDecorationRemoved(() => this._fullRefresh()));
92
+
93
+ // Clear the renderer when the a change that could affect glyphs occurs
94
+ this._register(this._optionsService.onMultipleOptionChange([
95
+ 'customGlyphs',
96
+ 'drawBoldTextInBrightColors',
97
+ 'letterSpacing',
98
+ 'lineHeight',
99
+ 'fontFamily',
100
+ 'fontSize',
101
+ 'fontWeight',
102
+ 'fontWeightBold',
103
+ 'minimumContrastRatio',
104
+ 'rescaleOverlappingGlyphs'
105
+ ], () => {
106
+ this.clear();
107
+ this.handleResize(bufferService.cols, bufferService.rows);
108
+ this._fullRefresh();
109
+ }));
110
+
111
+ // Refresh the cursor line when the cursor changes
112
+ this._register(this._optionsService.onMultipleOptionChange([
113
+ 'cursorBlink',
114
+ 'cursorStyle'
115
+ ], () => this.refreshRows(bufferService.buffer.y, bufferService.buffer.y, true)));
116
+
117
+ this._register(themeService.onChangeColors(() => this._fullRefresh()));
118
+
119
+ this._registerIntersectionObserver(this._coreBrowserService.window, screenElement);
120
+ this._register(this._coreBrowserService.onWindowChange((w) => this._registerIntersectionObserver(w, screenElement)));
121
+ }
122
+
123
+ private _registerIntersectionObserver(w: Window & typeof globalThis, screenElement: HTMLElement): void {
124
+ // Detect whether IntersectionObserver is detected and enable renderer pause
125
+ // and resume based on terminal visibility if so
126
+ if ('IntersectionObserver' in w) {
127
+ const observer = new w.IntersectionObserver(e => this._handleIntersectionChange(e[e.length - 1]), { threshold: 0 });
128
+ observer.observe(screenElement);
129
+ this._observerDisposable.value = toDisposable(() => observer.disconnect());
130
+ }
131
+ }
132
+
133
+ private _handleIntersectionChange(entry: IntersectionObserverEntry): void {
134
+ this._isPaused = entry.isIntersecting === undefined ? (entry.intersectionRatio === 0) : !entry.isIntersecting;
135
+
136
+ // Terminal was hidden on open
137
+ if (!this._isPaused && !this._charSizeService.hasValidSize) {
138
+ this._charSizeService.measure();
139
+ }
140
+
141
+ if (!this._isPaused && this._needsFullRefresh) {
142
+ this._pausedResizeTask.flush();
143
+ this.refreshRows(0, this._rowCount - 1);
144
+ this._needsFullRefresh = false;
145
+ }
146
+ }
147
+
148
+ public refreshRows(start: number, end: number, isRedrawOnly: boolean = false): void {
149
+ if (this._isPaused) {
150
+ this._needsFullRefresh = true;
151
+ return;
152
+ }
153
+
154
+ if (this._coreService.decPrivateModes.synchronizedOutput) {
155
+ this._syncOutputHandler.bufferRows(start, end);
156
+ return;
157
+ }
158
+
159
+ const buffered = this._syncOutputHandler.flush();
160
+ if (buffered) {
161
+ start = Math.min(start, buffered.start);
162
+ end = Math.max(end, buffered.end);
163
+ }
164
+
165
+ if (!isRedrawOnly) {
166
+ this._isNextRenderRedrawOnly = false;
167
+ }
168
+ this._renderDebouncer.refresh(start, end, this._rowCount);
169
+ }
170
+
171
+ private _renderRows(start: number, end: number): void {
172
+ if (!this._renderer.value) {
173
+ return;
174
+ }
175
+
176
+ // Skip rendering if synchronized output mode is enabled. This check must happen here
177
+ // (in addition to refreshRows) to handle renders that were queued before the mode was enabled.
178
+ if (this._coreService.decPrivateModes.synchronizedOutput) {
179
+ this._syncOutputHandler.bufferRows(start, end);
180
+ return;
181
+ }
182
+
183
+ // Since this is debounced, a resize event could have happened between the time a refresh was
184
+ // requested and when this triggers. Clamp the values of start and end to ensure they're valid
185
+ // given the current viewport state.
186
+ start = Math.min(start, this._rowCount - 1);
187
+ end = Math.min(end, this._rowCount - 1);
188
+
189
+ // Render
190
+ this._renderer.value.renderRows(start, end);
191
+
192
+ // Update selection if needed
193
+ if (this._needsSelectionRefresh) {
194
+ this._renderer.value.handleSelectionChanged(this._selectionState.start, this._selectionState.end, this._selectionState.columnSelectMode);
195
+ this._needsSelectionRefresh = false;
196
+ }
197
+
198
+ // Fire render event only if it was not a redraw
199
+ if (!this._isNextRenderRedrawOnly) {
200
+ this._onRenderedViewportChange.fire({ start, end });
201
+ }
202
+ this._onRender.fire({ start, end });
203
+ this._isNextRenderRedrawOnly = true;
204
+ }
205
+
206
+ public resize(cols: number, rows: number): void {
207
+ this._rowCount = rows;
208
+ this._fireOnCanvasResize();
209
+ }
210
+
211
+ private _handleOptionsChanged(): void {
212
+ if (!this._renderer.value) {
213
+ return;
214
+ }
215
+ this.refreshRows(0, this._rowCount - 1);
216
+ this._fireOnCanvasResize();
217
+ }
218
+
219
+ private _fireOnCanvasResize(): void {
220
+ if (!this._renderer.value) {
221
+ return;
222
+ }
223
+ // Don't fire the event if the dimensions haven't changed
224
+ if (this._renderer.value.dimensions.css.canvas.width === this._canvasWidth && this._renderer.value.dimensions.css.canvas.height === this._canvasHeight) {
225
+ return;
226
+ }
227
+ this._onDimensionsChange.fire(this._renderer.value.dimensions);
228
+ }
229
+
230
+ public hasRenderer(): boolean {
231
+ return !!this._renderer.value;
232
+ }
233
+
234
+ public setRenderer(renderer: IRenderer): void {
235
+ this._renderer.value = renderer;
236
+ // If the value was not set, the terminal is being disposed so ignore it
237
+ if (this._renderer.value) {
238
+ this._renderer.value.onRequestRedraw(e => this.refreshRows(e.start, e.end, true));
239
+
240
+ // Force a refresh
241
+ this._needsSelectionRefresh = true;
242
+ this._fullRefresh();
243
+ }
244
+ }
245
+
246
+ public addRefreshCallback(callback: FrameRequestCallback): number {
247
+ return this._renderDebouncer.addRefreshCallback(callback);
248
+ }
249
+
250
+ private _fullRefresh(): void {
251
+ if (this._isPaused) {
252
+ this._needsFullRefresh = true;
253
+ } else {
254
+ this.refreshRows(0, this._rowCount - 1);
255
+ }
256
+ }
257
+
258
+ public clearTextureAtlas(): void {
259
+ if (!this._renderer.value) {
260
+ return;
261
+ }
262
+ this._renderer.value.clearTextureAtlas?.();
263
+ this._fullRefresh();
264
+ }
265
+
266
+ public handleDevicePixelRatioChange(): void {
267
+ // Force char size measurement as DomMeasureStrategy(getBoundingClientRect) is not stable
268
+ // when devicePixelRatio changes
269
+ this._charSizeService.measure();
270
+
271
+ if (!this._renderer.value) {
272
+ return;
273
+ }
274
+ this._renderer.value.handleDevicePixelRatioChange();
275
+ this.refreshRows(0, this._rowCount - 1);
276
+ }
277
+
278
+ public handleResize(cols: number, rows: number): void {
279
+ if (!this._renderer.value) {
280
+ return;
281
+ }
282
+ if (this._isPaused) {
283
+ this._pausedResizeTask.set(() => this._renderer.value?.handleResize(cols, rows));
284
+ } else {
285
+ this._renderer.value.handleResize(cols, rows);
286
+ }
287
+ this._fullRefresh();
288
+ }
289
+
290
+ // TODO: Is this useful when we have onResize?
291
+ public handleCharSizeChanged(): void {
292
+ this._renderer.value?.handleCharSizeChanged();
293
+ }
294
+
295
+ public handleBlur(): void {
296
+ this._renderer.value?.handleBlur();
297
+ }
298
+
299
+ public handleFocus(): void {
300
+ this._renderer.value?.handleFocus();
301
+ }
302
+
303
+ public handleSelectionChanged(start: [number, number] | undefined, end: [number, number] | undefined, columnSelectMode: boolean): void {
304
+ this._selectionState.start = start;
305
+ this._selectionState.end = end;
306
+ this._selectionState.columnSelectMode = columnSelectMode;
307
+ this._renderer.value?.handleSelectionChanged(start, end, columnSelectMode);
308
+ }
309
+
310
+ public handleCursorMove(): void {
311
+ this._renderer.value?.handleCursorMove();
312
+ }
313
+
314
+ public clear(): void {
315
+ this._renderer.value?.clear();
316
+ }
317
+ }
318
+
319
+ /**
320
+ * Buffers row refresh requests during synchronized output mode (DEC mode 2026).
321
+ * When the mode is disabled, the accumulated row range is flushed for rendering.
322
+ * A safety timeout ensures rendering occurs even if the end sequence is not received.
323
+ */
324
+ class SynchronizedOutputHandler {
325
+ private _start: number = 0;
326
+ private _end: number = 0;
327
+ private _timeout: number | undefined;
328
+ private _isBuffering: boolean = false;
329
+
330
+ constructor(
331
+ private readonly _coreBrowserService: ICoreBrowserService,
332
+ private readonly _coreService: ICoreService,
333
+ private readonly _onTimeout: () => void
334
+ ) {}
335
+
336
+ public bufferRows(start: number, end: number): void {
337
+ if (!this._isBuffering) {
338
+ this._start = start;
339
+ this._end = end;
340
+ this._isBuffering = true;
341
+ } else {
342
+ this._start = Math.min(this._start, start);
343
+ this._end = Math.max(this._end, end);
344
+ }
345
+
346
+ if (this._timeout === undefined) {
347
+ this._timeout = this._coreBrowserService.window.setTimeout(() => {
348
+ this._timeout = undefined;
349
+ this._coreService.decPrivateModes.synchronizedOutput = false;
350
+ this._onTimeout();
351
+ }, Constants.SYNCHRONIZED_OUTPUT_TIMEOUT_MS);
352
+ }
353
+ }
354
+
355
+ public flush(): { start: number, end: number } | undefined {
356
+ if (this._timeout !== undefined) {
357
+ this._coreBrowserService.window.clearTimeout(this._timeout);
358
+ this._timeout = undefined;
359
+ }
360
+
361
+ if (!this._isBuffering) {
362
+ return undefined;
363
+ }
364
+
365
+ const result = { start: this._start, end: this._end };
366
+ this._isBuffering = false;
367
+ return result;
368
+ }
369
+
370
+ public dispose(): void {
371
+ if (this._timeout !== undefined) {
372
+ this._coreBrowserService.window.clearTimeout(this._timeout);
373
+ this._timeout = undefined;
374
+ }
375
+ }
376
+ }