diff --git a/demo/client.ts b/demo/client.ts
index e05a7105..7942cffe 100644
--- a/demo/client.ts
+++ b/demo/client.ts
@@ -254,7 +254,7 @@ function initOptions(term: TerminalType): void {
});
html += '
';
Object.keys(stringOptions).forEach(o => {
@@ -283,7 +283,7 @@ function initOptions(term: TerminalType): void {
console.log('change', o, input.value);
if (o === 'cols' || o === 'rows') {
updateTerminalSize();
- } else if (o === 'lineHeight') {
+ } else if (o === 'lineHeight' || o === 'scrollSensitivity') {
term.setOption(o, parseFloat(input.value));
updateTerminalSize();
} else {
diff --git a/src/browser/Viewport.ts b/src/browser/Viewport.ts
index 4817ab3b..5edd7b80 100644
--- a/src/browser/Viewport.ts
+++ b/src/browser/Viewport.ts
@@ -198,7 +198,7 @@ export class Viewport extends Disposable implements IViewport {
}
// Fallback to WheelEvent.DOM_DELTA_PIXEL
- let amount = this._applyFastScrollModifier(ev.deltaY, ev);
+ let amount = this._applyScrollModifier(ev.deltaY, ev);
if (ev.deltaMode === WheelEvent.DOM_DELTA_LINE) {
amount *= this._currentRowHeight;
} else if (ev.deltaMode === WheelEvent.DOM_DELTA_PAGE) {
@@ -219,7 +219,7 @@ export class Viewport extends Disposable implements IViewport {
}
// Fallback to WheelEvent.DOM_DELTA_LINE
- let amount = this._applyFastScrollModifier(ev.deltaY, ev);
+ let amount = this._applyScrollModifier(ev.deltaY, ev);
if (ev.deltaMode === WheelEvent.DOM_DELTA_PIXEL) {
amount /= this._currentRowHeight + 0.0; // Prevent integer division
this._wheelPartialScroll += amount;
@@ -231,15 +231,16 @@ export class Viewport extends Disposable implements IViewport {
return amount;
}
- private _applyFastScrollModifier(amount: number, ev: WheelEvent): number {
+ private _applyScrollModifier(amount: number, ev: WheelEvent): number {
const modifier = this._optionsService.options.fastScrollModifier;
// Multiply the scroll speed when the modifier is down
if ((modifier === 'alt' && ev.altKey) ||
(modifier === 'ctrl' && ev.ctrlKey) ||
(modifier === 'shift' && ev.shiftKey)) {
- return amount * Math.max(1, this._optionsService.options.fastScrollSensitivity);
+ return amount * this._optionsService.options.fastScrollSensitivity;
}
- return amount;
+
+ return amount * this._optionsService.options.scrollSensitivity;
}
/**
diff --git a/src/common/services/OptionsService.ts b/src/common/services/OptionsService.ts
index 9230421c..ccfca6d9 100644
--- a/src/common/services/OptionsService.ts
+++ b/src/common/services/OptionsService.ts
@@ -33,6 +33,7 @@ export const DEFAULT_OPTIONS: ITerminalOptions = Object.freeze({
letterSpacing: 0,
logLevel: 'info',
scrollback: 1000,
+ scrollSensitivity: 1,
screenReaderMode: false,
macOptionIsMeta: false,
macOptionClickForcesSelection: false,
@@ -121,6 +122,12 @@ export class OptionsService implements IOptionsService {
throw new Error(`${key} cannot be less than 0, value: ${value}`);
}
break;
+ case 'fastScrollSensitivity':
+ case 'scrollSensitivity':
+ if (value <= 0) {
+ throw new Error(`${key} cannot be less than or equal to 0, value: ${value}`);
+ }
+ break;
}
return value;
}
diff --git a/src/common/services/Services.ts b/src/common/services/Services.ts
index 1df59f84..0872d3db 100644
--- a/src/common/services/Services.ts
+++ b/src/common/services/Services.ts
@@ -196,6 +196,7 @@ export interface IPartialTerminalOptions {
rows?: number;
screenReaderMode?: boolean;
scrollback?: number;
+ scrollSensitivity?: number;
tabStopWidth?: number;
theme?: ITheme;
windowsMode?: boolean;
@@ -227,6 +228,7 @@ export interface ITerminalOptions {
rows: number;
screenReaderMode: boolean;
scrollback: number;
+ scrollSensitivity: number;
tabStopWidth: number;
theme: ITheme;
windowsMode: boolean;
diff --git a/typings/xterm.d.ts b/typings/xterm.d.ts
index af7d5ca8..361bafde 100644
--- a/typings/xterm.d.ts
+++ b/typings/xterm.d.ts
@@ -183,6 +183,11 @@ declare module 'xterm' {
*/
scrollback?: number;
+ /**
+ * The scrolling speed multiplier used for adjusting normal scrolling speed.
+ */
+ scrollSensitivity?: number;
+
/**
* The size of tab stops in the terminal.
*/