@xterm/xterm 6.1.0-beta.21 → 6.1.0-beta.211
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/README.md +61 -38
- package/css/xterm.css +29 -22
- package/lib/xterm.js +1 -1
- package/lib/xterm.js.map +1 -1
- package/lib/xterm.mjs +8 -34
- package/lib/xterm.mjs.map +4 -4
- package/package.json +24 -13
- package/src/browser/AccessibilityManager.ts +6 -3
- package/src/browser/Clipboard.ts +6 -3
- package/src/browser/CoreBrowserTerminal.ts +147 -318
- package/src/browser/Dom.ts +178 -0
- package/src/browser/Linkifier.ts +11 -11
- package/src/browser/OscLinkProvider.ts +3 -1
- package/src/browser/RenderDebouncer.ts +2 -2
- package/src/browser/TimeBasedDebouncer.ts +2 -2
- package/src/browser/Types.ts +12 -11
- package/src/browser/Viewport.ts +55 -20
- package/src/browser/decorations/BufferDecorationRenderer.ts +1 -1
- package/src/browser/decorations/OverviewRulerRenderer.ts +33 -17
- package/src/browser/input/CompositionHelper.ts +44 -8
- package/src/browser/public/Terminal.ts +25 -28
- package/src/browser/renderer/dom/DomRenderer.ts +205 -41
- package/src/browser/renderer/dom/DomRendererRowFactory.ts +19 -13
- package/src/browser/renderer/dom/WidthCache.ts +54 -52
- package/src/browser/renderer/shared/Constants.ts +7 -0
- package/src/browser/renderer/shared/TextBlinkStateManager.ts +97 -0
- package/src/browser/renderer/shared/Types.ts +8 -2
- package/src/browser/scrollable/abstractScrollbar.ts +300 -0
- package/src/browser/scrollable/fastDomNode.ts +126 -0
- package/src/browser/scrollable/globalPointerMoveMonitor.ts +90 -0
- package/src/browser/scrollable/horizontalScrollbar.ts +85 -0
- package/src/browser/scrollable/mouseEvent.ts +292 -0
- package/src/browser/scrollable/scrollable.ts +486 -0
- package/src/browser/scrollable/scrollableElement.ts +579 -0
- package/src/browser/scrollable/scrollableElementOptions.ts +161 -0
- package/src/browser/scrollable/scrollbarArrow.ts +110 -0
- package/src/browser/scrollable/scrollbarState.ts +246 -0
- package/src/browser/scrollable/scrollbarVisibilityController.ts +113 -0
- package/src/browser/scrollable/touch.ts +485 -0
- package/src/browser/scrollable/verticalScrollbar.ts +143 -0
- package/src/browser/scrollable/widget.ts +23 -0
- package/src/browser/services/CharSizeService.ts +2 -2
- package/src/browser/services/CoreBrowserService.ts +7 -5
- package/src/browser/services/KeyboardService.ts +67 -0
- package/src/browser/services/LinkProviderService.ts +1 -1
- package/src/browser/services/MouseCoordsService.ts +47 -0
- package/src/browser/services/MouseService.ts +518 -25
- package/src/browser/services/RenderService.ts +22 -15
- package/src/browser/services/SelectionService.ts +16 -8
- package/src/browser/services/Services.ts +40 -17
- package/src/browser/services/ThemeService.ts +2 -2
- package/src/common/Async.ts +105 -0
- package/src/common/CircularList.ts +2 -2
- package/src/common/Color.ts +8 -0
- package/src/common/CoreTerminal.ts +28 -18
- package/src/common/Event.ts +118 -0
- package/src/common/InputHandler.ts +263 -43
- package/src/common/Lifecycle.ts +113 -0
- package/src/common/Platform.ts +13 -3
- package/src/common/SortedList.ts +7 -3
- package/src/common/TaskQueue.ts +14 -5
- package/src/common/Types.ts +35 -15
- package/src/common/Version.ts +9 -0
- package/src/common/buffer/Buffer.ts +20 -14
- package/src/common/buffer/BufferLine.ts +4 -5
- package/src/common/buffer/BufferSet.ts +7 -6
- package/src/common/buffer/CellData.ts +57 -0
- package/src/common/buffer/Marker.ts +2 -2
- package/src/common/buffer/Types.ts +6 -2
- package/src/common/data/EscapeSequences.ts +71 -70
- package/src/common/input/Keyboard.ts +14 -7
- package/src/common/input/KittyKeyboard.ts +519 -0
- package/src/common/input/Win32InputMode.ts +297 -0
- package/src/common/input/WriteBuffer.ts +34 -2
- package/src/common/input/XParseColor.ts +2 -2
- package/src/common/parser/ApcParser.ts +245 -0
- package/src/common/parser/Constants.ts +22 -4
- package/src/common/parser/DcsParser.ts +5 -5
- package/src/common/parser/EscapeSequenceParser.ts +167 -57
- package/src/common/parser/OscParser.ts +5 -5
- package/src/common/parser/Params.ts +13 -0
- package/src/common/parser/Types.ts +36 -2
- package/src/common/public/BufferLineApiView.ts +2 -2
- package/src/common/public/BufferNamespaceApi.ts +2 -2
- package/src/common/public/ParserApi.ts +3 -0
- package/src/common/services/BufferService.ts +8 -5
- package/src/common/services/CharsetService.ts +4 -0
- package/src/common/services/CoreService.ts +18 -4
- package/src/common/services/DecorationService.ts +24 -8
- package/src/common/services/LogService.ts +1 -31
- package/src/common/services/{CoreMouseService.ts → MouseStateService.ts} +21 -132
- package/src/common/services/OptionsService.ts +13 -4
- package/src/common/services/Services.ts +47 -40
- package/src/common/services/UnicodeService.ts +1 -1
- package/typings/xterm.d.ts +316 -32
- package/src/common/TypedArrayUtils.ts +0 -17
- package/src/vs/base/browser/browser.ts +0 -141
- package/src/vs/base/browser/canIUse.ts +0 -49
- package/src/vs/base/browser/dom.ts +0 -2369
- package/src/vs/base/browser/fastDomNode.ts +0 -316
- package/src/vs/base/browser/globalPointerMoveMonitor.ts +0 -112
- package/src/vs/base/browser/iframe.ts +0 -135
- package/src/vs/base/browser/keyboardEvent.ts +0 -213
- package/src/vs/base/browser/mouseEvent.ts +0 -229
- package/src/vs/base/browser/touch.ts +0 -372
- package/src/vs/base/browser/ui/scrollbar/abstractScrollbar.ts +0 -303
- package/src/vs/base/browser/ui/scrollbar/horizontalScrollbar.ts +0 -114
- package/src/vs/base/browser/ui/scrollbar/scrollableElement.ts +0 -720
- package/src/vs/base/browser/ui/scrollbar/scrollableElementOptions.ts +0 -165
- package/src/vs/base/browser/ui/scrollbar/scrollbarArrow.ts +0 -114
- package/src/vs/base/browser/ui/scrollbar/scrollbarState.ts +0 -243
- package/src/vs/base/browser/ui/scrollbar/scrollbarVisibilityController.ts +0 -118
- package/src/vs/base/browser/ui/scrollbar/verticalScrollbar.ts +0 -116
- package/src/vs/base/browser/ui/widget.ts +0 -57
- package/src/vs/base/browser/window.ts +0 -14
- package/src/vs/base/common/arrays.ts +0 -887
- package/src/vs/base/common/arraysFind.ts +0 -202
- package/src/vs/base/common/assert.ts +0 -71
- package/src/vs/base/common/async.ts +0 -1992
- package/src/vs/base/common/cancellation.ts +0 -148
- package/src/vs/base/common/charCode.ts +0 -450
- package/src/vs/base/common/collections.ts +0 -140
- package/src/vs/base/common/decorators.ts +0 -130
- package/src/vs/base/common/equals.ts +0 -146
- package/src/vs/base/common/errors.ts +0 -303
- package/src/vs/base/common/event.ts +0 -1778
- package/src/vs/base/common/functional.ts +0 -32
- package/src/vs/base/common/hash.ts +0 -316
- package/src/vs/base/common/iterator.ts +0 -159
- package/src/vs/base/common/keyCodes.ts +0 -526
- package/src/vs/base/common/keybindings.ts +0 -284
- package/src/vs/base/common/lazy.ts +0 -47
- package/src/vs/base/common/lifecycle.ts +0 -801
- package/src/vs/base/common/linkedList.ts +0 -142
- package/src/vs/base/common/map.ts +0 -202
- package/src/vs/base/common/numbers.ts +0 -98
- package/src/vs/base/common/observable.ts +0 -76
- package/src/vs/base/common/observableInternal/api.ts +0 -31
- package/src/vs/base/common/observableInternal/autorun.ts +0 -281
- package/src/vs/base/common/observableInternal/base.ts +0 -489
- package/src/vs/base/common/observableInternal/debugName.ts +0 -145
- package/src/vs/base/common/observableInternal/derived.ts +0 -428
- package/src/vs/base/common/observableInternal/lazyObservableValue.ts +0 -146
- package/src/vs/base/common/observableInternal/logging.ts +0 -328
- package/src/vs/base/common/observableInternal/promise.ts +0 -209
- package/src/vs/base/common/observableInternal/utils.ts +0 -610
- package/src/vs/base/common/platform.ts +0 -281
- package/src/vs/base/common/scrollable.ts +0 -522
- package/src/vs/base/common/sequence.ts +0 -34
- package/src/vs/base/common/stopwatch.ts +0 -43
- package/src/vs/base/common/strings.ts +0 -557
- package/src/vs/base/common/symbols.ts +0 -9
- package/src/vs/base/common/uint.ts +0 -59
- package/src/vs/patches/nls.ts +0 -90
- package/src/vs/typings/base-common.d.ts +0 -20
- package/src/vs/typings/require.d.ts +0 -42
- package/src/vs/typings/vscode-globals-nls.d.ts +0 -36
- 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
|
+
}
|