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.
- package/node_modules/@groove-dev/daemon/src/api.js +122 -1
- package/node_modules/@groove-dev/daemon/src/index.js +25 -7
- package/node_modules/@groove-dev/daemon/src/mimetypes.js +43 -0
- package/node_modules/@groove-dev/daemon/src/terminal-pty.js +129 -0
- package/node_modules/@groove-dev/gui/dist/assets/{index-Gfb8Zxy9.css → index-BhjOFLBc.css} +32 -1
- package/node_modules/@groove-dev/gui/dist/assets/index-DeXW9EFU.js +153 -0
- package/node_modules/@groove-dev/gui/dist/index.html +2 -2
- package/node_modules/@groove-dev/gui/package.json +3 -0
- package/node_modules/@groove-dev/gui/src/components/EditorTabs.jsx +1 -1
- package/node_modules/@groove-dev/gui/src/components/FileTree.jsx +308 -23
- package/node_modules/@groove-dev/gui/src/components/MediaViewer.jsx +104 -0
- package/node_modules/@groove-dev/gui/src/components/Terminal.jsx +154 -0
- package/node_modules/@groove-dev/gui/src/stores/groove.js +131 -2
- package/node_modules/@groove-dev/gui/src/views/FileEditor.jsx +104 -36
- package/node_modules/@xterm/addon-fit/LICENSE +19 -0
- package/node_modules/@xterm/addon-fit/README.md +24 -0
- package/node_modules/@xterm/addon-fit/lib/addon-fit.js +2 -0
- package/node_modules/@xterm/addon-fit/lib/addon-fit.js.map +1 -0
- package/node_modules/@xterm/addon-fit/lib/addon-fit.mjs +18 -0
- package/node_modules/@xterm/addon-fit/lib/addon-fit.mjs.map +7 -0
- package/node_modules/@xterm/addon-fit/package.json +26 -0
- package/node_modules/@xterm/addon-fit/src/FitAddon.ts +92 -0
- package/node_modules/@xterm/addon-fit/typings/addon-fit.d.ts +55 -0
- package/node_modules/@xterm/addon-web-links/LICENSE +19 -0
- package/node_modules/@xterm/addon-web-links/README.md +21 -0
- package/node_modules/@xterm/addon-web-links/lib/addon-web-links.js +2 -0
- package/node_modules/@xterm/addon-web-links/lib/addon-web-links.js.map +1 -0
- package/node_modules/@xterm/addon-web-links/lib/addon-web-links.mjs +18 -0
- package/node_modules/@xterm/addon-web-links/lib/addon-web-links.mjs.map +7 -0
- package/node_modules/@xterm/addon-web-links/package.json +26 -0
- package/node_modules/@xterm/addon-web-links/src/WebLinkProvider.ts +199 -0
- package/node_modules/@xterm/addon-web-links/src/WebLinksAddon.ts +58 -0
- package/node_modules/@xterm/addon-web-links/typings/addon-web-links.d.ts +57 -0
- package/node_modules/@xterm/xterm/LICENSE +21 -0
- package/node_modules/@xterm/xterm/README.md +243 -0
- package/node_modules/@xterm/xterm/css/xterm.css +285 -0
- package/node_modules/@xterm/xterm/lib/xterm.js +2 -0
- package/node_modules/@xterm/xterm/lib/xterm.js.map +1 -0
- package/node_modules/@xterm/xterm/lib/xterm.mjs +53 -0
- package/node_modules/@xterm/xterm/lib/xterm.mjs.map +7 -0
- package/node_modules/@xterm/xterm/package.json +111 -0
- package/node_modules/@xterm/xterm/src/browser/AccessibilityManager.ts +435 -0
- package/node_modules/@xterm/xterm/src/browser/Clipboard.ts +93 -0
- package/node_modules/@xterm/xterm/src/browser/ColorContrastCache.ts +34 -0
- package/node_modules/@xterm/xterm/src/browser/CoreBrowserTerminal.ts +1339 -0
- package/node_modules/@xterm/xterm/src/browser/Linkifier.ts +403 -0
- package/node_modules/@xterm/xterm/src/browser/LocalizableStrings.ts +23 -0
- package/node_modules/@xterm/xterm/src/browser/OscLinkProvider.ts +129 -0
- package/node_modules/@xterm/xterm/src/browser/RenderDebouncer.ts +84 -0
- package/node_modules/@xterm/xterm/src/browser/TimeBasedDebouncer.ts +86 -0
- package/node_modules/@xterm/xterm/src/browser/Types.ts +226 -0
- package/node_modules/@xterm/xterm/src/browser/Viewport.ts +192 -0
- package/node_modules/@xterm/xterm/src/browser/decorations/BufferDecorationRenderer.ts +139 -0
- package/node_modules/@xterm/xterm/src/browser/decorations/ColorZoneStore.ts +117 -0
- package/node_modules/@xterm/xterm/src/browser/decorations/OverviewRulerRenderer.ts +214 -0
- package/node_modules/@xterm/xterm/src/browser/input/CompositionHelper.ts +248 -0
- package/node_modules/@xterm/xterm/src/browser/input/Mouse.ts +54 -0
- package/node_modules/@xterm/xterm/src/browser/input/MoveToCell.ts +251 -0
- package/node_modules/@xterm/xterm/src/browser/public/Terminal.ts +275 -0
- package/node_modules/@xterm/xterm/src/browser/renderer/dom/DomRenderer.ts +542 -0
- package/node_modules/@xterm/xterm/src/browser/renderer/dom/DomRendererRowFactory.ts +546 -0
- package/node_modules/@xterm/xterm/src/browser/renderer/dom/WidthCache.ts +167 -0
- package/node_modules/@xterm/xterm/src/browser/renderer/shared/Constants.ts +6 -0
- package/node_modules/@xterm/xterm/src/browser/renderer/shared/RendererUtils.ts +95 -0
- package/node_modules/@xterm/xterm/src/browser/renderer/shared/SelectionRenderModel.ts +93 -0
- package/node_modules/@xterm/xterm/src/browser/renderer/shared/Types.ts +84 -0
- package/node_modules/@xterm/xterm/src/browser/selection/SelectionModel.ts +144 -0
- package/node_modules/@xterm/xterm/src/browser/selection/Types.ts +15 -0
- package/node_modules/@xterm/xterm/src/browser/services/CharSizeService.ts +127 -0
- package/node_modules/@xterm/xterm/src/browser/services/CharacterJoinerService.ts +339 -0
- package/node_modules/@xterm/xterm/src/browser/services/CoreBrowserService.ts +137 -0
- package/node_modules/@xterm/xterm/src/browser/services/LinkProviderService.ts +28 -0
- package/node_modules/@xterm/xterm/src/browser/services/MouseService.ts +46 -0
- package/node_modules/@xterm/xterm/src/browser/services/RenderService.ts +376 -0
- package/node_modules/@xterm/xterm/src/browser/services/SelectionService.ts +1039 -0
- package/node_modules/@xterm/xterm/src/browser/services/Services.ts +158 -0
- package/node_modules/@xterm/xterm/src/browser/services/ThemeService.ts +198 -0
- package/node_modules/@xterm/xterm/src/browser/shared/Constants.ts +8 -0
- package/node_modules/@xterm/xterm/src/common/CircularList.ts +241 -0
- package/node_modules/@xterm/xterm/src/common/Clone.ts +23 -0
- package/node_modules/@xterm/xterm/src/common/Color.ts +376 -0
- package/node_modules/@xterm/xterm/src/common/CoreTerminal.ts +283 -0
- package/node_modules/@xterm/xterm/src/common/InputHandler.ts +3495 -0
- package/node_modules/@xterm/xterm/src/common/MultiKeyMap.ts +42 -0
- package/node_modules/@xterm/xterm/src/common/Platform.ts +44 -0
- package/node_modules/@xterm/xterm/src/common/SortedList.ts +194 -0
- package/node_modules/@xterm/xterm/src/common/TaskQueue.ts +166 -0
- package/node_modules/@xterm/xterm/src/common/TypedArrayUtils.ts +17 -0
- package/node_modules/@xterm/xterm/src/common/Types.ts +552 -0
- package/node_modules/@xterm/xterm/src/common/WindowsMode.ts +27 -0
- package/node_modules/@xterm/xterm/src/common/buffer/AttributeData.ts +211 -0
- package/node_modules/@xterm/xterm/src/common/buffer/Buffer.ts +662 -0
- package/node_modules/@xterm/xterm/src/common/buffer/BufferLine.ts +551 -0
- package/node_modules/@xterm/xterm/src/common/buffer/BufferRange.ts +13 -0
- package/node_modules/@xterm/xterm/src/common/buffer/BufferReflow.ts +226 -0
- package/node_modules/@xterm/xterm/src/common/buffer/BufferSet.ts +134 -0
- package/node_modules/@xterm/xterm/src/common/buffer/CellData.ts +94 -0
- package/node_modules/@xterm/xterm/src/common/buffer/Constants.ts +157 -0
- package/node_modules/@xterm/xterm/src/common/buffer/Marker.ts +43 -0
- package/node_modules/@xterm/xterm/src/common/buffer/Types.ts +52 -0
- package/node_modules/@xterm/xterm/src/common/data/Charsets.ts +256 -0
- package/node_modules/@xterm/xterm/src/common/data/EscapeSequences.ts +153 -0
- package/node_modules/@xterm/xterm/src/common/input/Keyboard.ts +373 -0
- package/node_modules/@xterm/xterm/src/common/input/TextDecoder.ts +346 -0
- package/node_modules/@xterm/xterm/src/common/input/UnicodeV6.ts +145 -0
- package/node_modules/@xterm/xterm/src/common/input/WriteBuffer.ts +247 -0
- package/node_modules/@xterm/xterm/src/common/input/XParseColor.ts +80 -0
- package/node_modules/@xterm/xterm/src/common/parser/Constants.ts +58 -0
- package/node_modules/@xterm/xterm/src/common/parser/DcsParser.ts +192 -0
- package/node_modules/@xterm/xterm/src/common/parser/EscapeSequenceParser.ts +792 -0
- package/node_modules/@xterm/xterm/src/common/parser/OscParser.ts +238 -0
- package/node_modules/@xterm/xterm/src/common/parser/Params.ts +229 -0
- package/node_modules/@xterm/xterm/src/common/parser/Types.ts +275 -0
- package/node_modules/@xterm/xterm/src/common/public/AddonManager.ts +53 -0
- package/node_modules/@xterm/xterm/src/common/public/BufferApiView.ts +35 -0
- package/node_modules/@xterm/xterm/src/common/public/BufferLineApiView.ts +29 -0
- package/node_modules/@xterm/xterm/src/common/public/BufferNamespaceApi.ts +36 -0
- package/node_modules/@xterm/xterm/src/common/public/ParserApi.ts +37 -0
- package/node_modules/@xterm/xterm/src/common/public/UnicodeApi.ts +27 -0
- package/node_modules/@xterm/xterm/src/common/services/BufferService.ts +154 -0
- package/node_modules/@xterm/xterm/src/common/services/CharsetService.ts +34 -0
- package/node_modules/@xterm/xterm/src/common/services/CoreMouseService.ts +365 -0
- package/node_modules/@xterm/xterm/src/common/services/CoreService.ts +92 -0
- package/node_modules/@xterm/xterm/src/common/services/DecorationService.ts +140 -0
- package/node_modules/@xterm/xterm/src/common/services/InstantiationService.ts +85 -0
- package/node_modules/@xterm/xterm/src/common/services/LogService.ts +124 -0
- package/node_modules/@xterm/xterm/src/common/services/OptionsService.ts +212 -0
- package/node_modules/@xterm/xterm/src/common/services/OscLinkService.ts +115 -0
- package/node_modules/@xterm/xterm/src/common/services/ServiceRegistry.ts +49 -0
- package/node_modules/@xterm/xterm/src/common/services/Services.ts +396 -0
- package/node_modules/@xterm/xterm/src/common/services/UnicodeService.ts +111 -0
- package/node_modules/@xterm/xterm/src/vs/base/browser/browser.ts +141 -0
- package/node_modules/@xterm/xterm/src/vs/base/browser/canIUse.ts +49 -0
- package/node_modules/@xterm/xterm/src/vs/base/browser/dom.ts +2369 -0
- package/node_modules/@xterm/xterm/src/vs/base/browser/fastDomNode.ts +316 -0
- package/node_modules/@xterm/xterm/src/vs/base/browser/globalPointerMoveMonitor.ts +112 -0
- package/node_modules/@xterm/xterm/src/vs/base/browser/iframe.ts +135 -0
- package/node_modules/@xterm/xterm/src/vs/base/browser/keyboardEvent.ts +213 -0
- package/node_modules/@xterm/xterm/src/vs/base/browser/mouseEvent.ts +229 -0
- package/node_modules/@xterm/xterm/src/vs/base/browser/touch.ts +372 -0
- package/node_modules/@xterm/xterm/src/vs/base/browser/ui/scrollbar/abstractScrollbar.ts +303 -0
- package/node_modules/@xterm/xterm/src/vs/base/browser/ui/scrollbar/horizontalScrollbar.ts +114 -0
- package/node_modules/@xterm/xterm/src/vs/base/browser/ui/scrollbar/scrollableElement.ts +720 -0
- package/node_modules/@xterm/xterm/src/vs/base/browser/ui/scrollbar/scrollableElementOptions.ts +165 -0
- package/node_modules/@xterm/xterm/src/vs/base/browser/ui/scrollbar/scrollbarArrow.ts +114 -0
- package/node_modules/@xterm/xterm/src/vs/base/browser/ui/scrollbar/scrollbarState.ts +243 -0
- package/node_modules/@xterm/xterm/src/vs/base/browser/ui/scrollbar/scrollbarVisibilityController.ts +118 -0
- package/node_modules/@xterm/xterm/src/vs/base/browser/ui/scrollbar/verticalScrollbar.ts +116 -0
- package/node_modules/@xterm/xterm/src/vs/base/browser/ui/widget.ts +57 -0
- package/node_modules/@xterm/xterm/src/vs/base/browser/window.ts +14 -0
- package/node_modules/@xterm/xterm/src/vs/base/common/arrays.ts +887 -0
- package/node_modules/@xterm/xterm/src/vs/base/common/arraysFind.ts +202 -0
- package/node_modules/@xterm/xterm/src/vs/base/common/assert.ts +71 -0
- package/node_modules/@xterm/xterm/src/vs/base/common/async.ts +1992 -0
- package/node_modules/@xterm/xterm/src/vs/base/common/cancellation.ts +148 -0
- package/node_modules/@xterm/xterm/src/vs/base/common/charCode.ts +450 -0
- package/node_modules/@xterm/xterm/src/vs/base/common/collections.ts +140 -0
- package/node_modules/@xterm/xterm/src/vs/base/common/decorators.ts +130 -0
- package/node_modules/@xterm/xterm/src/vs/base/common/equals.ts +146 -0
- package/node_modules/@xterm/xterm/src/vs/base/common/errors.ts +303 -0
- package/node_modules/@xterm/xterm/src/vs/base/common/event.ts +1778 -0
- package/node_modules/@xterm/xterm/src/vs/base/common/functional.ts +32 -0
- package/node_modules/@xterm/xterm/src/vs/base/common/hash.ts +316 -0
- package/node_modules/@xterm/xterm/src/vs/base/common/iterator.ts +159 -0
- package/node_modules/@xterm/xterm/src/vs/base/common/keyCodes.ts +526 -0
- package/node_modules/@xterm/xterm/src/vs/base/common/keybindings.ts +284 -0
- package/node_modules/@xterm/xterm/src/vs/base/common/lazy.ts +47 -0
- package/node_modules/@xterm/xterm/src/vs/base/common/lifecycle.ts +801 -0
- package/node_modules/@xterm/xterm/src/vs/base/common/linkedList.ts +142 -0
- package/node_modules/@xterm/xterm/src/vs/base/common/map.ts +202 -0
- package/node_modules/@xterm/xterm/src/vs/base/common/numbers.ts +98 -0
- package/node_modules/@xterm/xterm/src/vs/base/common/observable.ts +76 -0
- package/node_modules/@xterm/xterm/src/vs/base/common/observableInternal/api.ts +31 -0
- package/node_modules/@xterm/xterm/src/vs/base/common/observableInternal/autorun.ts +281 -0
- package/node_modules/@xterm/xterm/src/vs/base/common/observableInternal/base.ts +489 -0
- package/node_modules/@xterm/xterm/src/vs/base/common/observableInternal/debugName.ts +145 -0
- package/node_modules/@xterm/xterm/src/vs/base/common/observableInternal/derived.ts +428 -0
- package/node_modules/@xterm/xterm/src/vs/base/common/observableInternal/lazyObservableValue.ts +146 -0
- package/node_modules/@xterm/xterm/src/vs/base/common/observableInternal/logging.ts +328 -0
- package/node_modules/@xterm/xterm/src/vs/base/common/observableInternal/promise.ts +209 -0
- package/node_modules/@xterm/xterm/src/vs/base/common/observableInternal/utils.ts +610 -0
- package/node_modules/@xterm/xterm/src/vs/base/common/platform.ts +281 -0
- package/node_modules/@xterm/xterm/src/vs/base/common/scrollable.ts +522 -0
- package/node_modules/@xterm/xterm/src/vs/base/common/sequence.ts +34 -0
- package/node_modules/@xterm/xterm/src/vs/base/common/stopwatch.ts +43 -0
- package/node_modules/@xterm/xterm/src/vs/base/common/strings.ts +557 -0
- package/node_modules/@xterm/xterm/src/vs/base/common/symbols.ts +9 -0
- package/node_modules/@xterm/xterm/src/vs/base/common/uint.ts +59 -0
- package/node_modules/@xterm/xterm/src/vs/patches/nls.ts +90 -0
- package/node_modules/@xterm/xterm/src/vs/typings/base-common.d.ts +20 -0
- package/node_modules/@xterm/xterm/src/vs/typings/require.d.ts +42 -0
- package/node_modules/@xterm/xterm/src/vs/typings/vscode-globals-nls.d.ts +36 -0
- package/node_modules/@xterm/xterm/src/vs/typings/vscode-globals-product.d.ts +33 -0
- package/node_modules/@xterm/xterm/typings/xterm.d.ts +1957 -0
- package/package.json +1 -1
- package/packages/daemon/src/api.js +122 -1
- package/packages/daemon/src/index.js +25 -7
- package/packages/daemon/src/mimetypes.js +43 -0
- package/packages/daemon/src/terminal-pty.js +129 -0
- package/packages/gui/dist/assets/{index-Gfb8Zxy9.css → index-BhjOFLBc.css} +32 -1
- package/packages/gui/dist/assets/index-DeXW9EFU.js +153 -0
- package/packages/gui/dist/index.html +2 -2
- package/packages/gui/package.json +3 -0
- package/packages/gui/src/components/EditorTabs.jsx +1 -1
- package/packages/gui/src/components/FileTree.jsx +308 -23
- package/packages/gui/src/components/MediaViewer.jsx +104 -0
- package/packages/gui/src/components/Terminal.jsx +154 -0
- package/packages/gui/src/stores/groove.js +131 -2
- package/packages/gui/src/views/FileEditor.jsx +104 -36
- package/node_modules/@groove-dev/gui/dist/assets/index-Dxg9hdf3.js +0 -103
- 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
|
+
}
|