Skip to content

Commit 3a147e8

Browse files
authored
Merge pull request #5679 from Tyriar/scrollbar
Add scrollbar.showScrollbar
2 parents 456bc73 + c2db7d4 commit 3a147e8

14 files changed

Lines changed: 115 additions & 32 deletions

File tree

addons/addon-fit/src/FitAddon.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -69,9 +69,10 @@ export class FitAddon implements ITerminalAddon, IFitApi {
6969
return undefined;
7070
}
7171

72-
const scrollbarWidth = (this._terminal.options.scrollback === 0
72+
const showScrollbar = this._terminal.options.scrollbar?.showScrollbar ?? true;
73+
const scrollbarWidth = (this._terminal.options.scrollback === 0 || !showScrollbar
7374
? 0
74-
: (this._terminal.options.overviewRuler?.width || ViewportConstants.DEFAULT_SCROLL_BAR_WIDTH));
75+
: (this._terminal.options.overviewRuler?.width ?? ViewportConstants.DEFAULT_SCROLL_BAR_WIDTH));
7576

7677
const parentElementStyle = _getComputedStyle(this._terminal.element.parentElement);
7778
const parentElementHeight = parseInt(parentElementStyle.getPropertyValue('height'));

demo/client/client.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -284,7 +284,7 @@ function createTerminal(): Terminal {
284284

285285
const isWindows = ['Windows', 'Win16', 'Win32', 'WinCE'].indexOf(navigator.platform) >= 0;
286286
term = new Terminal({
287-
scrollbar: { showArrows: true },
287+
scrollbar: { showScrollbar: true },
288288
allowProposedApi: true,
289289
windowsPty: isWindows ? {
290290
// In a real scenario, these values should be verified on the backend

demo/client/components/window/optionsWindow.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,8 @@ export class OptionsWindow extends BaseWindow implements IControlWindow {
123123
'windowsPty',
124124
];
125125
const nestedBooleanOptions: { label: string, parent: string, prop: string }[] = [
126+
{ label: 'scrollbar.showScrollbar', parent: 'scrollbar', prop: 'showScrollbar' },
127+
{ label: 'scrollbar.showArrows', parent: 'scrollbar', prop: 'showArrows' },
126128
{ label: 'vtExtensions.kittyKeyboard', parent: 'vtExtensions', prop: 'kittyKeyboard' },
127129
{ label: 'vtExtensions.kittySgrBoldFaintControl', parent: 'vtExtensions', prop: 'kittySgrBoldFaintControl' },
128130
{ label: 'vtExtensions.win32InputMode', parent: 'vtExtensions', prop: 'win32InputMode' }

src/browser/CoreBrowserTerminal.ts

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -616,11 +616,19 @@ export class CoreBrowserTerminal extends CoreTerminal implements ITerminal {
616616
}
617617
this._register(this.optionsService.onSpecificOptionChange('screenReaderMode', e => this._handleScreenReaderModeOptionChange(e)));
618618

619-
if (this.options.overviewRuler.width) {
619+
const showScrollbar = this.options.scrollbar?.showScrollbar ?? true;
620+
if (showScrollbar && this.options.overviewRuler.width) {
620621
this._overviewRulerRenderer = this._register(this._instantiationService.createInstance(OverviewRulerRenderer, this._viewportElement, this.screenElement));
621622
}
622623
this.optionsService.onSpecificOptionChange('overviewRuler', value => {
623-
if (!this._overviewRulerRenderer && value && this._viewportElement && this.screenElement) {
624+
const shouldShow = (this.options.scrollbar?.showScrollbar ?? true) && !!value?.width;
625+
if (!this._overviewRulerRenderer && shouldShow && this._viewportElement && this.screenElement) {
626+
this._overviewRulerRenderer = this._register(this._instantiationService.createInstance(OverviewRulerRenderer, this._viewportElement, this.screenElement));
627+
}
628+
});
629+
this.optionsService.onSpecificOptionChange('scrollbar', value => {
630+
const shouldShow = (value?.showScrollbar ?? true) && !!this.options.overviewRuler.width;
631+
if (!this._overviewRulerRenderer && shouldShow && this._viewportElement && this.screenElement) {
624632
this._overviewRulerRenderer = this._register(this._instantiationService.createInstance(OverviewRulerRenderer, this._viewportElement, this.screenElement));
625633
}
626634
});

src/browser/Viewport.ts

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,8 @@ export class Viewport extends Disposable {
6262
this._register(this._optionsService.onMultipleOptionChange([
6363
'scrollSensitivity',
6464
'fastScrollSensitivity',
65-
'overviewRuler'
65+
'overviewRuler',
66+
'scrollbar'
6667
], () => this._scrollableElement.updateOptions(this._getChangeOptions())));
6768
// Don't handle mouse wheel if wheel events are supported by the current mouse prototcol
6869
this._register(coreMouseService.onProtocolChange(type => {
@@ -131,10 +132,17 @@ export class Viewport extends Disposable {
131132
}
132133

133134
private _getChangeOptions(): IScrollableElementChangeOptions {
135+
const showScrollbar = this._optionsService.rawOptions.scrollbar?.showScrollbar ?? true;
136+
const showArrows = this._optionsService.rawOptions.scrollbar?.showArrows ?? false;
137+
const verticalScrollbarSize = showScrollbar
138+
? (this._optionsService.rawOptions.overviewRuler?.width ?? ViewportConstants.DEFAULT_SCROLL_BAR_WIDTH)
139+
: 0;
134140
return {
135141
mouseWheelScrollSensitivity: this._optionsService.rawOptions.scrollSensitivity,
136142
fastScrollSensitivity: this._optionsService.rawOptions.fastScrollSensitivity,
137-
verticalScrollbarSize: this._optionsService.rawOptions.overviewRuler?.width || ViewportConstants.DEFAULT_SCROLL_BAR_WIDTH
143+
vertical: showScrollbar ? ScrollbarVisibility.AUTO : ScrollbarVisibility.HIDDEN,
144+
verticalScrollbarSize,
145+
verticalHasArrows: showArrows
138146
};
139147
}
140148

src/browser/decorations/OverviewRulerRenderer.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,11 @@ export class OverviewRulerRenderer extends Disposable {
3838
private readonly _ctx: CanvasRenderingContext2D;
3939
private readonly _colorZoneStore: IColorZoneStore = new ColorZoneStore();
4040
private get _width(): number {
41-
return this._optionsService.options.overviewRuler?.width || 0;
41+
const showScrollbar = this._optionsService.rawOptions.scrollbar?.showScrollbar ?? true;
42+
if (!showScrollbar) {
43+
return 0;
44+
}
45+
return this._optionsService.rawOptions.overviewRuler?.width ?? 0;
4246
}
4347
private _animationFrame: number | undefined;
4448

@@ -96,6 +100,7 @@ export class OverviewRulerRenderer extends Disposable {
96100

97101
this._register(this._coreBrowserService.onDprChange(() => this._queueRefresh(true)));
98102
this._register(this._optionsService.onSpecificOptionChange('overviewRuler', () => this._queueRefresh(true)));
103+
this._register(this._optionsService.onSpecificOptionChange('scrollbar', () => this._queueRefresh(true)));
99104
this._register(this._themeService.onChangeColors(() => this._queueRefresh()));
100105
this._queueRefresh(true);
101106
}

src/browser/scrollable/abstractScrollbar.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,10 +82,11 @@ export abstract class AbstractScrollbar extends Widget {
8282
/**
8383
* Creates the dom node for an arrow & adds it to the container
8484
*/
85-
protected _createArrow(opts: IScrollbarArrowOptions): void {
85+
protected _createArrow(opts: IScrollbarArrowOptions): ScrollbarArrow {
8686
const arrow = this._register(new ScrollbarArrow(opts));
8787
this.domNode.domNode.appendChild(arrow.bgDomNode);
8888
this.domNode.domNode.appendChild(arrow.domNode);
89+
return arrow;
8990
}
9091

9192
/**

src/browser/scrollable/scrollableElement.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -314,6 +314,12 @@ export class SmoothScrollableElement extends Widget {
314314
if (typeof newOptions.vertical !== 'undefined') {
315315
this._options.vertical = newOptions.vertical;
316316
}
317+
if (typeof newOptions.horizontalHasArrows !== 'undefined') {
318+
this._options.horizontalHasArrows = newOptions.horizontalHasArrows;
319+
}
320+
if (typeof newOptions.verticalHasArrows !== 'undefined') {
321+
this._options.verticalHasArrows = newOptions.verticalHasArrows;
322+
}
317323
if (typeof newOptions.horizontalScrollbarSize !== 'undefined') {
318324
this._options.horizontalScrollbarSize = newOptions.horizontalScrollbarSize;
319325
}

src/browser/scrollable/scrollableElementOptions.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,8 +128,10 @@ export interface IScrollableElementChangeOptions {
128128
scrollPredominantAxis?: boolean;
129129
horizontal?: ScrollbarVisibility;
130130
horizontalScrollbarSize?: number;
131+
horizontalHasArrows?: boolean;
131132
vertical?: ScrollbarVisibility;
132133
verticalScrollbarSize?: number;
134+
verticalHasArrows?: boolean;
133135
scrollByPage?: boolean;
134136
}
135137

src/browser/scrollable/scrollbarState.ts

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ export class ScrollbarState {
3535
* For the vertical scrollbar: the height of the scrollbar's arrows.
3636
* For the horizontal scrollbar: the width of the scrollbar's arrows.
3737
*/
38-
private readonly _arrowSize: number;
38+
private _arrowSize: number;
3939

4040
// --- variables
4141
/**
@@ -127,6 +127,14 @@ export class ScrollbarState {
127127
this._scrollbarSize = Math.round(scrollbarSize);
128128
}
129129

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+
130138
public setOppositeScrollbarSize(oppositeScrollbarSize: number): void {
131139
this._oppositeScrollbarSize = Math.round(oppositeScrollbarSize);
132140
}

0 commit comments

Comments
 (0)