@wendongfly/myhi 1.0.2 → 1.0.3
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/dist/index.js +1 -1
- package/dist/lib/xterm/LICENSE +21 -0
- package/dist/lib/xterm/README.md +225 -0
- package/dist/lib/xterm/css/xterm.css +190 -0
- package/dist/lib/xterm/lib/xterm.js +2 -0
- package/dist/lib/xterm/lib/xterm.js.map +1 -0
- package/dist/lib/xterm/package.json +90 -0
- package/dist/lib/xterm/src/browser/AccessibilityManager.ts +301 -0
- package/dist/lib/xterm/src/browser/Clipboard.ts +99 -0
- package/dist/lib/xterm/src/browser/ColorContrastCache.ts +39 -0
- package/dist/lib/xterm/src/browser/ColorManager.ts +268 -0
- package/dist/lib/xterm/src/browser/Dom.ts +10 -0
- package/dist/lib/xterm/src/browser/Lifecycle.ts +30 -0
- package/dist/lib/xterm/src/browser/Linkifier.ts +356 -0
- package/dist/lib/xterm/src/browser/Linkifier2.ts +397 -0
- package/dist/lib/xterm/src/browser/LocalizableStrings.ts +10 -0
- package/dist/lib/xterm/src/browser/MouseZoneManager.ts +236 -0
- package/dist/lib/xterm/src/browser/RenderDebouncer.ts +82 -0
- package/dist/lib/xterm/src/browser/ScreenDprMonitor.ts +69 -0
- package/dist/lib/xterm/src/browser/Terminal.ts +1447 -0
- package/dist/lib/xterm/src/browser/TimeBasedDebouncer.ts +86 -0
- package/dist/lib/xterm/src/browser/Types.d.ts +317 -0
- package/dist/lib/xterm/src/browser/Viewport.ts +276 -0
- package/dist/lib/xterm/src/browser/decorations/BufferDecorationRenderer.ts +131 -0
- package/dist/lib/xterm/src/browser/decorations/ColorZoneStore.ts +117 -0
- package/dist/lib/xterm/src/browser/decorations/OverviewRulerRenderer.ts +228 -0
- package/dist/lib/xterm/src/browser/input/CompositionHelper.ts +237 -0
- package/dist/lib/xterm/src/browser/input/Mouse.ts +64 -0
- package/dist/lib/xterm/src/browser/input/MoveToCell.ts +249 -0
- package/dist/lib/xterm/src/browser/public/Terminal.ts +298 -0
- package/dist/lib/xterm/src/browser/renderer/BaseRenderLayer.ts +582 -0
- package/dist/lib/xterm/src/browser/renderer/CursorRenderLayer.ts +378 -0
- package/dist/lib/xterm/src/browser/renderer/CustomGlyphs.ts +632 -0
- package/dist/lib/xterm/src/browser/renderer/GridCache.ts +33 -0
- package/dist/lib/xterm/src/browser/renderer/LinkRenderLayer.ts +84 -0
- package/dist/lib/xterm/src/browser/renderer/Renderer.ts +219 -0
- package/dist/lib/xterm/src/browser/renderer/RendererUtils.ts +26 -0
- package/dist/lib/xterm/src/browser/renderer/SelectionRenderLayer.ts +131 -0
- package/dist/lib/xterm/src/browser/renderer/TextRenderLayer.ts +344 -0
- package/dist/lib/xterm/src/browser/renderer/Types.d.ts +109 -0
- package/dist/lib/xterm/src/browser/renderer/atlas/BaseCharAtlas.ts +58 -0
- package/dist/lib/xterm/src/browser/renderer/atlas/CharAtlasCache.ts +95 -0
- package/dist/lib/xterm/src/browser/renderer/atlas/CharAtlasUtils.ts +54 -0
- package/dist/lib/xterm/src/browser/renderer/atlas/Constants.ts +15 -0
- package/dist/lib/xterm/src/browser/renderer/atlas/DynamicCharAtlas.ts +404 -0
- package/dist/lib/xterm/src/browser/renderer/atlas/LRUMap.ts +136 -0
- package/dist/lib/xterm/src/browser/renderer/atlas/Types.d.ts +29 -0
- package/dist/lib/xterm/src/browser/renderer/dom/DomRenderer.ts +403 -0
- package/dist/lib/xterm/src/browser/renderer/dom/DomRendererRowFactory.ts +344 -0
- package/dist/lib/xterm/src/browser/selection/SelectionModel.ts +144 -0
- package/dist/lib/xterm/src/browser/selection/Types.d.ts +15 -0
- package/dist/lib/xterm/src/browser/services/CharSizeService.ts +87 -0
- package/dist/lib/xterm/src/browser/services/CharacterJoinerService.ts +339 -0
- package/dist/lib/xterm/src/browser/services/CoreBrowserService.ts +20 -0
- package/dist/lib/xterm/src/browser/services/MouseService.ts +36 -0
- package/dist/lib/xterm/src/browser/services/RenderService.ts +237 -0
- package/dist/lib/xterm/src/browser/services/SelectionService.ts +1027 -0
- package/dist/lib/xterm/src/browser/services/Services.ts +123 -0
- package/dist/lib/xterm/src/browser/services/SoundService.ts +63 -0
- package/dist/lib/xterm/src/common/CircularList.ts +239 -0
- package/dist/lib/xterm/src/common/Clone.ts +23 -0
- package/dist/lib/xterm/src/common/Color.ts +285 -0
- package/dist/lib/xterm/src/common/CoreTerminal.ts +300 -0
- package/dist/lib/xterm/src/common/EventEmitter.ts +69 -0
- package/dist/lib/xterm/src/common/InputHandler.ts +3230 -0
- package/dist/lib/xterm/src/common/Lifecycle.ts +68 -0
- package/dist/lib/xterm/src/common/Platform.ts +31 -0
- package/dist/lib/xterm/src/common/SortedList.ts +88 -0
- package/dist/lib/xterm/src/common/TypedArrayUtils.ts +50 -0
- package/dist/lib/xterm/src/common/Types.d.ts +489 -0
- package/dist/lib/xterm/src/common/WindowsMode.ts +27 -0
- package/dist/lib/xterm/src/common/buffer/AttributeData.ts +148 -0
- package/dist/lib/xterm/src/common/buffer/Buffer.ts +711 -0
- package/dist/lib/xterm/src/common/buffer/BufferLine.ts +441 -0
- package/dist/lib/xterm/src/common/buffer/BufferRange.ts +13 -0
- package/dist/lib/xterm/src/common/buffer/BufferReflow.ts +220 -0
- package/dist/lib/xterm/src/common/buffer/BufferSet.ts +131 -0
- package/dist/lib/xterm/src/common/buffer/CellData.ts +94 -0
- package/dist/lib/xterm/src/common/buffer/Constants.ts +139 -0
- package/dist/lib/xterm/src/common/buffer/Marker.ts +37 -0
- package/dist/lib/xterm/src/common/buffer/Types.d.ts +64 -0
- package/dist/lib/xterm/src/common/data/Charsets.ts +256 -0
- package/dist/lib/xterm/src/common/data/EscapeSequences.ts +153 -0
- package/dist/lib/xterm/src/common/input/Keyboard.ts +398 -0
- package/dist/lib/xterm/src/common/input/TextDecoder.ts +346 -0
- package/dist/lib/xterm/src/common/input/UnicodeV6.ts +133 -0
- package/dist/lib/xterm/src/common/input/WriteBuffer.ts +229 -0
- package/dist/lib/xterm/src/common/input/XParseColor.ts +80 -0
- package/dist/lib/xterm/src/common/parser/Constants.ts +58 -0
- package/dist/lib/xterm/src/common/parser/DcsParser.ts +192 -0
- package/dist/lib/xterm/src/common/parser/EscapeSequenceParser.ts +796 -0
- package/dist/lib/xterm/src/common/parser/OscParser.ts +238 -0
- package/dist/lib/xterm/src/common/parser/Params.ts +229 -0
- package/dist/lib/xterm/src/common/parser/Types.d.ts +274 -0
- package/dist/lib/xterm/src/common/public/AddonManager.ts +56 -0
- package/dist/lib/xterm/src/common/public/BufferApiView.ts +35 -0
- package/dist/lib/xterm/src/common/public/BufferLineApiView.ts +29 -0
- package/dist/lib/xterm/src/common/public/BufferNamespaceApi.ts +33 -0
- package/dist/lib/xterm/src/common/public/ParserApi.ts +37 -0
- package/dist/lib/xterm/src/common/public/UnicodeApi.ts +27 -0
- package/dist/lib/xterm/src/common/services/BufferService.ts +185 -0
- package/dist/lib/xterm/src/common/services/CharsetService.ts +34 -0
- package/dist/lib/xterm/src/common/services/CoreMouseService.ts +309 -0
- package/dist/lib/xterm/src/common/services/CoreService.ts +92 -0
- package/dist/lib/xterm/src/common/services/DecorationService.ts +139 -0
- package/dist/lib/xterm/src/common/services/DirtyRowService.ts +53 -0
- package/dist/lib/xterm/src/common/services/InstantiationService.ts +83 -0
- package/dist/lib/xterm/src/common/services/LogService.ts +88 -0
- package/dist/lib/xterm/src/common/services/OptionsService.ts +178 -0
- package/dist/lib/xterm/src/common/services/ServiceRegistry.ts +49 -0
- package/dist/lib/xterm/src/common/services/Services.ts +323 -0
- package/dist/lib/xterm/src/common/services/UnicodeService.ts +82 -0
- package/dist/lib/xterm/src/headless/Terminal.ts +170 -0
- package/dist/lib/xterm/src/headless/Types.d.ts +31 -0
- package/dist/lib/xterm/src/headless/public/Terminal.ts +216 -0
- package/dist/lib/xterm/typings/xterm.d.ts +1872 -0
- package/dist/lib/xterm-fit/LICENSE +19 -0
- package/dist/lib/xterm-fit/README.md +24 -0
- package/dist/lib/xterm-fit/lib/xterm-addon-fit.js +2 -0
- package/dist/lib/xterm-fit/lib/xterm-addon-fit.js.map +1 -0
- package/dist/lib/xterm-fit/out/FitAddon.js +58 -0
- package/dist/lib/xterm-fit/out/FitAddon.js.map +1 -0
- package/dist/lib/xterm-fit/out-test/FitAddon.api.js.map +1 -0
- package/dist/lib/xterm-fit/package.json +21 -0
- package/dist/lib/xterm-fit/src/FitAddon.ts +86 -0
- package/dist/lib/xterm-fit/typings/xterm-addon-fit.d.ts +55 -0
- package/dist/lib/xterm-links/LICENSE +19 -0
- package/dist/lib/xterm-links/README.md +21 -0
- package/dist/lib/xterm-links/lib/xterm-addon-web-links.js +2 -0
- package/dist/lib/xterm-links/lib/xterm-addon-web-links.js.map +1 -0
- package/dist/lib/xterm-links/package.json +26 -0
- package/dist/lib/xterm-links/src/WebLinkProvider.ts +145 -0
- package/dist/lib/xterm-links/src/WebLinksAddon.ts +77 -0
- package/dist/lib/xterm-links/typings/xterm-addon-web-links.d.ts +58 -0
- package/package.json +1 -1
|
@@ -0,0 +1,403 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2018 The xterm.js authors. All rights reserved.
|
|
3
|
+
* @license MIT
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { IRenderer, IRenderDimensions, IRequestRedrawEvent } from 'browser/renderer/Types';
|
|
7
|
+
import { BOLD_CLASS, ITALIC_CLASS, CURSOR_CLASS, CURSOR_STYLE_BLOCK_CLASS, CURSOR_BLINK_CLASS, CURSOR_STYLE_BAR_CLASS, CURSOR_STYLE_UNDERLINE_CLASS, DomRendererRowFactory } from 'browser/renderer/dom/DomRendererRowFactory';
|
|
8
|
+
import { INVERTED_DEFAULT_COLOR } from 'browser/renderer/atlas/Constants';
|
|
9
|
+
import { Disposable } from 'common/Lifecycle';
|
|
10
|
+
import { IColorSet, ILinkifierEvent, ILinkifier, ILinkifier2 } from 'browser/Types';
|
|
11
|
+
import { ICharSizeService } from 'browser/services/Services';
|
|
12
|
+
import { IOptionsService, IBufferService, IInstantiationService, IDecorationService } from 'common/services/Services';
|
|
13
|
+
import { EventEmitter, IEvent } from 'common/EventEmitter';
|
|
14
|
+
import { color } from 'common/Color';
|
|
15
|
+
import { removeElementFromParent } from 'browser/Dom';
|
|
16
|
+
|
|
17
|
+
const TERMINAL_CLASS_PREFIX = 'xterm-dom-renderer-owner-';
|
|
18
|
+
const ROW_CONTAINER_CLASS = 'xterm-rows';
|
|
19
|
+
const FG_CLASS_PREFIX = 'xterm-fg-';
|
|
20
|
+
const BG_CLASS_PREFIX = 'xterm-bg-';
|
|
21
|
+
const FOCUS_CLASS = 'xterm-focus';
|
|
22
|
+
const SELECTION_CLASS = 'xterm-selection';
|
|
23
|
+
|
|
24
|
+
let nextTerminalId = 1;
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* A fallback renderer for when canvas is slow. This is not meant to be
|
|
28
|
+
* particularly fast or feature complete, more just stable and usable for when
|
|
29
|
+
* canvas is not an option.
|
|
30
|
+
*/
|
|
31
|
+
export class DomRenderer extends Disposable implements IRenderer {
|
|
32
|
+
private _rowFactory: DomRendererRowFactory;
|
|
33
|
+
private _terminalClass: number = nextTerminalId++;
|
|
34
|
+
|
|
35
|
+
private _themeStyleElement!: HTMLStyleElement;
|
|
36
|
+
private _dimensionsStyleElement!: HTMLStyleElement;
|
|
37
|
+
private _rowContainer: HTMLElement;
|
|
38
|
+
private _rowElements: HTMLElement[] = [];
|
|
39
|
+
private _selectionContainer: HTMLElement;
|
|
40
|
+
|
|
41
|
+
public dimensions: IRenderDimensions;
|
|
42
|
+
|
|
43
|
+
public get onRequestRedraw(): IEvent<IRequestRedrawEvent> { return new EventEmitter<IRequestRedrawEvent>().event; }
|
|
44
|
+
|
|
45
|
+
constructor(
|
|
46
|
+
private _colors: IColorSet,
|
|
47
|
+
private readonly _element: HTMLElement,
|
|
48
|
+
private readonly _screenElement: HTMLElement,
|
|
49
|
+
private readonly _viewportElement: HTMLElement,
|
|
50
|
+
private readonly _linkifier: ILinkifier,
|
|
51
|
+
private readonly _linkifier2: ILinkifier2,
|
|
52
|
+
@IInstantiationService instantiationService: IInstantiationService,
|
|
53
|
+
@ICharSizeService private readonly _charSizeService: ICharSizeService,
|
|
54
|
+
@IOptionsService private readonly _optionsService: IOptionsService,
|
|
55
|
+
@IBufferService private readonly _bufferService: IBufferService
|
|
56
|
+
) {
|
|
57
|
+
super();
|
|
58
|
+
this._rowContainer = document.createElement('div');
|
|
59
|
+
this._rowContainer.classList.add(ROW_CONTAINER_CLASS);
|
|
60
|
+
this._rowContainer.style.lineHeight = 'normal';
|
|
61
|
+
this._rowContainer.setAttribute('aria-hidden', 'true');
|
|
62
|
+
this._refreshRowElements(this._bufferService.cols, this._bufferService.rows);
|
|
63
|
+
this._selectionContainer = document.createElement('div');
|
|
64
|
+
this._selectionContainer.classList.add(SELECTION_CLASS);
|
|
65
|
+
this._selectionContainer.setAttribute('aria-hidden', 'true');
|
|
66
|
+
|
|
67
|
+
this.dimensions = {
|
|
68
|
+
scaledCharWidth: 0,
|
|
69
|
+
scaledCharHeight: 0,
|
|
70
|
+
scaledCellWidth: 0,
|
|
71
|
+
scaledCellHeight: 0,
|
|
72
|
+
scaledCharLeft: 0,
|
|
73
|
+
scaledCharTop: 0,
|
|
74
|
+
scaledCanvasWidth: 0,
|
|
75
|
+
scaledCanvasHeight: 0,
|
|
76
|
+
canvasWidth: 0,
|
|
77
|
+
canvasHeight: 0,
|
|
78
|
+
actualCellWidth: 0,
|
|
79
|
+
actualCellHeight: 0
|
|
80
|
+
};
|
|
81
|
+
this._updateDimensions();
|
|
82
|
+
this._injectCss();
|
|
83
|
+
|
|
84
|
+
this._rowFactory = instantiationService.createInstance(DomRendererRowFactory, document, this._colors);
|
|
85
|
+
|
|
86
|
+
this._element.classList.add(TERMINAL_CLASS_PREFIX + this._terminalClass);
|
|
87
|
+
this._screenElement.appendChild(this._rowContainer);
|
|
88
|
+
this._screenElement.appendChild(this._selectionContainer);
|
|
89
|
+
|
|
90
|
+
this.register(this._linkifier.onShowLinkUnderline(e => this._onLinkHover(e)));
|
|
91
|
+
this.register(this._linkifier.onHideLinkUnderline(e => this._onLinkLeave(e)));
|
|
92
|
+
|
|
93
|
+
this.register(this._linkifier2.onShowLinkUnderline(e => this._onLinkHover(e)));
|
|
94
|
+
this.register(this._linkifier2.onHideLinkUnderline(e => this._onLinkLeave(e)));
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
public dispose(): void {
|
|
98
|
+
this._element.classList.remove(TERMINAL_CLASS_PREFIX + this._terminalClass);
|
|
99
|
+
|
|
100
|
+
// Outside influences such as React unmounts may manipulate the DOM before our disposal.
|
|
101
|
+
// https://github.com/xtermjs/xterm.js/issues/2960
|
|
102
|
+
removeElementFromParent(this._rowContainer, this._selectionContainer, this._themeStyleElement, this._dimensionsStyleElement);
|
|
103
|
+
|
|
104
|
+
super.dispose();
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
private _updateDimensions(): void {
|
|
108
|
+
this.dimensions.scaledCharWidth = this._charSizeService.width * window.devicePixelRatio;
|
|
109
|
+
this.dimensions.scaledCharHeight = Math.ceil(this._charSizeService.height * window.devicePixelRatio);
|
|
110
|
+
this.dimensions.scaledCellWidth = this.dimensions.scaledCharWidth + Math.round(this._optionsService.rawOptions.letterSpacing);
|
|
111
|
+
this.dimensions.scaledCellHeight = Math.floor(this.dimensions.scaledCharHeight * this._optionsService.rawOptions.lineHeight);
|
|
112
|
+
this.dimensions.scaledCharLeft = 0;
|
|
113
|
+
this.dimensions.scaledCharTop = 0;
|
|
114
|
+
this.dimensions.scaledCanvasWidth = this.dimensions.scaledCellWidth * this._bufferService.cols;
|
|
115
|
+
this.dimensions.scaledCanvasHeight = this.dimensions.scaledCellHeight * this._bufferService.rows;
|
|
116
|
+
this.dimensions.canvasWidth = Math.round(this.dimensions.scaledCanvasWidth / window.devicePixelRatio);
|
|
117
|
+
this.dimensions.canvasHeight = Math.round(this.dimensions.scaledCanvasHeight / window.devicePixelRatio);
|
|
118
|
+
this.dimensions.actualCellWidth = this.dimensions.canvasWidth / this._bufferService.cols;
|
|
119
|
+
this.dimensions.actualCellHeight = this.dimensions.canvasHeight / this._bufferService.rows;
|
|
120
|
+
|
|
121
|
+
for (const element of this._rowElements) {
|
|
122
|
+
element.style.width = `${this.dimensions.canvasWidth}px`;
|
|
123
|
+
element.style.height = `${this.dimensions.actualCellHeight}px`;
|
|
124
|
+
element.style.lineHeight = `${this.dimensions.actualCellHeight}px`;
|
|
125
|
+
// Make sure rows don't overflow onto following row
|
|
126
|
+
element.style.overflow = 'hidden';
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
if (!this._dimensionsStyleElement) {
|
|
130
|
+
this._dimensionsStyleElement = document.createElement('style');
|
|
131
|
+
this._screenElement.appendChild(this._dimensionsStyleElement);
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
const styles =
|
|
135
|
+
`${this._terminalSelector} .${ROW_CONTAINER_CLASS} span {` +
|
|
136
|
+
` display: inline-block;` +
|
|
137
|
+
` height: 100%;` +
|
|
138
|
+
` vertical-align: top;` +
|
|
139
|
+
` width: ${this.dimensions.actualCellWidth}px` +
|
|
140
|
+
`}`;
|
|
141
|
+
|
|
142
|
+
this._dimensionsStyleElement.textContent = styles;
|
|
143
|
+
|
|
144
|
+
this._selectionContainer.style.height = this._viewportElement.style.height;
|
|
145
|
+
this._screenElement.style.width = `${this.dimensions.canvasWidth}px`;
|
|
146
|
+
this._screenElement.style.height = `${this.dimensions.canvasHeight}px`;
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
public setColors(colors: IColorSet): void {
|
|
150
|
+
this._colors = colors;
|
|
151
|
+
this._injectCss();
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
private _injectCss(): void {
|
|
155
|
+
if (!this._themeStyleElement) {
|
|
156
|
+
this._themeStyleElement = document.createElement('style');
|
|
157
|
+
this._screenElement.appendChild(this._themeStyleElement);
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
// Base CSS
|
|
161
|
+
let styles =
|
|
162
|
+
`${this._terminalSelector} .${ROW_CONTAINER_CLASS} {` +
|
|
163
|
+
` color: ${this._colors.foreground.css};` +
|
|
164
|
+
` font-family: ${this._optionsService.rawOptions.fontFamily};` +
|
|
165
|
+
` font-size: ${this._optionsService.rawOptions.fontSize}px;` +
|
|
166
|
+
`}`;
|
|
167
|
+
// Text styles
|
|
168
|
+
styles +=
|
|
169
|
+
`${this._terminalSelector} span:not(.${BOLD_CLASS}) {` +
|
|
170
|
+
` font-weight: ${this._optionsService.rawOptions.fontWeight};` +
|
|
171
|
+
`}` +
|
|
172
|
+
`${this._terminalSelector} span.${BOLD_CLASS} {` +
|
|
173
|
+
` font-weight: ${this._optionsService.rawOptions.fontWeightBold};` +
|
|
174
|
+
`}` +
|
|
175
|
+
`${this._terminalSelector} span.${ITALIC_CLASS} {` +
|
|
176
|
+
` font-style: italic;` +
|
|
177
|
+
`}`;
|
|
178
|
+
// Blink animation
|
|
179
|
+
styles +=
|
|
180
|
+
`@keyframes blink_box_shadow` + `_` + this._terminalClass + ` {` +
|
|
181
|
+
` 50% {` +
|
|
182
|
+
` box-shadow: none;` +
|
|
183
|
+
` }` +
|
|
184
|
+
`}`;
|
|
185
|
+
styles +=
|
|
186
|
+
`@keyframes blink_block` + `_` + this._terminalClass + ` {` +
|
|
187
|
+
` 0% {` +
|
|
188
|
+
` background-color: ${this._colors.cursor.css};` +
|
|
189
|
+
` color: ${this._colors.cursorAccent.css};` +
|
|
190
|
+
` }` +
|
|
191
|
+
` 50% {` +
|
|
192
|
+
` background-color: ${this._colors.cursorAccent.css};` +
|
|
193
|
+
` color: ${this._colors.cursor.css};` +
|
|
194
|
+
` }` +
|
|
195
|
+
`}`;
|
|
196
|
+
// Cursor
|
|
197
|
+
styles +=
|
|
198
|
+
`${this._terminalSelector} .${ROW_CONTAINER_CLASS}:not(.${FOCUS_CLASS}) .${CURSOR_CLASS}.${CURSOR_STYLE_BLOCK_CLASS} {` +
|
|
199
|
+
` outline: 1px solid ${this._colors.cursor.css};` +
|
|
200
|
+
` outline-offset: -1px;` +
|
|
201
|
+
`}` +
|
|
202
|
+
`${this._terminalSelector} .${ROW_CONTAINER_CLASS}.${FOCUS_CLASS} .${CURSOR_CLASS}.${CURSOR_BLINK_CLASS}:not(.${CURSOR_STYLE_BLOCK_CLASS}) {` +
|
|
203
|
+
` animation: blink_box_shadow` + `_` + this._terminalClass + ` 1s step-end infinite;` +
|
|
204
|
+
`}` +
|
|
205
|
+
`${this._terminalSelector} .${ROW_CONTAINER_CLASS}.${FOCUS_CLASS} .${CURSOR_CLASS}.${CURSOR_BLINK_CLASS}.${CURSOR_STYLE_BLOCK_CLASS} {` +
|
|
206
|
+
` animation: blink_block` + `_` + this._terminalClass + ` 1s step-end infinite;` +
|
|
207
|
+
`}` +
|
|
208
|
+
`${this._terminalSelector} .${ROW_CONTAINER_CLASS}.${FOCUS_CLASS} .${CURSOR_CLASS}.${CURSOR_STYLE_BLOCK_CLASS} {` +
|
|
209
|
+
` background-color: ${this._colors.cursor.css};` +
|
|
210
|
+
` color: ${this._colors.cursorAccent.css};` +
|
|
211
|
+
`}` +
|
|
212
|
+
`${this._terminalSelector} .${ROW_CONTAINER_CLASS} .${CURSOR_CLASS}.${CURSOR_STYLE_BAR_CLASS} {` +
|
|
213
|
+
` box-shadow: ${this._optionsService.rawOptions.cursorWidth}px 0 0 ${this._colors.cursor.css} inset;` +
|
|
214
|
+
`}` +
|
|
215
|
+
`${this._terminalSelector} .${ROW_CONTAINER_CLASS} .${CURSOR_CLASS}.${CURSOR_STYLE_UNDERLINE_CLASS} {` +
|
|
216
|
+
` box-shadow: 0 -1px 0 ${this._colors.cursor.css} inset;` +
|
|
217
|
+
`}`;
|
|
218
|
+
// Selection
|
|
219
|
+
styles +=
|
|
220
|
+
`${this._terminalSelector} .${SELECTION_CLASS} {` +
|
|
221
|
+
` position: absolute;` +
|
|
222
|
+
` top: 0;` +
|
|
223
|
+
` left: 0;` +
|
|
224
|
+
` z-index: 1;` +
|
|
225
|
+
` pointer-events: none;` +
|
|
226
|
+
`}` +
|
|
227
|
+
`${this._terminalSelector} .${SELECTION_CLASS} div {` +
|
|
228
|
+
` position: absolute;` +
|
|
229
|
+
` background-color: ${this._colors.selectionOpaque.css};` +
|
|
230
|
+
`}`;
|
|
231
|
+
// Colors
|
|
232
|
+
this._colors.ansi.forEach((c, i) => {
|
|
233
|
+
styles +=
|
|
234
|
+
`${this._terminalSelector} .${FG_CLASS_PREFIX}${i} { color: ${c.css}; }` +
|
|
235
|
+
`${this._terminalSelector} .${BG_CLASS_PREFIX}${i} { background-color: ${c.css}; }`;
|
|
236
|
+
});
|
|
237
|
+
styles +=
|
|
238
|
+
`${this._terminalSelector} .${FG_CLASS_PREFIX}${INVERTED_DEFAULT_COLOR} { color: ${color.opaque(this._colors.background).css}; }` +
|
|
239
|
+
`${this._terminalSelector} .${BG_CLASS_PREFIX}${INVERTED_DEFAULT_COLOR} { background-color: ${this._colors.foreground.css}; }`;
|
|
240
|
+
|
|
241
|
+
this._themeStyleElement.textContent = styles;
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
public onDevicePixelRatioChange(): void {
|
|
245
|
+
this._updateDimensions();
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
private _refreshRowElements(cols: number, rows: number): void {
|
|
249
|
+
// Add missing elements
|
|
250
|
+
for (let i = this._rowElements.length; i <= rows; i++) {
|
|
251
|
+
const row = document.createElement('div');
|
|
252
|
+
this._rowContainer.appendChild(row);
|
|
253
|
+
this._rowElements.push(row);
|
|
254
|
+
}
|
|
255
|
+
// Remove excess elements
|
|
256
|
+
while (this._rowElements.length > rows) {
|
|
257
|
+
this._rowContainer.removeChild(this._rowElements.pop()!);
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
public onResize(cols: number, rows: number): void {
|
|
262
|
+
this._refreshRowElements(cols, rows);
|
|
263
|
+
this._updateDimensions();
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
public onCharSizeChanged(): void {
|
|
267
|
+
this._updateDimensions();
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
public onBlur(): void {
|
|
271
|
+
this._rowContainer.classList.remove(FOCUS_CLASS);
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
public onFocus(): void {
|
|
275
|
+
this._rowContainer.classList.add(FOCUS_CLASS);
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
public onSelectionChanged(start: [number, number] | undefined, end: [number, number] | undefined, columnSelectMode: boolean): void {
|
|
279
|
+
// Remove all selections
|
|
280
|
+
while (this._selectionContainer.children.length) {
|
|
281
|
+
this._selectionContainer.removeChild(this._selectionContainer.children[0]);
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
this._rowFactory.onSelectionChanged(start, end, columnSelectMode);
|
|
285
|
+
this.renderRows(0, this._bufferService.rows - 1);
|
|
286
|
+
|
|
287
|
+
// Selection does not exist
|
|
288
|
+
if (!start || !end) {
|
|
289
|
+
return;
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
// Translate from buffer position to viewport position
|
|
293
|
+
const viewportStartRow = start[1] - this._bufferService.buffer.ydisp;
|
|
294
|
+
const viewportEndRow = end[1] - this._bufferService.buffer.ydisp;
|
|
295
|
+
const viewportCappedStartRow = Math.max(viewportStartRow, 0);
|
|
296
|
+
const viewportCappedEndRow = Math.min(viewportEndRow, this._bufferService.rows - 1);
|
|
297
|
+
|
|
298
|
+
// No need to draw the selection
|
|
299
|
+
if (viewportCappedStartRow >= this._bufferService.rows || viewportCappedEndRow < 0) {
|
|
300
|
+
return;
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
// Create the selections
|
|
304
|
+
const documentFragment = document.createDocumentFragment();
|
|
305
|
+
|
|
306
|
+
if (columnSelectMode) {
|
|
307
|
+
const isXFlipped = start[0] > end[0];
|
|
308
|
+
documentFragment.appendChild(
|
|
309
|
+
this._createSelectionElement(viewportCappedStartRow, isXFlipped ? end[0] : start[0], isXFlipped ? start[0] : end[0], viewportCappedEndRow - viewportCappedStartRow + 1)
|
|
310
|
+
);
|
|
311
|
+
} else {
|
|
312
|
+
// Draw first row
|
|
313
|
+
const startCol = viewportStartRow === viewportCappedStartRow ? start[0] : 0;
|
|
314
|
+
const endCol = viewportCappedStartRow === viewportEndRow ? end[0] : this._bufferService.cols;
|
|
315
|
+
documentFragment.appendChild(this._createSelectionElement(viewportCappedStartRow, startCol, endCol));
|
|
316
|
+
// Draw middle rows
|
|
317
|
+
const middleRowsCount = viewportCappedEndRow - viewportCappedStartRow - 1;
|
|
318
|
+
documentFragment.appendChild(this._createSelectionElement(viewportCappedStartRow + 1, 0, this._bufferService.cols, middleRowsCount));
|
|
319
|
+
// Draw final row
|
|
320
|
+
if (viewportCappedStartRow !== viewportCappedEndRow) {
|
|
321
|
+
// Only draw viewportEndRow if it's not the same as viewporttartRow
|
|
322
|
+
const endCol = viewportEndRow === viewportCappedEndRow ? end[0] : this._bufferService.cols;
|
|
323
|
+
documentFragment.appendChild(this._createSelectionElement(viewportCappedEndRow, 0, endCol));
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
this._selectionContainer.appendChild(documentFragment);
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
/**
|
|
330
|
+
* Creates a selection element at the specified position.
|
|
331
|
+
* @param row The row of the selection.
|
|
332
|
+
* @param colStart The start column.
|
|
333
|
+
* @param colEnd The end columns.
|
|
334
|
+
*/
|
|
335
|
+
private _createSelectionElement(row: number, colStart: number, colEnd: number, rowCount: number = 1): HTMLElement {
|
|
336
|
+
const element = document.createElement('div');
|
|
337
|
+
element.style.height = `${rowCount * this.dimensions.actualCellHeight}px`;
|
|
338
|
+
element.style.top = `${row * this.dimensions.actualCellHeight}px`;
|
|
339
|
+
element.style.left = `${colStart * this.dimensions.actualCellWidth}px`;
|
|
340
|
+
element.style.width = `${this.dimensions.actualCellWidth * (colEnd - colStart)}px`;
|
|
341
|
+
return element;
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
public onCursorMove(): void {
|
|
345
|
+
// No-op, the cursor is drawn when rows are drawn
|
|
346
|
+
}
|
|
347
|
+
|
|
348
|
+
public onOptionsChanged(): void {
|
|
349
|
+
// Force a refresh
|
|
350
|
+
this._updateDimensions();
|
|
351
|
+
this._injectCss();
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
public clear(): void {
|
|
355
|
+
for (const e of this._rowElements) {
|
|
356
|
+
e.innerText = '';
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
|
|
360
|
+
public renderRows(start: number, end: number): void {
|
|
361
|
+
const cursorAbsoluteY = this._bufferService.buffer.ybase + this._bufferService.buffer.y;
|
|
362
|
+
const cursorX = Math.min(this._bufferService.buffer.x, this._bufferService.cols - 1);
|
|
363
|
+
const cursorBlink = this._optionsService.rawOptions.cursorBlink;
|
|
364
|
+
|
|
365
|
+
for (let y = start; y <= end; y++) {
|
|
366
|
+
const rowElement = this._rowElements[y];
|
|
367
|
+
rowElement.innerText = '';
|
|
368
|
+
const row = y + this._bufferService.buffer.ydisp;
|
|
369
|
+
const lineData = this._bufferService.buffer.lines.get(row);
|
|
370
|
+
const cursorStyle = this._optionsService.rawOptions.cursorStyle;
|
|
371
|
+
rowElement.appendChild(this._rowFactory.createRow(lineData!, row, row === cursorAbsoluteY, cursorStyle, cursorX, cursorBlink, this.dimensions.actualCellWidth, this._bufferService.cols));
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
private get _terminalSelector(): string {
|
|
376
|
+
return `.${TERMINAL_CLASS_PREFIX}${this._terminalClass}`;
|
|
377
|
+
}
|
|
378
|
+
|
|
379
|
+
private _onLinkHover(e: ILinkifierEvent): void {
|
|
380
|
+
this._setCellUnderline(e.x1, e.x2, e.y1, e.y2, e.cols, true);
|
|
381
|
+
}
|
|
382
|
+
|
|
383
|
+
private _onLinkLeave(e: ILinkifierEvent): void {
|
|
384
|
+
this._setCellUnderline(e.x1, e.x2, e.y1, e.y2, e.cols, false);
|
|
385
|
+
}
|
|
386
|
+
|
|
387
|
+
private _setCellUnderline(x: number, x2: number, y: number, y2: number, cols: number, enabled: boolean): void {
|
|
388
|
+
while (x !== x2 || y !== y2) {
|
|
389
|
+
const row = this._rowElements[y];
|
|
390
|
+
if (!row) {
|
|
391
|
+
return;
|
|
392
|
+
}
|
|
393
|
+
const span = row.children[x] as HTMLElement;
|
|
394
|
+
if (span) {
|
|
395
|
+
span.style.textDecoration = enabled ? 'underline' : 'none';
|
|
396
|
+
}
|
|
397
|
+
if (++x >= cols) {
|
|
398
|
+
x = 0;
|
|
399
|
+
y++;
|
|
400
|
+
}
|
|
401
|
+
}
|
|
402
|
+
}
|
|
403
|
+
}
|