@xterm/xterm 6.1.0-beta.23 → 6.1.0-beta.231

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 (160) hide show
  1. package/README.md +62 -38
  2. package/css/xterm.css +29 -22
  3. package/lib/xterm.js +1 -1
  4. package/lib/xterm.js.map +1 -1
  5. package/lib/xterm.mjs +8 -34
  6. package/lib/xterm.mjs.map +4 -4
  7. package/package.json +25 -22
  8. package/src/browser/AccessibilityManager.ts +11 -6
  9. package/src/browser/Clipboard.ts +6 -3
  10. package/src/browser/CoreBrowserTerminal.ts +149 -319
  11. package/src/browser/Dom.ts +178 -0
  12. package/src/browser/Linkifier.ts +11 -11
  13. package/src/browser/OscLinkProvider.ts +82 -14
  14. package/src/browser/RenderDebouncer.ts +2 -2
  15. package/src/browser/TimeBasedDebouncer.ts +2 -2
  16. package/src/browser/Types.ts +12 -11
  17. package/src/browser/Viewport.ts +55 -20
  18. package/src/browser/decorations/BufferDecorationRenderer.ts +1 -1
  19. package/src/browser/decorations/OverviewRulerRenderer.ts +33 -17
  20. package/src/browser/input/CompositionHelper.ts +44 -8
  21. package/src/browser/public/Terminal.ts +25 -28
  22. package/src/browser/renderer/dom/DomRenderer.ts +242 -76
  23. package/src/browser/renderer/dom/DomRendererRowFactory.ts +19 -13
  24. package/src/browser/renderer/dom/WidthCache.ts +54 -52
  25. package/src/browser/renderer/shared/Constants.ts +7 -0
  26. package/src/browser/renderer/shared/TextBlinkStateManager.ts +97 -0
  27. package/src/browser/renderer/shared/Types.ts +8 -2
  28. package/src/browser/scrollable/abstractScrollbar.ts +300 -0
  29. package/src/browser/scrollable/fastDomNode.ts +126 -0
  30. package/src/browser/scrollable/globalPointerMoveMonitor.ts +90 -0
  31. package/src/browser/scrollable/horizontalScrollbar.ts +85 -0
  32. package/src/browser/scrollable/mouseEvent.ts +292 -0
  33. package/src/browser/scrollable/scrollable.ts +486 -0
  34. package/src/browser/scrollable/scrollableElement.ts +581 -0
  35. package/src/browser/scrollable/scrollableElementOptions.ts +161 -0
  36. package/src/browser/scrollable/scrollbarArrow.ts +110 -0
  37. package/src/browser/scrollable/scrollbarState.ts +246 -0
  38. package/src/browser/scrollable/scrollbarVisibilityController.ts +113 -0
  39. package/src/browser/scrollable/touch.ts +485 -0
  40. package/src/browser/scrollable/verticalScrollbar.ts +143 -0
  41. package/src/browser/scrollable/widget.ts +23 -0
  42. package/src/browser/services/CharSizeService.ts +2 -2
  43. package/src/browser/services/CoreBrowserService.ts +7 -5
  44. package/src/browser/services/KeyboardService.ts +67 -0
  45. package/src/browser/services/LinkProviderService.ts +1 -1
  46. package/src/browser/services/MouseCoordsService.ts +47 -0
  47. package/src/browser/services/MouseService.ts +518 -25
  48. package/src/browser/services/RenderService.ts +28 -16
  49. package/src/browser/services/SelectionService.ts +45 -39
  50. package/src/browser/services/Services.ts +40 -17
  51. package/src/browser/services/ThemeService.ts +2 -2
  52. package/src/common/Async.ts +141 -0
  53. package/src/common/CircularList.ts +2 -2
  54. package/src/common/Color.ts +8 -0
  55. package/src/common/CoreTerminal.ts +31 -21
  56. package/src/common/Event.ts +118 -0
  57. package/src/common/InputHandler.ts +283 -81
  58. package/src/common/Lifecycle.ts +113 -0
  59. package/src/common/Platform.ts +13 -3
  60. package/src/common/SortedList.ts +7 -3
  61. package/src/common/TaskQueue.ts +14 -5
  62. package/src/common/Types.ts +51 -31
  63. package/src/common/Version.ts +9 -0
  64. package/src/common/buffer/Buffer.ts +34 -19
  65. package/src/common/buffer/BufferLine.ts +133 -65
  66. package/src/common/buffer/BufferLineStringCache.ts +69 -0
  67. package/src/common/buffer/BufferSet.ts +11 -6
  68. package/src/common/buffer/CellData.ts +57 -0
  69. package/src/common/buffer/Marker.ts +2 -2
  70. package/src/common/buffer/Types.ts +6 -2
  71. package/src/common/data/EscapeSequences.ts +71 -70
  72. package/src/common/input/Keyboard.ts +14 -7
  73. package/src/common/input/KittyKeyboard.ts +526 -0
  74. package/src/common/input/Win32InputMode.ts +297 -0
  75. package/src/common/input/WriteBuffer.ts +69 -32
  76. package/src/common/input/XParseColor.ts +2 -2
  77. package/src/common/parser/ApcParser.ts +197 -0
  78. package/src/common/parser/Constants.ts +14 -4
  79. package/src/common/parser/DcsParser.ts +5 -5
  80. package/src/common/parser/EscapeSequenceParser.ts +205 -63
  81. package/src/common/parser/OscParser.ts +5 -5
  82. package/src/common/parser/Params.ts +27 -8
  83. package/src/common/parser/Types.ts +36 -2
  84. package/src/common/public/BufferLineApiView.ts +2 -2
  85. package/src/common/public/BufferNamespaceApi.ts +3 -3
  86. package/src/common/public/ParserApi.ts +3 -0
  87. package/src/common/services/BufferService.ts +14 -9
  88. package/src/common/services/CharsetService.ts +4 -0
  89. package/src/common/services/CoreService.ts +18 -4
  90. package/src/common/services/DecorationService.ts +258 -8
  91. package/src/common/services/LogService.ts +1 -31
  92. package/src/common/services/{CoreMouseService.ts → MouseStateService.ts} +21 -132
  93. package/src/common/services/OptionsService.ts +13 -4
  94. package/src/common/services/ServiceRegistry.ts +9 -7
  95. package/src/common/services/Services.ts +49 -40
  96. package/src/common/services/UnicodeService.ts +1 -1
  97. package/typings/xterm.d.ts +318 -34
  98. package/src/common/TypedArrayUtils.ts +0 -17
  99. package/src/vs/base/browser/browser.ts +0 -141
  100. package/src/vs/base/browser/canIUse.ts +0 -49
  101. package/src/vs/base/browser/dom.ts +0 -2369
  102. package/src/vs/base/browser/fastDomNode.ts +0 -316
  103. package/src/vs/base/browser/globalPointerMoveMonitor.ts +0 -112
  104. package/src/vs/base/browser/iframe.ts +0 -135
  105. package/src/vs/base/browser/keyboardEvent.ts +0 -213
  106. package/src/vs/base/browser/mouseEvent.ts +0 -229
  107. package/src/vs/base/browser/touch.ts +0 -372
  108. package/src/vs/base/browser/ui/scrollbar/abstractScrollbar.ts +0 -303
  109. package/src/vs/base/browser/ui/scrollbar/horizontalScrollbar.ts +0 -114
  110. package/src/vs/base/browser/ui/scrollbar/scrollableElement.ts +0 -720
  111. package/src/vs/base/browser/ui/scrollbar/scrollableElementOptions.ts +0 -165
  112. package/src/vs/base/browser/ui/scrollbar/scrollbarArrow.ts +0 -114
  113. package/src/vs/base/browser/ui/scrollbar/scrollbarState.ts +0 -243
  114. package/src/vs/base/browser/ui/scrollbar/scrollbarVisibilityController.ts +0 -118
  115. package/src/vs/base/browser/ui/scrollbar/verticalScrollbar.ts +0 -116
  116. package/src/vs/base/browser/ui/widget.ts +0 -57
  117. package/src/vs/base/browser/window.ts +0 -14
  118. package/src/vs/base/common/arrays.ts +0 -887
  119. package/src/vs/base/common/arraysFind.ts +0 -202
  120. package/src/vs/base/common/assert.ts +0 -71
  121. package/src/vs/base/common/async.ts +0 -1992
  122. package/src/vs/base/common/cancellation.ts +0 -148
  123. package/src/vs/base/common/charCode.ts +0 -450
  124. package/src/vs/base/common/collections.ts +0 -140
  125. package/src/vs/base/common/decorators.ts +0 -130
  126. package/src/vs/base/common/equals.ts +0 -146
  127. package/src/vs/base/common/errors.ts +0 -303
  128. package/src/vs/base/common/event.ts +0 -1778
  129. package/src/vs/base/common/functional.ts +0 -32
  130. package/src/vs/base/common/hash.ts +0 -316
  131. package/src/vs/base/common/iterator.ts +0 -159
  132. package/src/vs/base/common/keyCodes.ts +0 -526
  133. package/src/vs/base/common/keybindings.ts +0 -284
  134. package/src/vs/base/common/lazy.ts +0 -47
  135. package/src/vs/base/common/lifecycle.ts +0 -801
  136. package/src/vs/base/common/linkedList.ts +0 -142
  137. package/src/vs/base/common/map.ts +0 -202
  138. package/src/vs/base/common/numbers.ts +0 -98
  139. package/src/vs/base/common/observable.ts +0 -76
  140. package/src/vs/base/common/observableInternal/api.ts +0 -31
  141. package/src/vs/base/common/observableInternal/autorun.ts +0 -281
  142. package/src/vs/base/common/observableInternal/base.ts +0 -489
  143. package/src/vs/base/common/observableInternal/debugName.ts +0 -145
  144. package/src/vs/base/common/observableInternal/derived.ts +0 -428
  145. package/src/vs/base/common/observableInternal/lazyObservableValue.ts +0 -146
  146. package/src/vs/base/common/observableInternal/logging.ts +0 -328
  147. package/src/vs/base/common/observableInternal/promise.ts +0 -209
  148. package/src/vs/base/common/observableInternal/utils.ts +0 -610
  149. package/src/vs/base/common/platform.ts +0 -281
  150. package/src/vs/base/common/scrollable.ts +0 -522
  151. package/src/vs/base/common/sequence.ts +0 -34
  152. package/src/vs/base/common/stopwatch.ts +0 -43
  153. package/src/vs/base/common/strings.ts +0 -557
  154. package/src/vs/base/common/symbols.ts +0 -9
  155. package/src/vs/base/common/uint.ts +0 -59
  156. package/src/vs/patches/nls.ts +0 -90
  157. package/src/vs/typings/base-common.d.ts +0 -20
  158. package/src/vs/typings/require.d.ts +0 -42
  159. package/src/vs/typings/vscode-globals-nls.d.ts +0 -36
  160. package/src/vs/typings/vscode-globals-product.d.ts +0 -33
@@ -0,0 +1,161 @@
1
+ /*---------------------------------------------------------------------------------------------
2
+ * Copyright (c) Microsoft Corporation. All rights reserved.
3
+ * Licensed under the MIT License. See License.txt in the project root for license information.
4
+ *--------------------------------------------------------------------------------------------*/
5
+
6
+ import { ScrollbarVisibility } from './scrollable';
7
+
8
+ export interface IScrollableElementCreationOptions {
9
+ /**
10
+ * The scrollable element should not do any DOM mutations until renderNow() is called.
11
+ * Defaults to false.
12
+ */
13
+ lazyRender?: boolean;
14
+ /**
15
+ * CSS Class name for the scrollable element.
16
+ */
17
+ className?: string;
18
+ /**
19
+ * Drop subtle horizontal and vertical shadows.
20
+ * Defaults to false.
21
+ */
22
+ useShadows?: boolean;
23
+ /**
24
+ * Handle mouse wheel (listen to mouse wheel scrolling).
25
+ * Defaults to true
26
+ */
27
+ handleMouseWheel?: boolean;
28
+ /**
29
+ * If mouse wheel is handled, make mouse wheel scrolling smooth.
30
+ * Defaults to true.
31
+ */
32
+ mouseWheelSmoothScroll?: boolean;
33
+ /**
34
+ * Flip axes. Treat vertical scrolling like horizontal and vice-versa.
35
+ * Defaults to false.
36
+ */
37
+ flipAxes?: boolean;
38
+ /**
39
+ * If enabled, will scroll horizontally when scrolling vertical.
40
+ * Defaults to false.
41
+ */
42
+ scrollYToX?: boolean;
43
+ /**
44
+ * Consume all mouse wheel events if a scrollbar is needed (i.e. scrollSize > size).
45
+ * Defaults to false.
46
+ */
47
+ consumeMouseWheelIfScrollbarIsNeeded?: boolean;
48
+ /**
49
+ * Always consume mouse wheel events, even when scrolling is no longer possible.
50
+ * Defaults to false.
51
+ */
52
+ alwaysConsumeMouseWheel?: boolean;
53
+ /**
54
+ * A multiplier to be used on the `deltaX` and `deltaY` of mouse wheel scroll events.
55
+ * Defaults to 1.
56
+ */
57
+ mouseWheelScrollSensitivity?: number;
58
+ /**
59
+ * FastScrolling mulitplier speed when pressing `Alt`
60
+ * Defaults to 5.
61
+ */
62
+ fastScrollSensitivity?: number;
63
+ /**
64
+ * Whether the scrollable will only scroll along the predominant axis when scrolling both
65
+ * vertically and horizontally at the same time.
66
+ * Prevents horizontal drift when scrolling vertically on a trackpad.
67
+ * Defaults to true.
68
+ */
69
+ scrollPredominantAxis?: boolean;
70
+ /**
71
+ * The dom node events should be bound to.
72
+ * If no listenOnDomNode is provided, the constructor dom node is used.
73
+ */
74
+ listenOnDomNode?: HTMLElement;
75
+ /**
76
+ * Control the visibility of the horizontal scrollbar.
77
+ * Accepted values: 'auto' (on mouse over), 'visible' (always visible), 'hidden' (never visible)
78
+ * Defaults to 'auto'.
79
+ */
80
+ horizontal?: ScrollbarVisibility;
81
+ /**
82
+ * Height (in px) of the horizontal scrollbar.
83
+ * Defaults to 10.
84
+ */
85
+ horizontalScrollbarSize?: number;
86
+ /**
87
+ * Height (in px) of the horizontal scrollbar slider.
88
+ * Defaults to `horizontalScrollbarSize`
89
+ */
90
+ horizontalSliderSize?: number;
91
+ /**
92
+ * Render arrows (left/right) for the horizontal scrollbar.
93
+ * Defaults to false.
94
+ */
95
+ horizontalHasArrows?: boolean;
96
+ /**
97
+ * Control the visibility of the vertical scrollbar.
98
+ * Accepted values: 'auto' (on mouse over), 'visible' (always visible), 'hidden' (never visible)
99
+ * Defaults to 'auto'.
100
+ */
101
+ vertical?: ScrollbarVisibility;
102
+ /**
103
+ * Width (in px) of the vertical scrollbar.
104
+ * Defaults to 10.
105
+ */
106
+ verticalScrollbarSize?: number;
107
+ /**
108
+ * Width (in px) of the vertical scrollbar slider.
109
+ * Defaults to `verticalScrollbarSize`
110
+ */
111
+ verticalSliderSize?: number;
112
+ /**
113
+ * Render arrows (top/bottom) for the vertical scrollbar.
114
+ * Defaults to false.
115
+ */
116
+ verticalHasArrows?: boolean;
117
+ /**
118
+ * Scroll gutter clicks move by page vs. jump to position.
119
+ * Defaults to false.
120
+ */
121
+ scrollByPage?: boolean;
122
+ }
123
+
124
+ export interface IScrollableElementChangeOptions {
125
+ handleMouseWheel?: boolean;
126
+ mouseWheelScrollSensitivity?: number;
127
+ fastScrollSensitivity?: number;
128
+ scrollPredominantAxis?: boolean;
129
+ horizontal?: ScrollbarVisibility;
130
+ horizontalScrollbarSize?: number;
131
+ horizontalHasArrows?: boolean;
132
+ vertical?: ScrollbarVisibility;
133
+ verticalScrollbarSize?: number;
134
+ verticalHasArrows?: boolean;
135
+ scrollByPage?: boolean;
136
+ }
137
+
138
+ export interface IScrollableElementResolvedOptions {
139
+ lazyRender: boolean;
140
+ className: string;
141
+ useShadows: boolean;
142
+ handleMouseWheel: boolean;
143
+ flipAxes: boolean;
144
+ scrollYToX: boolean;
145
+ consumeMouseWheelIfScrollbarIsNeeded: boolean;
146
+ alwaysConsumeMouseWheel: boolean;
147
+ mouseWheelScrollSensitivity: number;
148
+ fastScrollSensitivity: number;
149
+ scrollPredominantAxis: boolean;
150
+ mouseWheelSmoothScroll: boolean;
151
+ listenOnDomNode: HTMLElement | null;
152
+ horizontal: ScrollbarVisibility;
153
+ horizontalScrollbarSize: number;
154
+ horizontalSliderSize: number;
155
+ horizontalHasArrows: boolean;
156
+ vertical: ScrollbarVisibility;
157
+ verticalScrollbarSize: number;
158
+ verticalSliderSize: number;
159
+ verticalHasArrows: boolean;
160
+ scrollByPage: boolean;
161
+ }
@@ -0,0 +1,110 @@
1
+ /*---------------------------------------------------------------------------------------------
2
+ * Copyright (c) Microsoft Corporation. All rights reserved.
3
+ * Licensed under the MIT License. See License.txt in the project root for license information.
4
+ *--------------------------------------------------------------------------------------------*/
5
+
6
+ import { GlobalPointerMoveMonitor } from './globalPointerMoveMonitor';
7
+ import { Widget } from './widget';
8
+ import { TimeoutTimer } from 'common/Async';
9
+ import * as dom from '../Dom';
10
+
11
+ export interface IScrollbarArrowOptions {
12
+ handleActivate: () => void;
13
+ className: string;
14
+ // icon: ThemeIcon;
15
+
16
+ bgWidth: number;
17
+ bgHeight: number;
18
+
19
+ top?: number;
20
+ left?: number;
21
+ bottom?: number;
22
+ right?: number;
23
+ }
24
+
25
+ export class ScrollbarArrow extends Widget {
26
+
27
+ private _handleActivate: () => void;
28
+ public bgDomNode: HTMLElement;
29
+ public domNode: HTMLElement;
30
+ private _pointerdownRepeatTimer: dom.WindowIntervalTimer;
31
+ private _pointerdownScheduleRepeatTimer: TimeoutTimer;
32
+ private _pointerMoveMonitor: GlobalPointerMoveMonitor;
33
+
34
+ constructor(opts: IScrollbarArrowOptions) {
35
+ super();
36
+ this._handleActivate = opts.handleActivate;
37
+
38
+ this.bgDomNode = document.createElement('div');
39
+ this.bgDomNode.className = 'xterm-arrow-background';
40
+ this.bgDomNode.style.position = 'absolute';
41
+ this.bgDomNode.style.width = opts.bgWidth + 'px';
42
+ this.bgDomNode.style.height = opts.bgHeight + 'px';
43
+ if (typeof opts.top !== 'undefined') {
44
+ this.bgDomNode.style.top = '0px';
45
+ }
46
+ if (typeof opts.left !== 'undefined') {
47
+ this.bgDomNode.style.left = '0px';
48
+ }
49
+ if (typeof opts.bottom !== 'undefined') {
50
+ this.bgDomNode.style.bottom = '0px';
51
+ }
52
+ if (typeof opts.right !== 'undefined') {
53
+ this.bgDomNode.style.right = '0px';
54
+ }
55
+
56
+ this.domNode = document.createElement('div');
57
+ this.domNode.className = opts.className;
58
+ // this.domNode.classList.add(...ThemeIcon.asClassNameArray(opts.icon));
59
+
60
+ this.domNode.style.position = 'absolute';
61
+ const arrowSize = Math.min(opts.bgWidth, opts.bgHeight);
62
+ this.domNode.style.width = arrowSize + 'px';
63
+ this.domNode.style.height = arrowSize + 'px';
64
+ if (typeof opts.top !== 'undefined') {
65
+ this.domNode.style.top = opts.top + 'px';
66
+ }
67
+ if (typeof opts.left !== 'undefined') {
68
+ this.domNode.style.left = opts.left + 'px';
69
+ }
70
+ if (typeof opts.bottom !== 'undefined') {
71
+ this.domNode.style.bottom = opts.bottom + 'px';
72
+ }
73
+ if (typeof opts.right !== 'undefined') {
74
+ this.domNode.style.right = opts.right + 'px';
75
+ }
76
+
77
+ this._pointerMoveMonitor = this._register(new GlobalPointerMoveMonitor());
78
+ this._register(dom.addStandardDisposableListener(this.bgDomNode, dom.eventType.POINTER_DOWN, (e) => this._arrowPointerDown(e)));
79
+ this._register(dom.addStandardDisposableListener(this.domNode, dom.eventType.POINTER_DOWN, (e) => this._arrowPointerDown(e)));
80
+
81
+ this._pointerdownRepeatTimer = this._register(new dom.WindowIntervalTimer());
82
+ this._pointerdownScheduleRepeatTimer = this._register(new TimeoutTimer());
83
+ }
84
+
85
+ private _arrowPointerDown(e: PointerEvent): void {
86
+ if (!e.target || !(e.target instanceof Element)) {
87
+ return;
88
+ }
89
+ const scheduleRepeater = (): void => {
90
+ this._pointerdownRepeatTimer.cancelAndSet(() => this._handleActivate(), 1000 / 24, dom.getWindow(e));
91
+ };
92
+
93
+ this._handleActivate();
94
+ this._pointerdownRepeatTimer.cancel();
95
+ this._pointerdownScheduleRepeatTimer.cancelAndSet(scheduleRepeater, 200);
96
+
97
+ this._pointerMoveMonitor.startMonitoring(
98
+ e.target,
99
+ e.pointerId,
100
+ e.buttons,
101
+ (pointerMoveData) => { /* Intentional empty */ },
102
+ () => {
103
+ this._pointerdownRepeatTimer.cancel();
104
+ this._pointerdownScheduleRepeatTimer.cancel();
105
+ }
106
+ );
107
+
108
+ e.preventDefault();
109
+ }
110
+ }
@@ -0,0 +1,246 @@
1
+ /*---------------------------------------------------------------------------------------------
2
+ * Copyright (c) Microsoft Corporation. All rights reserved.
3
+ * Licensed under the MIT License. See License.txt in the project root for license information.
4
+ *--------------------------------------------------------------------------------------------*/
5
+
6
+ /**
7
+ * The minimal size of the slider (such that it can still be clickable).
8
+ * The slider is artificially enlarged to keep it usable.
9
+ */
10
+ const MINIMUM_SLIDER_SIZE = 20;
11
+
12
+ interface IScrollbarStateComputedValues {
13
+ computedAvailableSize: number;
14
+ computedIsNeeded: boolean;
15
+ computedSliderSize: number;
16
+ computedSliderRatio: number;
17
+ computedSliderPosition: number;
18
+ }
19
+
20
+ export class ScrollbarState {
21
+
22
+ /**
23
+ * For the vertical scrollbar: the width.
24
+ * For the horizontal scrollbar: the height.
25
+ */
26
+ private _scrollbarSize: number;
27
+
28
+ /**
29
+ * For the vertical scrollbar: the height of the pair horizontal scrollbar.
30
+ * For the horizontal scrollbar: the width of the pair vertical scrollbar.
31
+ */
32
+ private _oppositeScrollbarSize: number;
33
+
34
+ /**
35
+ * For the vertical scrollbar: the height of the scrollbar's arrows.
36
+ * For the horizontal scrollbar: the width of the scrollbar's arrows.
37
+ */
38
+ private _arrowSize: number;
39
+
40
+ // --- variables
41
+ /**
42
+ * For the vertical scrollbar: the viewport height.
43
+ * For the horizontal scrollbar: the viewport width.
44
+ */
45
+ private _visibleSize: number;
46
+
47
+ /**
48
+ * For the vertical scrollbar: the scroll height.
49
+ * For the horizontal scrollbar: the scroll width.
50
+ */
51
+ private _scrollSize: number;
52
+
53
+ /**
54
+ * For the vertical scrollbar: the scroll top.
55
+ * For the horizontal scrollbar: the scroll left.
56
+ */
57
+ private _scrollPosition: number;
58
+
59
+ // --- computed variables
60
+
61
+ /**
62
+ * `visibleSize` - `oppositeScrollbarSize`
63
+ */
64
+ private _computedAvailableSize: number;
65
+ /**
66
+ * (`scrollSize` > 0 && `scrollSize` > `visibleSize`)
67
+ */
68
+ private _computedIsNeeded: boolean;
69
+
70
+ private _computedSliderSize: number;
71
+ private _computedSliderRatio: number;
72
+ private _computedSliderPosition: number;
73
+
74
+ constructor(arrowSize: number, scrollbarSize: number, oppositeScrollbarSize: number, visibleSize: number, scrollSize: number, scrollPosition: number) {
75
+ this._scrollbarSize = Math.round(scrollbarSize);
76
+ this._oppositeScrollbarSize = Math.round(oppositeScrollbarSize);
77
+ this._arrowSize = Math.round(arrowSize);
78
+
79
+ this._visibleSize = visibleSize;
80
+ this._scrollSize = scrollSize;
81
+ this._scrollPosition = scrollPosition;
82
+
83
+ this._computedAvailableSize = 0;
84
+ this._computedIsNeeded = false;
85
+ this._computedSliderSize = 0;
86
+ this._computedSliderRatio = 0;
87
+ this._computedSliderPosition = 0;
88
+
89
+ this._refreshComputedValues();
90
+ }
91
+
92
+ public clone(): ScrollbarState {
93
+ return new ScrollbarState(this._arrowSize, this._scrollbarSize, this._oppositeScrollbarSize, this._visibleSize, this._scrollSize, this._scrollPosition);
94
+ }
95
+
96
+ public setVisibleSize(visibleSize: number): boolean {
97
+ const iVisibleSize = Math.round(visibleSize);
98
+ if (this._visibleSize !== iVisibleSize) {
99
+ this._visibleSize = iVisibleSize;
100
+ this._refreshComputedValues();
101
+ return true;
102
+ }
103
+ return false;
104
+ }
105
+
106
+ public setScrollSize(scrollSize: number): boolean {
107
+ const iScrollSize = Math.round(scrollSize);
108
+ if (this._scrollSize !== iScrollSize) {
109
+ this._scrollSize = iScrollSize;
110
+ this._refreshComputedValues();
111
+ return true;
112
+ }
113
+ return false;
114
+ }
115
+
116
+ public setScrollPosition(scrollPosition: number): boolean {
117
+ const iScrollPosition = Math.round(scrollPosition);
118
+ if (this._scrollPosition !== iScrollPosition) {
119
+ this._scrollPosition = iScrollPosition;
120
+ this._refreshComputedValues();
121
+ return true;
122
+ }
123
+ return false;
124
+ }
125
+
126
+ public setScrollbarSize(scrollbarSize: number): void {
127
+ this._scrollbarSize = Math.round(scrollbarSize);
128
+ }
129
+
130
+ public setArrowSize(arrowSize: number): void {
131
+ const iArrowSize = Math.round(arrowSize);
132
+ if (this._arrowSize !== iArrowSize) {
133
+ this._arrowSize = iArrowSize;
134
+ this._refreshComputedValues();
135
+ }
136
+ }
137
+
138
+ public setOppositeScrollbarSize(oppositeScrollbarSize: number): void {
139
+ this._oppositeScrollbarSize = Math.round(oppositeScrollbarSize);
140
+ }
141
+
142
+ private static _computeValues(
143
+ oppositeScrollbarSize: number,
144
+ arrowSize: number,
145
+ visibleSize: number,
146
+ scrollSize: number,
147
+ scrollPosition: number
148
+ ): IScrollbarStateComputedValues {
149
+ const computedAvailableSize = Math.max(0, visibleSize - oppositeScrollbarSize);
150
+ const computedRepresentableSize = Math.max(0, computedAvailableSize - 2 * arrowSize);
151
+ const computedIsNeeded = (scrollSize > 0 && scrollSize > visibleSize);
152
+
153
+ if (!computedIsNeeded) {
154
+ return {
155
+ computedAvailableSize: Math.round(computedAvailableSize),
156
+ computedIsNeeded: computedIsNeeded,
157
+ computedSliderSize: Math.round(computedRepresentableSize),
158
+ computedSliderRatio: 0,
159
+ computedSliderPosition: 0,
160
+ };
161
+ }
162
+
163
+ const computedSliderSize = Math.round(Math.max(MINIMUM_SLIDER_SIZE, Math.floor(visibleSize * computedRepresentableSize / scrollSize)));
164
+
165
+ const computedSliderRatio = (computedRepresentableSize - computedSliderSize) / (scrollSize - visibleSize);
166
+ const computedSliderPosition = (scrollPosition * computedSliderRatio);
167
+
168
+ return {
169
+ computedAvailableSize: Math.round(computedAvailableSize),
170
+ computedIsNeeded: computedIsNeeded,
171
+ computedSliderSize: Math.round(computedSliderSize),
172
+ computedSliderRatio: computedSliderRatio,
173
+ computedSliderPosition: Math.round(computedSliderPosition),
174
+ };
175
+ }
176
+
177
+ private _refreshComputedValues(): void {
178
+ const r = ScrollbarState._computeValues(this._oppositeScrollbarSize, this._arrowSize, this._visibleSize, this._scrollSize, this._scrollPosition);
179
+ this._computedAvailableSize = r.computedAvailableSize;
180
+ this._computedIsNeeded = r.computedIsNeeded;
181
+ this._computedSliderSize = r.computedSliderSize;
182
+ this._computedSliderRatio = r.computedSliderRatio;
183
+ this._computedSliderPosition = r.computedSliderPosition;
184
+ }
185
+
186
+ public getArrowSize(): number {
187
+ return this._arrowSize;
188
+ }
189
+
190
+ public getScrollPosition(): number {
191
+ return this._scrollPosition;
192
+ }
193
+
194
+ public getRectangleLargeSize(): number {
195
+ return this._computedAvailableSize;
196
+ }
197
+
198
+ public getRectangleSmallSize(): number {
199
+ return this._scrollbarSize;
200
+ }
201
+
202
+ public isNeeded(): boolean {
203
+ return this._computedIsNeeded;
204
+ }
205
+
206
+ public getSliderSize(): number {
207
+ return this._computedSliderSize;
208
+ }
209
+
210
+ public getSliderPosition(): number {
211
+ return this._computedSliderPosition;
212
+ }
213
+
214
+ public getDesiredScrollPositionFromOffset(offset: number): number {
215
+ if (!this._computedIsNeeded) {
216
+ return 0;
217
+ }
218
+
219
+ const desiredSliderPosition = offset - this._arrowSize - this._computedSliderSize / 2;
220
+ return Math.round(desiredSliderPosition / this._computedSliderRatio);
221
+ }
222
+
223
+ public getDesiredScrollPositionFromOffsetPaged(offset: number): number {
224
+ if (!this._computedIsNeeded) {
225
+ return 0;
226
+ }
227
+
228
+ const correctedOffset = offset - this._arrowSize;
229
+ let desiredScrollPosition = this._scrollPosition;
230
+ if (correctedOffset < this._computedSliderPosition) {
231
+ desiredScrollPosition -= this._visibleSize;
232
+ } else {
233
+ desiredScrollPosition += this._visibleSize;
234
+ }
235
+ return desiredScrollPosition;
236
+ }
237
+
238
+ public getDesiredScrollPositionFromDelta(delta: number): number {
239
+ if (!this._computedIsNeeded) {
240
+ return 0;
241
+ }
242
+
243
+ const desiredSliderPosition = this._computedSliderPosition + delta;
244
+ return Math.round(desiredSliderPosition / this._computedSliderRatio);
245
+ }
246
+ }
@@ -0,0 +1,113 @@
1
+ /*---------------------------------------------------------------------------------------------
2
+ * Copyright (c) Microsoft Corporation. All rights reserved.
3
+ * Licensed under the MIT License. See License.txt in the project root for license information.
4
+ *--------------------------------------------------------------------------------------------*/
5
+
6
+ import { FastDomNode } from './fastDomNode';
7
+ import { TimeoutTimer } from 'common/Async';
8
+ import { Disposable } from 'common/Lifecycle';
9
+ import { ScrollbarVisibility } from './scrollable';
10
+
11
+ export class ScrollbarVisibilityController extends Disposable {
12
+ private _visibility: ScrollbarVisibility;
13
+ private _visibleClassName: string;
14
+ private _invisibleClassName: string;
15
+ private _domNode: FastDomNode<HTMLElement> | null;
16
+ private _rawShouldBeVisible: boolean;
17
+ private _shouldBeVisible: boolean;
18
+ private _isNeeded: boolean;
19
+ private _isVisible: boolean;
20
+ private _revealTimer: TimeoutTimer;
21
+
22
+ constructor(visibility: ScrollbarVisibility, visibleClassName: string, invisibleClassName: string) {
23
+ super();
24
+ this._visibility = visibility;
25
+ this._visibleClassName = visibleClassName;
26
+ this._invisibleClassName = invisibleClassName;
27
+ this._domNode = null;
28
+ this._isVisible = false;
29
+ this._isNeeded = false;
30
+ this._rawShouldBeVisible = false;
31
+ this._shouldBeVisible = false;
32
+ this._revealTimer = this._register(new TimeoutTimer());
33
+ }
34
+
35
+ public setVisibility(visibility: ScrollbarVisibility): void {
36
+ if (this._visibility !== visibility) {
37
+ this._visibility = visibility;
38
+ this._updateShouldBeVisible();
39
+ }
40
+ }
41
+
42
+ public setShouldBeVisible(rawShouldBeVisible: boolean): void {
43
+ this._rawShouldBeVisible = rawShouldBeVisible;
44
+ this._updateShouldBeVisible();
45
+ }
46
+
47
+ private _applyVisibilitySetting(): boolean {
48
+ if (this._visibility === ScrollbarVisibility.HIDDEN) {
49
+ return false;
50
+ }
51
+ if (this._visibility === ScrollbarVisibility.VISIBLE) {
52
+ return true;
53
+ }
54
+ return this._rawShouldBeVisible;
55
+ }
56
+
57
+ private _updateShouldBeVisible(): void {
58
+ const shouldBeVisible = this._applyVisibilitySetting();
59
+
60
+ if (this._shouldBeVisible !== shouldBeVisible) {
61
+ this._shouldBeVisible = shouldBeVisible;
62
+ this.ensureVisibility();
63
+ }
64
+ }
65
+
66
+ public setIsNeeded(isNeeded: boolean): void {
67
+ if (this._isNeeded !== isNeeded) {
68
+ this._isNeeded = isNeeded;
69
+ this.ensureVisibility();
70
+ }
71
+ }
72
+
73
+ public setDomNode(domNode: FastDomNode<HTMLElement>): void {
74
+ this._domNode = domNode;
75
+ this._domNode.setClassName(this._invisibleClassName);
76
+
77
+ this.setShouldBeVisible(false);
78
+ }
79
+
80
+ public ensureVisibility(): void {
81
+
82
+ if (!this._isNeeded) {
83
+ this._hide(false);
84
+ return;
85
+ }
86
+
87
+ if (this._shouldBeVisible) {
88
+ this._reveal();
89
+ } else {
90
+ this._hide(true);
91
+ }
92
+ }
93
+
94
+ private _reveal(): void {
95
+ if (this._isVisible) {
96
+ return;
97
+ }
98
+ this._isVisible = true;
99
+
100
+ this._revealTimer.setIfNotSet(() => {
101
+ this._domNode?.setClassName(this._visibleClassName);
102
+ }, 0);
103
+ }
104
+
105
+ private _hide(withFadeAway: boolean): void {
106
+ this._revealTimer.cancel();
107
+ if (!this._isVisible) {
108
+ return;
109
+ }
110
+ this._isVisible = false;
111
+ this._domNode?.setClassName(this._invisibleClassName + (withFadeAway ? ' xterm-fade' : ''));
112
+ }
113
+ }