@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.
Files changed (135) hide show
  1. package/dist/index.js +1 -1
  2. package/dist/lib/xterm/LICENSE +21 -0
  3. package/dist/lib/xterm/README.md +225 -0
  4. package/dist/lib/xterm/css/xterm.css +190 -0
  5. package/dist/lib/xterm/lib/xterm.js +2 -0
  6. package/dist/lib/xterm/lib/xterm.js.map +1 -0
  7. package/dist/lib/xterm/package.json +90 -0
  8. package/dist/lib/xterm/src/browser/AccessibilityManager.ts +301 -0
  9. package/dist/lib/xterm/src/browser/Clipboard.ts +99 -0
  10. package/dist/lib/xterm/src/browser/ColorContrastCache.ts +39 -0
  11. package/dist/lib/xterm/src/browser/ColorManager.ts +268 -0
  12. package/dist/lib/xterm/src/browser/Dom.ts +10 -0
  13. package/dist/lib/xterm/src/browser/Lifecycle.ts +30 -0
  14. package/dist/lib/xterm/src/browser/Linkifier.ts +356 -0
  15. package/dist/lib/xterm/src/browser/Linkifier2.ts +397 -0
  16. package/dist/lib/xterm/src/browser/LocalizableStrings.ts +10 -0
  17. package/dist/lib/xterm/src/browser/MouseZoneManager.ts +236 -0
  18. package/dist/lib/xterm/src/browser/RenderDebouncer.ts +82 -0
  19. package/dist/lib/xterm/src/browser/ScreenDprMonitor.ts +69 -0
  20. package/dist/lib/xterm/src/browser/Terminal.ts +1447 -0
  21. package/dist/lib/xterm/src/browser/TimeBasedDebouncer.ts +86 -0
  22. package/dist/lib/xterm/src/browser/Types.d.ts +317 -0
  23. package/dist/lib/xterm/src/browser/Viewport.ts +276 -0
  24. package/dist/lib/xterm/src/browser/decorations/BufferDecorationRenderer.ts +131 -0
  25. package/dist/lib/xterm/src/browser/decorations/ColorZoneStore.ts +117 -0
  26. package/dist/lib/xterm/src/browser/decorations/OverviewRulerRenderer.ts +228 -0
  27. package/dist/lib/xterm/src/browser/input/CompositionHelper.ts +237 -0
  28. package/dist/lib/xterm/src/browser/input/Mouse.ts +64 -0
  29. package/dist/lib/xterm/src/browser/input/MoveToCell.ts +249 -0
  30. package/dist/lib/xterm/src/browser/public/Terminal.ts +298 -0
  31. package/dist/lib/xterm/src/browser/renderer/BaseRenderLayer.ts +582 -0
  32. package/dist/lib/xterm/src/browser/renderer/CursorRenderLayer.ts +378 -0
  33. package/dist/lib/xterm/src/browser/renderer/CustomGlyphs.ts +632 -0
  34. package/dist/lib/xterm/src/browser/renderer/GridCache.ts +33 -0
  35. package/dist/lib/xterm/src/browser/renderer/LinkRenderLayer.ts +84 -0
  36. package/dist/lib/xterm/src/browser/renderer/Renderer.ts +219 -0
  37. package/dist/lib/xterm/src/browser/renderer/RendererUtils.ts +26 -0
  38. package/dist/lib/xterm/src/browser/renderer/SelectionRenderLayer.ts +131 -0
  39. package/dist/lib/xterm/src/browser/renderer/TextRenderLayer.ts +344 -0
  40. package/dist/lib/xterm/src/browser/renderer/Types.d.ts +109 -0
  41. package/dist/lib/xterm/src/browser/renderer/atlas/BaseCharAtlas.ts +58 -0
  42. package/dist/lib/xterm/src/browser/renderer/atlas/CharAtlasCache.ts +95 -0
  43. package/dist/lib/xterm/src/browser/renderer/atlas/CharAtlasUtils.ts +54 -0
  44. package/dist/lib/xterm/src/browser/renderer/atlas/Constants.ts +15 -0
  45. package/dist/lib/xterm/src/browser/renderer/atlas/DynamicCharAtlas.ts +404 -0
  46. package/dist/lib/xterm/src/browser/renderer/atlas/LRUMap.ts +136 -0
  47. package/dist/lib/xterm/src/browser/renderer/atlas/Types.d.ts +29 -0
  48. package/dist/lib/xterm/src/browser/renderer/dom/DomRenderer.ts +403 -0
  49. package/dist/lib/xterm/src/browser/renderer/dom/DomRendererRowFactory.ts +344 -0
  50. package/dist/lib/xterm/src/browser/selection/SelectionModel.ts +144 -0
  51. package/dist/lib/xterm/src/browser/selection/Types.d.ts +15 -0
  52. package/dist/lib/xterm/src/browser/services/CharSizeService.ts +87 -0
  53. package/dist/lib/xterm/src/browser/services/CharacterJoinerService.ts +339 -0
  54. package/dist/lib/xterm/src/browser/services/CoreBrowserService.ts +20 -0
  55. package/dist/lib/xterm/src/browser/services/MouseService.ts +36 -0
  56. package/dist/lib/xterm/src/browser/services/RenderService.ts +237 -0
  57. package/dist/lib/xterm/src/browser/services/SelectionService.ts +1027 -0
  58. package/dist/lib/xterm/src/browser/services/Services.ts +123 -0
  59. package/dist/lib/xterm/src/browser/services/SoundService.ts +63 -0
  60. package/dist/lib/xterm/src/common/CircularList.ts +239 -0
  61. package/dist/lib/xterm/src/common/Clone.ts +23 -0
  62. package/dist/lib/xterm/src/common/Color.ts +285 -0
  63. package/dist/lib/xterm/src/common/CoreTerminal.ts +300 -0
  64. package/dist/lib/xterm/src/common/EventEmitter.ts +69 -0
  65. package/dist/lib/xterm/src/common/InputHandler.ts +3230 -0
  66. package/dist/lib/xterm/src/common/Lifecycle.ts +68 -0
  67. package/dist/lib/xterm/src/common/Platform.ts +31 -0
  68. package/dist/lib/xterm/src/common/SortedList.ts +88 -0
  69. package/dist/lib/xterm/src/common/TypedArrayUtils.ts +50 -0
  70. package/dist/lib/xterm/src/common/Types.d.ts +489 -0
  71. package/dist/lib/xterm/src/common/WindowsMode.ts +27 -0
  72. package/dist/lib/xterm/src/common/buffer/AttributeData.ts +148 -0
  73. package/dist/lib/xterm/src/common/buffer/Buffer.ts +711 -0
  74. package/dist/lib/xterm/src/common/buffer/BufferLine.ts +441 -0
  75. package/dist/lib/xterm/src/common/buffer/BufferRange.ts +13 -0
  76. package/dist/lib/xterm/src/common/buffer/BufferReflow.ts +220 -0
  77. package/dist/lib/xterm/src/common/buffer/BufferSet.ts +131 -0
  78. package/dist/lib/xterm/src/common/buffer/CellData.ts +94 -0
  79. package/dist/lib/xterm/src/common/buffer/Constants.ts +139 -0
  80. package/dist/lib/xterm/src/common/buffer/Marker.ts +37 -0
  81. package/dist/lib/xterm/src/common/buffer/Types.d.ts +64 -0
  82. package/dist/lib/xterm/src/common/data/Charsets.ts +256 -0
  83. package/dist/lib/xterm/src/common/data/EscapeSequences.ts +153 -0
  84. package/dist/lib/xterm/src/common/input/Keyboard.ts +398 -0
  85. package/dist/lib/xterm/src/common/input/TextDecoder.ts +346 -0
  86. package/dist/lib/xterm/src/common/input/UnicodeV6.ts +133 -0
  87. package/dist/lib/xterm/src/common/input/WriteBuffer.ts +229 -0
  88. package/dist/lib/xterm/src/common/input/XParseColor.ts +80 -0
  89. package/dist/lib/xterm/src/common/parser/Constants.ts +58 -0
  90. package/dist/lib/xterm/src/common/parser/DcsParser.ts +192 -0
  91. package/dist/lib/xterm/src/common/parser/EscapeSequenceParser.ts +796 -0
  92. package/dist/lib/xterm/src/common/parser/OscParser.ts +238 -0
  93. package/dist/lib/xterm/src/common/parser/Params.ts +229 -0
  94. package/dist/lib/xterm/src/common/parser/Types.d.ts +274 -0
  95. package/dist/lib/xterm/src/common/public/AddonManager.ts +56 -0
  96. package/dist/lib/xterm/src/common/public/BufferApiView.ts +35 -0
  97. package/dist/lib/xterm/src/common/public/BufferLineApiView.ts +29 -0
  98. package/dist/lib/xterm/src/common/public/BufferNamespaceApi.ts +33 -0
  99. package/dist/lib/xterm/src/common/public/ParserApi.ts +37 -0
  100. package/dist/lib/xterm/src/common/public/UnicodeApi.ts +27 -0
  101. package/dist/lib/xterm/src/common/services/BufferService.ts +185 -0
  102. package/dist/lib/xterm/src/common/services/CharsetService.ts +34 -0
  103. package/dist/lib/xterm/src/common/services/CoreMouseService.ts +309 -0
  104. package/dist/lib/xterm/src/common/services/CoreService.ts +92 -0
  105. package/dist/lib/xterm/src/common/services/DecorationService.ts +139 -0
  106. package/dist/lib/xterm/src/common/services/DirtyRowService.ts +53 -0
  107. package/dist/lib/xterm/src/common/services/InstantiationService.ts +83 -0
  108. package/dist/lib/xterm/src/common/services/LogService.ts +88 -0
  109. package/dist/lib/xterm/src/common/services/OptionsService.ts +178 -0
  110. package/dist/lib/xterm/src/common/services/ServiceRegistry.ts +49 -0
  111. package/dist/lib/xterm/src/common/services/Services.ts +323 -0
  112. package/dist/lib/xterm/src/common/services/UnicodeService.ts +82 -0
  113. package/dist/lib/xterm/src/headless/Terminal.ts +170 -0
  114. package/dist/lib/xterm/src/headless/Types.d.ts +31 -0
  115. package/dist/lib/xterm/src/headless/public/Terminal.ts +216 -0
  116. package/dist/lib/xterm/typings/xterm.d.ts +1872 -0
  117. package/dist/lib/xterm-fit/LICENSE +19 -0
  118. package/dist/lib/xterm-fit/README.md +24 -0
  119. package/dist/lib/xterm-fit/lib/xterm-addon-fit.js +2 -0
  120. package/dist/lib/xterm-fit/lib/xterm-addon-fit.js.map +1 -0
  121. package/dist/lib/xterm-fit/out/FitAddon.js +58 -0
  122. package/dist/lib/xterm-fit/out/FitAddon.js.map +1 -0
  123. package/dist/lib/xterm-fit/out-test/FitAddon.api.js.map +1 -0
  124. package/dist/lib/xterm-fit/package.json +21 -0
  125. package/dist/lib/xterm-fit/src/FitAddon.ts +86 -0
  126. package/dist/lib/xterm-fit/typings/xterm-addon-fit.d.ts +55 -0
  127. package/dist/lib/xterm-links/LICENSE +19 -0
  128. package/dist/lib/xterm-links/README.md +21 -0
  129. package/dist/lib/xterm-links/lib/xterm-addon-web-links.js +2 -0
  130. package/dist/lib/xterm-links/lib/xterm-addon-web-links.js.map +1 -0
  131. package/dist/lib/xterm-links/package.json +26 -0
  132. package/dist/lib/xterm-links/src/WebLinkProvider.ts +145 -0
  133. package/dist/lib/xterm-links/src/WebLinksAddon.ts +77 -0
  134. package/dist/lib/xterm-links/typings/xterm-addon-web-links.d.ts +58 -0
  135. package/package.json +1 -1
@@ -0,0 +1,86 @@
1
+ /**
2
+ * Copyright (c) 2018 The xterm.js authors. All rights reserved.
3
+ * @license MIT
4
+ */
5
+
6
+ const RENDER_DEBOUNCE_THRESHOLD_MS = 1000; // 1 Second
7
+
8
+ import { IRenderDebouncer } from 'browser/Types';
9
+
10
+ /**
11
+ * Debounces calls to update screen readers to update at most once configurable interval of time.
12
+ */
13
+ export class TimeBasedDebouncer implements IRenderDebouncer {
14
+ private _rowStart: number | undefined;
15
+ private _rowEnd: number | undefined;
16
+ private _rowCount: number | undefined;
17
+
18
+ // The last moment that the Terminal was refreshed at
19
+ private _lastRefreshMs = 0;
20
+ // Whether a trailing refresh should be triggered due to a refresh request that was throttled
21
+ private _additionalRefreshRequested = false;
22
+
23
+ private _refreshTimeoutID: number | undefined;
24
+
25
+ constructor(
26
+ private _renderCallback: (start: number, end: number) => void,
27
+ private readonly _debounceThresholdMS = RENDER_DEBOUNCE_THRESHOLD_MS
28
+ ) {
29
+ }
30
+
31
+ public dispose(): void {
32
+ if (this._refreshTimeoutID) {
33
+ clearTimeout(this._refreshTimeoutID);
34
+ }
35
+ }
36
+
37
+ public refresh(rowStart: number | undefined, rowEnd: number | undefined, rowCount: number): void {
38
+ this._rowCount = rowCount;
39
+ // Get the min/max row start/end for the arg values
40
+ rowStart = rowStart !== undefined ? rowStart : 0;
41
+ rowEnd = rowEnd !== undefined ? rowEnd : this._rowCount - 1;
42
+ // Set the properties to the updated values
43
+ this._rowStart = this._rowStart !== undefined ? Math.min(this._rowStart, rowStart) : rowStart;
44
+ this._rowEnd = this._rowEnd !== undefined ? Math.max(this._rowEnd, rowEnd) : rowEnd;
45
+
46
+ // Only refresh if the time since last refresh is above a threshold, otherwise wait for
47
+ // enough time to pass before refreshing again.
48
+ const refreshRequestTime: number = Date.now();
49
+ if (refreshRequestTime - this._lastRefreshMs >= this._debounceThresholdMS) {
50
+ // Enough time has lapsed since the last refresh; refresh immediately
51
+ this._lastRefreshMs = refreshRequestTime;
52
+ this._innerRefresh();
53
+ } else if (!this._additionalRefreshRequested) {
54
+ // This is the first additional request throttled; set up trailing refresh
55
+ const elapsed = refreshRequestTime - this._lastRefreshMs;
56
+ const waitPeriodBeforeTrailingRefresh = this._debounceThresholdMS - elapsed;
57
+ this._additionalRefreshRequested = true;
58
+
59
+ this._refreshTimeoutID = window.setTimeout(() => {
60
+ this._lastRefreshMs = Date.now();
61
+ this._innerRefresh();
62
+ this._additionalRefreshRequested = false;
63
+ this._refreshTimeoutID = undefined; // No longer need to clear the timeout
64
+ }, waitPeriodBeforeTrailingRefresh);
65
+ }
66
+ }
67
+
68
+ private _innerRefresh(): void {
69
+ // Make sure values are set
70
+ if (this._rowStart === undefined || this._rowEnd === undefined || this._rowCount === undefined) {
71
+ return;
72
+ }
73
+
74
+ // Clamp values
75
+ const start = Math.max(this._rowStart, 0);
76
+ const end = Math.min(this._rowEnd, this._rowCount - 1);
77
+
78
+ // Reset debouncer (this happens before render callback as the render could trigger it again)
79
+ this._rowStart = undefined;
80
+ this._rowEnd = undefined;
81
+
82
+ // Run render callback
83
+ this._renderCallback(start, end);
84
+ }
85
+ }
86
+
@@ -0,0 +1,317 @@
1
+ /**
2
+ * Copyright (c) 2017 The xterm.js authors. All rights reserved.
3
+ * @license MIT
4
+ */
5
+
6
+ import { IDecorationOptions, IDecoration, IDisposable, IMarker, ISelectionPosition } from 'xterm';
7
+ import { IEvent } from 'common/EventEmitter';
8
+ import { ICoreTerminal, CharData, ITerminalOptions, IColor } from 'common/Types';
9
+ import { IMouseService, IRenderService } from './services/Services';
10
+ import { IBuffer } from 'common/buffer/Types';
11
+ import { IFunctionIdentifier, IParams } from 'common/parser/Types';
12
+
13
+ export interface ITerminal extends IPublicTerminal, ICoreTerminal {
14
+ element: HTMLElement | undefined;
15
+ screenElement: HTMLElement | undefined;
16
+ browser: IBrowser;
17
+ buffer: IBuffer;
18
+ viewport: IViewport | undefined;
19
+ options: ITerminalOptions;
20
+ linkifier: ILinkifier;
21
+ linkifier2: ILinkifier2;
22
+
23
+ onBlur: IEvent<void>;
24
+ onFocus: IEvent<void>;
25
+ onA11yChar: IEvent<string>;
26
+ onA11yTab: IEvent<number>;
27
+
28
+ cancel(ev: Event, force?: boolean): boolean | void;
29
+ }
30
+
31
+ // Portions of the public API that are required by the internal Terminal
32
+ export interface IPublicTerminal extends IDisposable {
33
+ textarea: HTMLTextAreaElement | undefined;
34
+ rows: number;
35
+ cols: number;
36
+ buffer: IBuffer;
37
+ markers: IMarker[];
38
+ onCursorMove: IEvent<void>;
39
+ onData: IEvent<string>;
40
+ onBinary: IEvent<string>;
41
+ onKey: IEvent<{ key: string, domEvent: KeyboardEvent }>;
42
+ onLineFeed: IEvent<void>;
43
+ onScroll: IEvent<number>;
44
+ onSelectionChange: IEvent<void>;
45
+ onRender: IEvent<{ start: number, end: number }>;
46
+ onResize: IEvent<{ cols: number, rows: number }>;
47
+ onWriteParsed: IEvent<void>;
48
+ onTitleChange: IEvent<string>;
49
+ onBell: IEvent<void>;
50
+ blur(): void;
51
+ focus(): void;
52
+ resize(columns: number, rows: number): void;
53
+ open(parent: HTMLElement): void;
54
+ attachCustomKeyEventHandler(customKeyEventHandler: (event: KeyboardEvent) => boolean): void;
55
+ registerCsiHandler(id: IFunctionIdentifier, callback: (params: IParams) => boolean | Promise<boolean>): IDisposable;
56
+ registerDcsHandler(id: IFunctionIdentifier, callback: (data: string, param: IParams) => boolean | Promise<boolean>): IDisposable;
57
+ registerEscHandler(id: IFunctionIdentifier, callback: () => boolean | Promise<boolean>): IDisposable;
58
+ registerOscHandler(ident: number, callback: (data: string) => boolean | Promise<boolean>): IDisposable;
59
+ registerLinkMatcher(regex: RegExp, handler: (event: MouseEvent, uri: string) => void, options?: ILinkMatcherOptions): number;
60
+ deregisterLinkMatcher(matcherId: number): void;
61
+ registerLinkProvider(linkProvider: ILinkProvider): IDisposable;
62
+ registerCharacterJoiner(handler: (text: string) => [number, number][]): number;
63
+ deregisterCharacterJoiner(joinerId: number): void;
64
+ addMarker(cursorYOffset: number): IMarker | undefined;
65
+ registerDecoration(decorationOptions: IDecorationOptions): IDecoration | undefined;
66
+ hasSelection(): boolean;
67
+ getSelection(): string;
68
+ getSelectionPosition(): ISelectionPosition | undefined;
69
+ clearSelection(): void;
70
+ select(column: number, row: number, length: number): void;
71
+ selectAll(): void;
72
+ selectLines(start: number, end: number): void;
73
+ dispose(): void;
74
+ scrollLines(amount: number): void;
75
+ scrollPages(pageCount: number): void;
76
+ scrollToTop(): void;
77
+ scrollToBottom(): void;
78
+ scrollToLine(line: number): void;
79
+ clear(): void;
80
+ write(data: string | Uint8Array, callback?: () => void): void;
81
+ paste(data: string): void;
82
+ refresh(start: number, end: number): void;
83
+ clearTextureAtlas(): void;
84
+ reset(): void;
85
+ }
86
+
87
+ export type CustomKeyEventHandler = (event: KeyboardEvent) => boolean;
88
+
89
+ export type LineData = CharData[];
90
+
91
+ export interface ICompositionHelper {
92
+ readonly isComposing: boolean;
93
+ compositionstart(): void;
94
+ compositionupdate(ev: CompositionEvent): void;
95
+ compositionend(): void;
96
+ updateCompositionElements(dontRecurse?: boolean): void;
97
+ keydown(ev: KeyboardEvent): boolean;
98
+ }
99
+
100
+ export interface IBrowser {
101
+ isNode: boolean;
102
+ userAgent: string;
103
+ platform: string;
104
+ isFirefox: boolean;
105
+ isMac: boolean;
106
+ isIpad: boolean;
107
+ isIphone: boolean;
108
+ isWindows: boolean;
109
+ }
110
+
111
+ export interface IColorManager {
112
+ colors: IColorSet;
113
+ onOptionsChange(key: string): void;
114
+ }
115
+
116
+ export interface IColorSet {
117
+ foreground: IColor;
118
+ background: IColor;
119
+ cursor: IColor;
120
+ cursorAccent: IColor;
121
+ selectionTransparent: IColor;
122
+ /** The selection blended on top of background. */
123
+ selectionOpaque: IColor;
124
+ selectionForeground: IColor | undefined;
125
+ ansi: IColor[];
126
+ contrastCache: IColorContrastCache;
127
+ }
128
+
129
+ export interface IColorContrastCache {
130
+ clear(): void;
131
+ setCss(bg: number, fg: number, value: string | null): void;
132
+ getCss(bg: number, fg: number): string | null | undefined;
133
+ setColor(bg: number, fg: number, value: IColor | null): void;
134
+ getColor(bg: number, fg: number): IColor | null | undefined;
135
+ }
136
+
137
+ export interface IPartialColorSet {
138
+ foreground: IColor;
139
+ background: IColor;
140
+ cursor?: IColor;
141
+ cursorAccent?: IColor;
142
+ selection?: IColor;
143
+ ansi: IColor[];
144
+ }
145
+
146
+ export interface IViewport extends IDisposable {
147
+ scrollBarWidth: number;
148
+ syncScrollArea(immediate?: boolean): void;
149
+ getLinesScrolled(ev: WheelEvent): number;
150
+ onWheel(ev: WheelEvent): boolean;
151
+ onTouchStart(ev: TouchEvent): void;
152
+ onTouchMove(ev: TouchEvent): boolean;
153
+ onThemeChange(colors: IColorSet): void;
154
+ }
155
+
156
+ export interface IViewportRange {
157
+ start: IViewportRangePosition;
158
+ end: IViewportRangePosition;
159
+ }
160
+
161
+ export interface IViewportRangePosition {
162
+ x: number;
163
+ y: number;
164
+ }
165
+
166
+ export type LinkMatcherHandler = (event: MouseEvent, uri: string) => void;
167
+ export type LinkMatcherHoverTooltipCallback = (event: MouseEvent, uri: string, position: IViewportRange) => void;
168
+ export type LinkMatcherValidationCallback = (uri: string, callback: (isValid: boolean) => void) => void;
169
+
170
+ export interface ILinkMatcher {
171
+ id: number;
172
+ regex: RegExp;
173
+ handler: LinkMatcherHandler;
174
+ hoverTooltipCallback?: LinkMatcherHoverTooltipCallback;
175
+ hoverLeaveCallback?: () => void;
176
+ matchIndex?: number;
177
+ validationCallback?: LinkMatcherValidationCallback;
178
+ priority?: number;
179
+ willLinkActivate?: (event: MouseEvent, uri: string) => boolean;
180
+ }
181
+
182
+ export interface IRegisteredLinkMatcher extends ILinkMatcher {
183
+ priority: number;
184
+ }
185
+
186
+ export interface ILinkifierEvent {
187
+ x1: number;
188
+ y1: number;
189
+ x2: number;
190
+ y2: number;
191
+ cols: number;
192
+ fg: number | undefined;
193
+ }
194
+
195
+ export interface ILinkifier {
196
+ onShowLinkUnderline: IEvent<ILinkifierEvent>;
197
+ onHideLinkUnderline: IEvent<ILinkifierEvent>;
198
+ onLinkTooltip: IEvent<ILinkifierEvent>;
199
+
200
+ attachToDom(element: HTMLElement, mouseZoneManager: IMouseZoneManager): void;
201
+ linkifyRows(start: number, end: number): void;
202
+ registerLinkMatcher(regex: RegExp, handler: LinkMatcherHandler, options?: ILinkMatcherOptions): number;
203
+ deregisterLinkMatcher(matcherId: number): boolean;
204
+ }
205
+
206
+ interface ILinkState {
207
+ decorations: ILinkDecorations;
208
+ isHovered: boolean;
209
+ }
210
+ export interface ILinkWithState {
211
+ link: ILink;
212
+ state?: ILinkState;
213
+ }
214
+
215
+ export interface ILinkifier2 {
216
+ onShowLinkUnderline: IEvent<ILinkifierEvent>;
217
+ onHideLinkUnderline: IEvent<ILinkifierEvent>;
218
+ readonly currentLink: ILinkWithState | undefined;
219
+
220
+ attachToDom(element: HTMLElement, mouseService: IMouseService, renderService: IRenderService): void;
221
+ registerLinkProvider(linkProvider: ILinkProvider): IDisposable;
222
+ }
223
+
224
+ export interface ILinkMatcherOptions {
225
+ /**
226
+ * The index of the link from the regex.match(text) call. This defaults to 0
227
+ * (for regular expressions without capture groups).
228
+ */
229
+ matchIndex?: number;
230
+ /**
231
+ * A callback that validates an individual link, returning true if valid and
232
+ * false if invalid.
233
+ */
234
+ validationCallback?: LinkMatcherValidationCallback;
235
+ /**
236
+ * A callback that fires when the mouse hovers over a link.
237
+ */
238
+ tooltipCallback?: LinkMatcherHoverTooltipCallback;
239
+ /**
240
+ * A callback that fires when the mouse leaves a link that was hovered.
241
+ */
242
+ leaveCallback?: () => void;
243
+ /**
244
+ * The priority of the link matcher, this defines the order in which the link
245
+ * matcher is evaluated relative to others, from highest to lowest. The
246
+ * default value is 0.
247
+ */
248
+ priority?: number;
249
+ /**
250
+ * A callback that fires when the mousedown and click events occur that
251
+ * determines whether a link will be activated upon click. This enables
252
+ * only activating a link when a certain modifier is held down, if not the
253
+ * mouse event will continue propagation (eg. double click to select word).
254
+ */
255
+ willLinkActivate?: (event: MouseEvent, uri: string) => boolean;
256
+ }
257
+
258
+ export interface IMouseZoneManager extends IDisposable {
259
+ add(zone: IMouseZone): void;
260
+ clearAll(start?: number, end?: number): void;
261
+ }
262
+
263
+ export interface IMouseZone {
264
+ x1: number;
265
+ x2: number;
266
+ y1: number;
267
+ y2: number;
268
+ clickCallback: (e: MouseEvent) => any;
269
+ hoverCallback: (e: MouseEvent) => any | undefined;
270
+ tooltipCallback: (e: MouseEvent) => any | undefined;
271
+ leaveCallback: () => any | undefined;
272
+ willLinkActivate: (e: MouseEvent) => boolean;
273
+ }
274
+
275
+ interface ILinkProvider {
276
+ provideLinks(y: number, callback: (links: ILink[] | undefined) => void): void;
277
+ }
278
+
279
+ interface ILink {
280
+ range: IBufferRange;
281
+ text: string;
282
+ decorations?: ILinkDecorations;
283
+ activate(event: MouseEvent, text: string): void;
284
+ hover?(event: MouseEvent, text: string): void;
285
+ leave?(event: MouseEvent, text: string): void;
286
+ dispose?(): void;
287
+ }
288
+
289
+ interface ILinkDecorations {
290
+ pointerCursor: boolean;
291
+ underline: boolean;
292
+ }
293
+
294
+ interface IBufferRange {
295
+ start: IBufferCellPosition;
296
+ end: IBufferCellPosition;
297
+ }
298
+
299
+ interface IBufferCellPosition {
300
+ x: number;
301
+ y: number;
302
+ }
303
+
304
+ export type CharacterJoinerHandler = (text: string) => [number, number][];
305
+
306
+ export interface ICharacterJoiner {
307
+ id: number;
308
+ handler: CharacterJoinerHandler;
309
+ }
310
+
311
+ export interface IRenderDebouncer extends IDisposable {
312
+ refresh(rowStart: number | undefined, rowEnd: number | undefined, rowCount: number): void;
313
+ }
314
+
315
+ export interface IRenderDebouncerWithCallback extends IRenderDebouncer {
316
+ addRefreshCallback(callback: FrameRequestCallback): number;
317
+ }
@@ -0,0 +1,276 @@
1
+ /**
2
+ * Copyright (c) 2016 The xterm.js authors. All rights reserved.
3
+ * @license MIT
4
+ */
5
+
6
+ import { Disposable } from 'common/Lifecycle';
7
+ import { addDisposableDomListener } from 'browser/Lifecycle';
8
+ import { IColorSet, IViewport } from 'browser/Types';
9
+ import { ICharSizeService, IRenderService } from 'browser/services/Services';
10
+ import { IBufferService, IOptionsService } from 'common/services/Services';
11
+ import { IBuffer } from 'common/buffer/Types';
12
+ import { IRenderDimensions } from 'browser/renderer/Types';
13
+
14
+ const FALLBACK_SCROLL_BAR_WIDTH = 15;
15
+
16
+ /**
17
+ * Represents the viewport of a terminal, the visible area within the larger buffer of output.
18
+ * Logic for the virtual scroll bar is included in this object.
19
+ */
20
+ export class Viewport extends Disposable implements IViewport {
21
+ public scrollBarWidth: number = 0;
22
+ private _currentRowHeight: number = 0;
23
+ private _currentScaledCellHeight: number = 0;
24
+ private _lastRecordedBufferLength: number = 0;
25
+ private _lastRecordedViewportHeight: number = 0;
26
+ private _lastRecordedBufferHeight: number = 0;
27
+ private _lastTouchY: number = 0;
28
+ private _lastScrollTop: number = 0;
29
+ private _activeBuffer: IBuffer;
30
+ private _renderDimensions: IRenderDimensions;
31
+
32
+ // Stores a partial line amount when scrolling, this is used to keep track of how much of a line
33
+ // is scrolled so we can "scroll" over partial lines and feel natural on touchpads. This is a
34
+ // quick fix and could have a more robust solution in place that reset the value when needed.
35
+ private _wheelPartialScroll: number = 0;
36
+
37
+ private _refreshAnimationFrame: number | null = null;
38
+ private _ignoreNextScrollEvent: boolean = false;
39
+
40
+ constructor(
41
+ private readonly _scrollLines: (amount: number) => void,
42
+ private readonly _viewportElement: HTMLElement,
43
+ private readonly _scrollArea: HTMLElement,
44
+ private readonly _element: HTMLElement,
45
+ @IBufferService private readonly _bufferService: IBufferService,
46
+ @IOptionsService private readonly _optionsService: IOptionsService,
47
+ @ICharSizeService private readonly _charSizeService: ICharSizeService,
48
+ @IRenderService private readonly _renderService: IRenderService
49
+ ) {
50
+ super();
51
+
52
+ // Measure the width of the scrollbar. If it is 0 we can assume it's an OSX overlay scrollbar.
53
+ // Unfortunately the overlay scrollbar would be hidden underneath the screen element in that case,
54
+ // therefore we account for a standard amount to make it visible
55
+ this.scrollBarWidth = (this._viewportElement.offsetWidth - this._scrollArea.offsetWidth) || FALLBACK_SCROLL_BAR_WIDTH;
56
+ this.register(addDisposableDomListener(this._viewportElement, 'scroll', this._onScroll.bind(this)));
57
+
58
+ // Track properties used in performance critical code manually to avoid using slow getters
59
+ this._activeBuffer = this._bufferService.buffer;
60
+ this.register(this._bufferService.buffers.onBufferActivate(e => this._activeBuffer = e.activeBuffer));
61
+ this._renderDimensions = this._renderService.dimensions;
62
+ this.register(this._renderService.onDimensionsChange(e => this._renderDimensions = e));
63
+
64
+ // Perform this async to ensure the ICharSizeService is ready.
65
+ setTimeout(() => this.syncScrollArea(), 0);
66
+ }
67
+
68
+ public onThemeChange(colors: IColorSet): void {
69
+ this._viewportElement.style.backgroundColor = colors.background.css;
70
+ }
71
+
72
+ /**
73
+ * Refreshes row height, setting line-height, viewport height and scroll area height if
74
+ * necessary.
75
+ */
76
+ private _refresh(immediate: boolean): void {
77
+ if (immediate) {
78
+ this._innerRefresh();
79
+ if (this._refreshAnimationFrame !== null) {
80
+ cancelAnimationFrame(this._refreshAnimationFrame);
81
+ }
82
+ return;
83
+ }
84
+ if (this._refreshAnimationFrame === null) {
85
+ this._refreshAnimationFrame = requestAnimationFrame(() => this._innerRefresh());
86
+ }
87
+ }
88
+
89
+ private _innerRefresh(): void {
90
+ if (this._charSizeService.height > 0) {
91
+ this._currentRowHeight = this._renderService.dimensions.scaledCellHeight / window.devicePixelRatio;
92
+ this._currentScaledCellHeight = this._renderService.dimensions.scaledCellHeight;
93
+ this._lastRecordedViewportHeight = this._viewportElement.offsetHeight;
94
+ const newBufferHeight = Math.round(this._currentRowHeight * this._lastRecordedBufferLength) + (this._lastRecordedViewportHeight - this._renderService.dimensions.canvasHeight);
95
+ if (this._lastRecordedBufferHeight !== newBufferHeight) {
96
+ this._lastRecordedBufferHeight = newBufferHeight;
97
+ this._scrollArea.style.height = this._lastRecordedBufferHeight + 'px';
98
+ }
99
+ }
100
+
101
+ // Sync scrollTop
102
+ const scrollTop = this._bufferService.buffer.ydisp * this._currentRowHeight;
103
+ if (this._viewportElement.scrollTop !== scrollTop) {
104
+ // Ignore the next scroll event which will be triggered by setting the scrollTop as we do not
105
+ // want this event to scroll the terminal
106
+ this._ignoreNextScrollEvent = true;
107
+ this._viewportElement.scrollTop = scrollTop;
108
+ }
109
+
110
+ this._refreshAnimationFrame = null;
111
+ }
112
+
113
+ /**
114
+ * Updates dimensions and synchronizes the scroll area if necessary.
115
+ */
116
+ public syncScrollArea(immediate: boolean = false): void {
117
+ // If buffer height changed
118
+ if (this._lastRecordedBufferLength !== this._bufferService.buffer.lines.length) {
119
+ this._lastRecordedBufferLength = this._bufferService.buffer.lines.length;
120
+ this._refresh(immediate);
121
+ return;
122
+ }
123
+
124
+ // If viewport height changed
125
+ if (this._lastRecordedViewportHeight !== this._renderService.dimensions.canvasHeight) {
126
+ this._refresh(immediate);
127
+ return;
128
+ }
129
+
130
+ // If the buffer position doesn't match last scroll top
131
+ if (this._lastScrollTop !== this._activeBuffer.ydisp * this._currentRowHeight) {
132
+ this._refresh(immediate);
133
+ return;
134
+ }
135
+
136
+ // If row height changed
137
+ if (this._renderDimensions.scaledCellHeight !== this._currentScaledCellHeight) {
138
+ this._refresh(immediate);
139
+ return;
140
+ }
141
+ }
142
+
143
+ /**
144
+ * Handles scroll events on the viewport, calculating the new viewport and requesting the
145
+ * terminal to scroll to it.
146
+ * @param ev The scroll event.
147
+ */
148
+ private _onScroll(ev: Event): void {
149
+ // Record current scroll top position
150
+ this._lastScrollTop = this._viewportElement.scrollTop;
151
+
152
+ // Don't attempt to scroll if the element is not visible, otherwise scrollTop will be corrupt
153
+ // which causes the terminal to scroll the buffer to the top
154
+ if (!this._viewportElement.offsetParent) {
155
+ return;
156
+ }
157
+
158
+ // Ignore the event if it was flagged to ignore (when the source of the event is from Viewport)
159
+ if (this._ignoreNextScrollEvent) {
160
+ this._ignoreNextScrollEvent = false;
161
+ // Still trigger the scroll so lines get refreshed
162
+ this._scrollLines(0);
163
+ return;
164
+ }
165
+
166
+ const newRow = Math.round(this._lastScrollTop / this._currentRowHeight);
167
+ const diff = newRow - this._bufferService.buffer.ydisp;
168
+ this._scrollLines(diff);
169
+ }
170
+
171
+ /**
172
+ * Handles bubbling of scroll event in case the viewport has reached top or bottom
173
+ * @param ev The scroll event.
174
+ * @param amount The amount scrolled
175
+ */
176
+ private _bubbleScroll(ev: Event, amount: number): boolean {
177
+ const scrollPosFromTop = this._viewportElement.scrollTop + this._lastRecordedViewportHeight;
178
+ if ((amount < 0 && this._viewportElement.scrollTop !== 0) ||
179
+ (amount > 0 && scrollPosFromTop < this._lastRecordedBufferHeight)) {
180
+ if (ev.cancelable) {
181
+ ev.preventDefault();
182
+ }
183
+ return false;
184
+ }
185
+ return true;
186
+ }
187
+
188
+ /**
189
+ * Handles mouse wheel events by adjusting the viewport's scrollTop and delegating the actual
190
+ * scrolling to `onScroll`, this event needs to be attached manually by the consumer of
191
+ * `Viewport`.
192
+ * @param ev The mouse wheel event.
193
+ */
194
+ public onWheel(ev: WheelEvent): boolean {
195
+ const amount = this._getPixelsScrolled(ev);
196
+ if (amount === 0) {
197
+ return false;
198
+ }
199
+ this._viewportElement.scrollTop += amount;
200
+ return this._bubbleScroll(ev, amount);
201
+ }
202
+
203
+ private _getPixelsScrolled(ev: WheelEvent): number {
204
+ // Do nothing if it's not a vertical scroll event
205
+ if (ev.deltaY === 0 || ev.shiftKey) {
206
+ return 0;
207
+ }
208
+
209
+ // Fallback to WheelEvent.DOM_DELTA_PIXEL
210
+ let amount = this._applyScrollModifier(ev.deltaY, ev);
211
+ if (ev.deltaMode === WheelEvent.DOM_DELTA_LINE) {
212
+ amount *= this._currentRowHeight;
213
+ } else if (ev.deltaMode === WheelEvent.DOM_DELTA_PAGE) {
214
+ amount *= this._currentRowHeight * this._bufferService.rows;
215
+ }
216
+ return amount;
217
+ }
218
+
219
+ /**
220
+ * Gets the number of pixels scrolled by the mouse event taking into account what type of delta
221
+ * is being used.
222
+ * @param ev The mouse wheel event.
223
+ */
224
+ public getLinesScrolled(ev: WheelEvent): number {
225
+ // Do nothing if it's not a vertical scroll event
226
+ if (ev.deltaY === 0 || ev.shiftKey) {
227
+ return 0;
228
+ }
229
+
230
+ // Fallback to WheelEvent.DOM_DELTA_LINE
231
+ let amount = this._applyScrollModifier(ev.deltaY, ev);
232
+ if (ev.deltaMode === WheelEvent.DOM_DELTA_PIXEL) {
233
+ amount /= this._currentRowHeight + 0.0; // Prevent integer division
234
+ this._wheelPartialScroll += amount;
235
+ amount = Math.floor(Math.abs(this._wheelPartialScroll)) * (this._wheelPartialScroll > 0 ? 1 : -1);
236
+ this._wheelPartialScroll %= 1;
237
+ } else if (ev.deltaMode === WheelEvent.DOM_DELTA_PAGE) {
238
+ amount *= this._bufferService.rows;
239
+ }
240
+ return amount;
241
+ }
242
+
243
+ private _applyScrollModifier(amount: number, ev: WheelEvent): number {
244
+ const modifier = this._optionsService.rawOptions.fastScrollModifier;
245
+ // Multiply the scroll speed when the modifier is down
246
+ if ((modifier === 'alt' && ev.altKey) ||
247
+ (modifier === 'ctrl' && ev.ctrlKey) ||
248
+ (modifier === 'shift' && ev.shiftKey)) {
249
+ return amount * this._optionsService.rawOptions.fastScrollSensitivity * this._optionsService.rawOptions.scrollSensitivity;
250
+ }
251
+
252
+ return amount * this._optionsService.rawOptions.scrollSensitivity;
253
+ }
254
+
255
+ /**
256
+ * Handles the touchstart event, recording the touch occurred.
257
+ * @param ev The touch event.
258
+ */
259
+ public onTouchStart(ev: TouchEvent): void {
260
+ this._lastTouchY = ev.touches[0].pageY;
261
+ }
262
+
263
+ /**
264
+ * Handles the touchmove event, scrolling the viewport if the position shifted.
265
+ * @param ev The touch event.
266
+ */
267
+ public onTouchMove(ev: TouchEvent): boolean {
268
+ const deltaY = this._lastTouchY - ev.touches[0].pageY;
269
+ this._lastTouchY = ev.touches[0].pageY;
270
+ if (deltaY === 0) {
271
+ return false;
272
+ }
273
+ this._viewportElement.scrollTop += deltaY;
274
+ return this._bubbleScroll(ev, deltaY);
275
+ }
276
+ }