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,167 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2023 The xterm.js authors. All rights reserved.
|
|
3
|
+
* @license MIT
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { IDisposable } from 'common/Types';
|
|
7
|
+
import { FontWeight } from 'common/services/Services';
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
export const enum WidthCacheSettings {
|
|
11
|
+
/** sentinel for unset values in flat cache */
|
|
12
|
+
FLAT_UNSET = -9999,
|
|
13
|
+
/** size of flat cache, size-1 equals highest codepoint handled by flat */
|
|
14
|
+
FLAT_SIZE = 256,
|
|
15
|
+
/** char repeat for measuring */
|
|
16
|
+
REPEAT = 32
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
const enum FontVariant {
|
|
21
|
+
REGULAR = 0,
|
|
22
|
+
BOLD = 1,
|
|
23
|
+
ITALIC = 2,
|
|
24
|
+
BOLD_ITALIC = 3
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
export class WidthCache implements IDisposable {
|
|
29
|
+
// flat cache for regular variant up to CacheSettings.FLAT_SIZE
|
|
30
|
+
// NOTE: ~4x faster access than holey (serving >>80% of terminal content)
|
|
31
|
+
// It has a small memory footprint (only 1MB for full BMP caching),
|
|
32
|
+
// still the sweet spot is not reached before touching 32k different codepoints,
|
|
33
|
+
// thus we store the remaining <<20% of terminal data in a holey structure.
|
|
34
|
+
protected _flat = new Float32Array(WidthCacheSettings.FLAT_SIZE);
|
|
35
|
+
|
|
36
|
+
// holey cache for bold, italic and bold&italic for any string
|
|
37
|
+
// FIXME: can grow really big over time (~8.5 MB for full BMP caching),
|
|
38
|
+
// so a shared API across terminals is needed
|
|
39
|
+
protected _holey: Map<string, number> | undefined;
|
|
40
|
+
|
|
41
|
+
private _font = '';
|
|
42
|
+
private _fontSize = 0;
|
|
43
|
+
private _weight: FontWeight = 'normal';
|
|
44
|
+
private _weightBold: FontWeight = 'bold';
|
|
45
|
+
private _container: HTMLDivElement;
|
|
46
|
+
private _measureElements: HTMLSpanElement[] = [];
|
|
47
|
+
|
|
48
|
+
constructor(_document: Document, _helperContainer: HTMLElement) {
|
|
49
|
+
this._container = _document.createElement('div');
|
|
50
|
+
this._container.classList.add('xterm-width-cache-measure-container');
|
|
51
|
+
this._container.setAttribute('aria-hidden', 'true');
|
|
52
|
+
// SP should stack in spans
|
|
53
|
+
this._container.style.whiteSpace = 'pre';
|
|
54
|
+
// avoid undercuts in non-monospace fonts from kerning
|
|
55
|
+
this._container.style.fontKerning = 'none';
|
|
56
|
+
|
|
57
|
+
const regular = _document.createElement('span');
|
|
58
|
+
regular.classList.add('xterm-char-measure-element');
|
|
59
|
+
|
|
60
|
+
const bold = _document.createElement('span');
|
|
61
|
+
bold.classList.add('xterm-char-measure-element');
|
|
62
|
+
bold.style.fontWeight = 'bold';
|
|
63
|
+
|
|
64
|
+
const italic = _document.createElement('span');
|
|
65
|
+
italic.classList.add('xterm-char-measure-element');
|
|
66
|
+
italic.style.fontStyle = 'italic';
|
|
67
|
+
|
|
68
|
+
const boldItalic = _document.createElement('span');
|
|
69
|
+
boldItalic.classList.add('xterm-char-measure-element');
|
|
70
|
+
boldItalic.style.fontWeight = 'bold';
|
|
71
|
+
boldItalic.style.fontStyle = 'italic';
|
|
72
|
+
|
|
73
|
+
// NOTE: must be in order of FontVariant
|
|
74
|
+
this._measureElements = [regular, bold, italic, boldItalic];
|
|
75
|
+
this._container.appendChild(regular);
|
|
76
|
+
this._container.appendChild(bold);
|
|
77
|
+
this._container.appendChild(italic);
|
|
78
|
+
this._container.appendChild(boldItalic);
|
|
79
|
+
|
|
80
|
+
_helperContainer.appendChild(this._container);
|
|
81
|
+
|
|
82
|
+
this.clear();
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
public dispose(): void {
|
|
86
|
+
this._container.remove(); // remove elements from DOM
|
|
87
|
+
this._measureElements.length = 0; // release element refs
|
|
88
|
+
this._holey = undefined; // free cache memory via GC
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
/**
|
|
92
|
+
* Clear the width cache.
|
|
93
|
+
*/
|
|
94
|
+
public clear(): void {
|
|
95
|
+
this._flat.fill(WidthCacheSettings.FLAT_UNSET);
|
|
96
|
+
// .clear() has some overhead, re-assign instead (>3 times faster)
|
|
97
|
+
this._holey = new Map<string, number>();
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
/**
|
|
101
|
+
* Set the font for measuring.
|
|
102
|
+
* Must be called for any changes on font settings.
|
|
103
|
+
* Also clears the cache.
|
|
104
|
+
*/
|
|
105
|
+
public setFont(font: string, fontSize: number, weight: FontWeight, weightBold: FontWeight): void {
|
|
106
|
+
// skip if nothing changed
|
|
107
|
+
if (font === this._font
|
|
108
|
+
&& fontSize === this._fontSize
|
|
109
|
+
&& weight === this._weight
|
|
110
|
+
&& weightBold === this._weightBold
|
|
111
|
+
) {
|
|
112
|
+
return;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
this._font = font;
|
|
116
|
+
this._fontSize = fontSize;
|
|
117
|
+
this._weight = weight;
|
|
118
|
+
this._weightBold = weightBold;
|
|
119
|
+
|
|
120
|
+
this._container.style.fontFamily = this._font;
|
|
121
|
+
this._container.style.fontSize = `${this._fontSize}px`;
|
|
122
|
+
this._measureElements[FontVariant.REGULAR].style.fontWeight = `${weight}`;
|
|
123
|
+
this._measureElements[FontVariant.BOLD].style.fontWeight = `${weightBold}`;
|
|
124
|
+
this._measureElements[FontVariant.ITALIC].style.fontWeight = `${weight}`;
|
|
125
|
+
this._measureElements[FontVariant.BOLD_ITALIC].style.fontWeight = `${weightBold}`;
|
|
126
|
+
|
|
127
|
+
this.clear();
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
/**
|
|
131
|
+
* Get the render width for cell content `c` with current font settings.
|
|
132
|
+
* `variant` denotes the font variant to be used.
|
|
133
|
+
*/
|
|
134
|
+
public get(c: string, bold: boolean | number, italic: boolean | number): number {
|
|
135
|
+
let cp = 0;
|
|
136
|
+
if (!bold && !italic && c.length === 1 && (cp = c.charCodeAt(0)) < WidthCacheSettings.FLAT_SIZE) {
|
|
137
|
+
if (this._flat[cp] !== WidthCacheSettings.FLAT_UNSET) {
|
|
138
|
+
return this._flat[cp];
|
|
139
|
+
}
|
|
140
|
+
const width = this._measure(c, 0);
|
|
141
|
+
if (width > 0) {
|
|
142
|
+
this._flat[cp] = width;
|
|
143
|
+
}
|
|
144
|
+
return width;
|
|
145
|
+
}
|
|
146
|
+
let key = c;
|
|
147
|
+
if (bold) key += 'B';
|
|
148
|
+
if (italic) key += 'I';
|
|
149
|
+
let width = this._holey!.get(key);
|
|
150
|
+
if (width === undefined) {
|
|
151
|
+
let variant = 0;
|
|
152
|
+
if (bold) variant |= FontVariant.BOLD;
|
|
153
|
+
if (italic) variant |= FontVariant.ITALIC;
|
|
154
|
+
width = this._measure(c, variant);
|
|
155
|
+
if (width > 0) {
|
|
156
|
+
this._holey!.set(key, width);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
return width;
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
protected _measure(c: string, variant: FontVariant): number {
|
|
163
|
+
const el = this._measureElements[variant];
|
|
164
|
+
el.textContent = c.repeat(WidthCacheSettings.REPEAT);
|
|
165
|
+
return el.offsetWidth / WidthCacheSettings.REPEAT;
|
|
166
|
+
}
|
|
167
|
+
}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2019 The xterm.js authors. All rights reserved.
|
|
3
|
+
* @license MIT
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { IDimensions, IRenderDimensions } from 'browser/renderer/shared/Types';
|
|
7
|
+
|
|
8
|
+
export function throwIfFalsy<T>(value: T | undefined | null): T {
|
|
9
|
+
if (!value) {
|
|
10
|
+
throw new Error('value must not be falsy');
|
|
11
|
+
}
|
|
12
|
+
return value;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export function isPowerlineGlyph(codepoint: number): boolean {
|
|
16
|
+
// Only return true for Powerline symbols which require
|
|
17
|
+
// different padding and should be excluded from minimum contrast
|
|
18
|
+
// ratio standards
|
|
19
|
+
return 0xE0A4 <= codepoint && codepoint <= 0xE0D6;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export function isRestrictedPowerlineGlyph(codepoint: number): boolean {
|
|
23
|
+
return 0xE0B0 <= codepoint && codepoint <= 0xE0B7;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
function isNerdFontGlyph(codepoint: number): boolean {
|
|
27
|
+
return 0xE000 <= codepoint && codepoint <= 0xF8FF;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
function isBoxOrBlockGlyph(codepoint: number): boolean {
|
|
31
|
+
return 0x2500 <= codepoint && codepoint <= 0x259F;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
export function isEmoji(codepoint: number): boolean {
|
|
35
|
+
return (
|
|
36
|
+
codepoint >= 0x1F600 && codepoint <= 0x1F64F || // Emoticons
|
|
37
|
+
codepoint >= 0x1F300 && codepoint <= 0x1F5FF || // Misc Symbols and Pictographs
|
|
38
|
+
codepoint >= 0x1F680 && codepoint <= 0x1F6FF || // Transport and Map
|
|
39
|
+
codepoint >= 0x2600 && codepoint <= 0x26FF || // Misc symbols
|
|
40
|
+
codepoint >= 0x2700 && codepoint <= 0x27BF || // Dingbats
|
|
41
|
+
codepoint >= 0xFE00 && codepoint <= 0xFE0F || // Variation Selectors
|
|
42
|
+
codepoint >= 0x1F900 && codepoint <= 0x1F9FF || // Supplemental Symbols and Pictographs
|
|
43
|
+
codepoint >= 0x1F1E6 && codepoint <= 0x1F1FF
|
|
44
|
+
);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
export function allowRescaling(codepoint: number | undefined, width: number, glyphSizeX: number, deviceCellWidth: number): boolean {
|
|
48
|
+
return (
|
|
49
|
+
// Is single cell width
|
|
50
|
+
width === 1 &&
|
|
51
|
+
// Glyph exceeds cell bounds, add 50% to avoid hurting readability by rescaling glyphs that
|
|
52
|
+
// barely overlap
|
|
53
|
+
glyphSizeX > Math.ceil(deviceCellWidth * 1.5) &&
|
|
54
|
+
// Never rescale ascii
|
|
55
|
+
codepoint !== undefined && codepoint > 0xFF &&
|
|
56
|
+
// Never rescale emoji
|
|
57
|
+
!isEmoji(codepoint) &&
|
|
58
|
+
// Never rescale powerline or nerd fonts
|
|
59
|
+
!isPowerlineGlyph(codepoint) && !isNerdFontGlyph(codepoint)
|
|
60
|
+
);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
export function treatGlyphAsBackgroundColor(codepoint: number): boolean {
|
|
64
|
+
return isPowerlineGlyph(codepoint) || isBoxOrBlockGlyph(codepoint);
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
export function createRenderDimensions(): IRenderDimensions {
|
|
68
|
+
return {
|
|
69
|
+
css: {
|
|
70
|
+
canvas: createDimension(),
|
|
71
|
+
cell: createDimension()
|
|
72
|
+
},
|
|
73
|
+
device: {
|
|
74
|
+
canvas: createDimension(),
|
|
75
|
+
cell: createDimension(),
|
|
76
|
+
char: {
|
|
77
|
+
width: 0,
|
|
78
|
+
height: 0,
|
|
79
|
+
left: 0,
|
|
80
|
+
top: 0
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
function createDimension(): IDimensions {
|
|
87
|
+
return {
|
|
88
|
+
width: 0,
|
|
89
|
+
height: 0
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
export function computeNextVariantOffset(cellWidth: number, lineWidth: number, currentOffset: number = 0): number {
|
|
94
|
+
return (cellWidth - (Math.round(lineWidth) * 2 - currentOffset)) % (Math.round(lineWidth) * 2);
|
|
95
|
+
}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2022 The xterm.js authors. All rights reserved.
|
|
3
|
+
* @license MIT
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { ITerminal } from 'browser/Types';
|
|
7
|
+
import { ISelectionRenderModel } from 'browser/renderer/shared/Types';
|
|
8
|
+
import { Terminal } from '@xterm/xterm';
|
|
9
|
+
|
|
10
|
+
class SelectionRenderModel implements ISelectionRenderModel {
|
|
11
|
+
public hasSelection!: boolean;
|
|
12
|
+
public columnSelectMode!: boolean;
|
|
13
|
+
public viewportStartRow!: number;
|
|
14
|
+
public viewportEndRow!: number;
|
|
15
|
+
public viewportCappedStartRow!: number;
|
|
16
|
+
public viewportCappedEndRow!: number;
|
|
17
|
+
public startCol!: number;
|
|
18
|
+
public endCol!: number;
|
|
19
|
+
public selectionStart: [number, number] | undefined;
|
|
20
|
+
public selectionEnd: [number, number] | undefined;
|
|
21
|
+
|
|
22
|
+
constructor() {
|
|
23
|
+
this.clear();
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
public clear(): void {
|
|
27
|
+
this.hasSelection = false;
|
|
28
|
+
this.columnSelectMode = false;
|
|
29
|
+
this.viewportStartRow = 0;
|
|
30
|
+
this.viewportEndRow = 0;
|
|
31
|
+
this.viewportCappedStartRow = 0;
|
|
32
|
+
this.viewportCappedEndRow = 0;
|
|
33
|
+
this.startCol = 0;
|
|
34
|
+
this.endCol = 0;
|
|
35
|
+
this.selectionStart = undefined;
|
|
36
|
+
this.selectionEnd = undefined;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
public update(terminal: ITerminal, start: [number, number] | undefined, end: [number, number] | undefined, columnSelectMode: boolean = false): void {
|
|
40
|
+
this.selectionStart = start;
|
|
41
|
+
this.selectionEnd = end;
|
|
42
|
+
// Selection does not exist
|
|
43
|
+
if (!start || !end || (start[0] === end[0] && start[1] === end[1])) {
|
|
44
|
+
this.clear();
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
// Translate from buffer position to viewport position
|
|
49
|
+
const viewportY = terminal.buffers.active.ydisp;
|
|
50
|
+
const viewportStartRow = start[1] - viewportY;
|
|
51
|
+
const viewportEndRow = end[1] - viewportY;
|
|
52
|
+
const viewportCappedStartRow = Math.max(viewportStartRow, 0);
|
|
53
|
+
const viewportCappedEndRow = Math.min(viewportEndRow, terminal.rows - 1);
|
|
54
|
+
|
|
55
|
+
// No need to draw the selection
|
|
56
|
+
if (viewportCappedStartRow >= terminal.rows || viewportCappedEndRow < 0) {
|
|
57
|
+
this.clear();
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
this.hasSelection = true;
|
|
62
|
+
this.columnSelectMode = columnSelectMode;
|
|
63
|
+
this.viewportStartRow = viewportStartRow;
|
|
64
|
+
this.viewportEndRow = viewportEndRow;
|
|
65
|
+
this.viewportCappedStartRow = viewportCappedStartRow;
|
|
66
|
+
this.viewportCappedEndRow = viewportCappedEndRow;
|
|
67
|
+
this.startCol = start[0];
|
|
68
|
+
this.endCol = end[0];
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
public isCellSelected(terminal: Terminal, x: number, y: number): boolean {
|
|
72
|
+
if (!this.hasSelection) {
|
|
73
|
+
return false;
|
|
74
|
+
}
|
|
75
|
+
y -= terminal.buffer.active.viewportY;
|
|
76
|
+
if (this.columnSelectMode) {
|
|
77
|
+
if (this.startCol <= this.endCol) {
|
|
78
|
+
return x >= this.startCol && y >= this.viewportCappedStartRow &&
|
|
79
|
+
x < this.endCol && y <= this.viewportCappedEndRow;
|
|
80
|
+
}
|
|
81
|
+
return x < this.startCol && y >= this.viewportCappedStartRow &&
|
|
82
|
+
x >= this.endCol && y <= this.viewportCappedEndRow;
|
|
83
|
+
}
|
|
84
|
+
return (y > this.viewportStartRow && y < this.viewportEndRow) ||
|
|
85
|
+
(this.viewportStartRow === this.viewportEndRow && y === this.viewportStartRow && x >= this.startCol && x < this.endCol) ||
|
|
86
|
+
(this.viewportStartRow < this.viewportEndRow && y === this.viewportEndRow && x < this.endCol) ||
|
|
87
|
+
(this.viewportStartRow < this.viewportEndRow && y === this.viewportStartRow && x >= this.startCol);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
export function createSelectionRenderModel(): ISelectionRenderModel {
|
|
92
|
+
return new SelectionRenderModel();
|
|
93
|
+
}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2017 The xterm.js authors. All rights reserved.
|
|
3
|
+
* @license MIT
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { Terminal } from '@xterm/xterm';
|
|
7
|
+
import { ITerminal } from 'browser/Types';
|
|
8
|
+
import { IDisposable } from 'common/Types';
|
|
9
|
+
import type { Event } from 'vs/base/common/event';
|
|
10
|
+
|
|
11
|
+
export interface IDimensions {
|
|
12
|
+
width: number;
|
|
13
|
+
height: number;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export interface IOffset {
|
|
17
|
+
top: number;
|
|
18
|
+
left: number;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export interface IRenderDimensions {
|
|
22
|
+
/**
|
|
23
|
+
* Dimensions measured in CSS pixels (ie. device pixels / device pixel ratio).
|
|
24
|
+
*/
|
|
25
|
+
css: {
|
|
26
|
+
canvas: IDimensions;
|
|
27
|
+
cell: IDimensions;
|
|
28
|
+
};
|
|
29
|
+
/**
|
|
30
|
+
* Dimensions measured in actual pixels as rendered to the device.
|
|
31
|
+
*/
|
|
32
|
+
device: {
|
|
33
|
+
canvas: IDimensions;
|
|
34
|
+
cell: IDimensions;
|
|
35
|
+
char: IDimensions & IOffset;
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export interface IRequestRedrawEvent {
|
|
40
|
+
start: number;
|
|
41
|
+
end: number;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Note that IRenderer implementations should emit the refresh event after
|
|
46
|
+
* rendering rows to the screen.
|
|
47
|
+
*/
|
|
48
|
+
export interface IRenderer extends IDisposable {
|
|
49
|
+
readonly dimensions: IRenderDimensions;
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Fires when the renderer is requesting to be redrawn on the next animation
|
|
53
|
+
* frame but is _not_ a result of content changing (eg. selection changes).
|
|
54
|
+
*/
|
|
55
|
+
readonly onRequestRedraw: Event<IRequestRedrawEvent>;
|
|
56
|
+
|
|
57
|
+
dispose(): void;
|
|
58
|
+
handleDevicePixelRatioChange(): void;
|
|
59
|
+
handleResize(cols: number, rows: number): void;
|
|
60
|
+
handleCharSizeChanged(): void;
|
|
61
|
+
handleBlur(): void;
|
|
62
|
+
handleFocus(): void;
|
|
63
|
+
handleSelectionChanged(start: [number, number] | undefined, end: [number, number] | undefined, columnSelectMode: boolean): void;
|
|
64
|
+
handleCursorMove(): void;
|
|
65
|
+
clear(): void;
|
|
66
|
+
renderRows(start: number, end: number): void;
|
|
67
|
+
clearTextureAtlas?(): void;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
export interface ISelectionRenderModel {
|
|
71
|
+
readonly hasSelection: boolean;
|
|
72
|
+
readonly columnSelectMode: boolean;
|
|
73
|
+
readonly viewportStartRow: number;
|
|
74
|
+
readonly viewportEndRow: number;
|
|
75
|
+
readonly viewportCappedStartRow: number;
|
|
76
|
+
readonly viewportCappedEndRow: number;
|
|
77
|
+
readonly startCol: number;
|
|
78
|
+
readonly endCol: number;
|
|
79
|
+
readonly selectionStart: [number, number] | undefined;
|
|
80
|
+
readonly selectionEnd: [number, number] | undefined;
|
|
81
|
+
clear(): void;
|
|
82
|
+
update(terminal: ITerminal, start: [number, number] | undefined, end: [number, number] | undefined, columnSelectMode?: boolean): void;
|
|
83
|
+
isCellSelected(terminal: Terminal, x: number, y: number): boolean;
|
|
84
|
+
}
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2017 The xterm.js authors. All rights reserved.
|
|
3
|
+
* @license MIT
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { IBufferService } from 'common/services/Services';
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Represents a selection within the buffer. This model only cares about column
|
|
10
|
+
* and row coordinates, not wide characters.
|
|
11
|
+
*/
|
|
12
|
+
export class SelectionModel {
|
|
13
|
+
/**
|
|
14
|
+
* Whether select all is currently active.
|
|
15
|
+
*/
|
|
16
|
+
public isSelectAllActive: boolean = false;
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* The minimal length of the selection from the start position. When double
|
|
20
|
+
* clicking on a word, the word will be selected which makes the selection
|
|
21
|
+
* start at the start of the word and makes this variable the length.
|
|
22
|
+
*/
|
|
23
|
+
public selectionStartLength: number = 0;
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* The [x, y] position the selection starts at.
|
|
27
|
+
*/
|
|
28
|
+
public selectionStart: [number, number] | undefined;
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* The [x, y] position the selection ends at.
|
|
32
|
+
*/
|
|
33
|
+
public selectionEnd: [number, number] | undefined;
|
|
34
|
+
|
|
35
|
+
constructor(
|
|
36
|
+
private _bufferService: IBufferService
|
|
37
|
+
) {
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Clears the current selection.
|
|
42
|
+
*/
|
|
43
|
+
public clearSelection(): void {
|
|
44
|
+
this.selectionStart = undefined;
|
|
45
|
+
this.selectionEnd = undefined;
|
|
46
|
+
this.isSelectAllActive = false;
|
|
47
|
+
this.selectionStartLength = 0;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* The final selection start, taking into consideration select all.
|
|
52
|
+
*/
|
|
53
|
+
public get finalSelectionStart(): [number, number] | undefined {
|
|
54
|
+
if (this.isSelectAllActive) {
|
|
55
|
+
return [0, 0];
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
if (!this.selectionEnd || !this.selectionStart) {
|
|
59
|
+
return this.selectionStart;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
return this.areSelectionValuesReversed() ? this.selectionEnd : this.selectionStart;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* The final selection end, taking into consideration select all, double click
|
|
67
|
+
* word selection and triple click line selection.
|
|
68
|
+
*/
|
|
69
|
+
public get finalSelectionEnd(): [number, number] | undefined {
|
|
70
|
+
if (this.isSelectAllActive) {
|
|
71
|
+
return [this._bufferService.cols, this._bufferService.buffer.ybase + this._bufferService.rows - 1];
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
if (!this.selectionStart) {
|
|
75
|
+
return undefined;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
// Use the selection start + length if the end doesn't exist or they're reversed
|
|
79
|
+
if (!this.selectionEnd || this.areSelectionValuesReversed()) {
|
|
80
|
+
const startPlusLength = this.selectionStart[0] + this.selectionStartLength;
|
|
81
|
+
if (startPlusLength > this._bufferService.cols) {
|
|
82
|
+
// Ensure the trailing EOL isn't included when the selection ends on the right edge
|
|
83
|
+
if (startPlusLength % this._bufferService.cols === 0) {
|
|
84
|
+
return [this._bufferService.cols, this.selectionStart[1] + Math.floor(startPlusLength / this._bufferService.cols) - 1];
|
|
85
|
+
}
|
|
86
|
+
return [startPlusLength % this._bufferService.cols, this.selectionStart[1] + Math.floor(startPlusLength / this._bufferService.cols)];
|
|
87
|
+
}
|
|
88
|
+
return [startPlusLength, this.selectionStart[1]];
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
// Ensure the the word/line is selected after a double/triple click
|
|
92
|
+
if (this.selectionStartLength) {
|
|
93
|
+
// Select the larger of the two when start and end are on the same line
|
|
94
|
+
if (this.selectionEnd[1] === this.selectionStart[1]) {
|
|
95
|
+
// Keep the whole wrapped word/line selected if the content wraps multiple lines
|
|
96
|
+
const startPlusLength = this.selectionStart[0] + this.selectionStartLength;
|
|
97
|
+
if (startPlusLength > this._bufferService.cols) {
|
|
98
|
+
return [startPlusLength % this._bufferService.cols, this.selectionStart[1] + Math.floor(startPlusLength / this._bufferService.cols)];
|
|
99
|
+
}
|
|
100
|
+
return [Math.max(startPlusLength, this.selectionEnd[0]), this.selectionEnd[1]];
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
return this.selectionEnd;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
/**
|
|
107
|
+
* Returns whether the selection start and end are reversed.
|
|
108
|
+
*/
|
|
109
|
+
public areSelectionValuesReversed(): boolean {
|
|
110
|
+
const start = this.selectionStart;
|
|
111
|
+
const end = this.selectionEnd;
|
|
112
|
+
if (!start || !end) {
|
|
113
|
+
return false;
|
|
114
|
+
}
|
|
115
|
+
return start[1] > end[1] || (start[1] === end[1] && start[0] > end[0]);
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
/**
|
|
119
|
+
* Handle the buffer being trimmed, adjust the selection position.
|
|
120
|
+
* @param amount The amount the buffer is being trimmed.
|
|
121
|
+
* @returns Whether a refresh is necessary.
|
|
122
|
+
*/
|
|
123
|
+
public handleTrim(amount: number): boolean {
|
|
124
|
+
// Adjust the selection position based on the trimmed amount.
|
|
125
|
+
if (this.selectionStart) {
|
|
126
|
+
this.selectionStart[1] -= amount;
|
|
127
|
+
}
|
|
128
|
+
if (this.selectionEnd) {
|
|
129
|
+
this.selectionEnd[1] -= amount;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
// The selection has moved off the buffer, clear it.
|
|
133
|
+
if (this.selectionEnd && this.selectionEnd[1] < 0) {
|
|
134
|
+
this.clearSelection();
|
|
135
|
+
return true;
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
// If the selection start is trimmed, ensure the start column is 0.
|
|
139
|
+
if (this.selectionStart && this.selectionStart[1] < 0) {
|
|
140
|
+
this.selectionStart[1] = 0;
|
|
141
|
+
}
|
|
142
|
+
return false;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2017 The xterm.js authors. All rights reserved.
|
|
3
|
+
* @license MIT
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
export interface ISelectionRedrawRequestEvent {
|
|
7
|
+
start: [number, number] | undefined;
|
|
8
|
+
end: [number, number] | undefined;
|
|
9
|
+
columnSelectMode: boolean;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export interface ISelectionRequestScrollLinesEvent {
|
|
13
|
+
amount: number;
|
|
14
|
+
suppressScrollEvent: boolean;
|
|
15
|
+
}
|