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,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,6 @@
1
+ /**
2
+ * Copyright (c) 2017 The xterm.js authors. All rights reserved.
3
+ * @license MIT
4
+ */
5
+
6
+ export const INVERTED_DEFAULT_COLOR = 257;
@@ -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
+ }