Skip to content

Commit 33d58ec

Browse files
authored
Merge pull request #2485 from eamodio/feature/scroll-sensitivity
Adds scrollSensitivity option for scrolling speed
2 parents eb25243 + f445bc7 commit 33d58ec

File tree

5 files changed

+22
-7
lines changed

5 files changed

+22
-7
lines changed

demo/client.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -254,7 +254,7 @@ function initOptions(term: TerminalType): void {
254254
});
255255
html += '</div><div class="option-group">';
256256
numberOptions.forEach(o => {
257-
html += `<div class="option"><label>${o} <input id="opt-${o}" type="number" value="${term.getOption(o)}" step="${o === 'lineHeight' ? '0.1' : '1'}"/></label></div>`;
257+
html += `<div class="option"><label>${o} <input id="opt-${o}" type="number" value="${term.getOption(o)}" step="${o === 'lineHeight' || o === 'scrollSensitivity' ? '0.1' : '1'}"/></label></div>`;
258258
});
259259
html += '</div><div class="option-group">';
260260
Object.keys(stringOptions).forEach(o => {
@@ -283,7 +283,7 @@ function initOptions(term: TerminalType): void {
283283
console.log('change', o, input.value);
284284
if (o === 'cols' || o === 'rows') {
285285
updateTerminalSize();
286-
} else if (o === 'lineHeight') {
286+
} else if (o === 'lineHeight' || o === 'scrollSensitivity') {
287287
term.setOption(o, parseFloat(input.value));
288288
updateTerminalSize();
289289
} else {

src/browser/Viewport.ts

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -198,7 +198,7 @@ export class Viewport extends Disposable implements IViewport {
198198
}
199199

200200
// Fallback to WheelEvent.DOM_DELTA_PIXEL
201-
let amount = this._applyFastScrollModifier(ev.deltaY, ev);
201+
let amount = this._applyScrollModifier(ev.deltaY, ev);
202202
if (ev.deltaMode === WheelEvent.DOM_DELTA_LINE) {
203203
amount *= this._currentRowHeight;
204204
} else if (ev.deltaMode === WheelEvent.DOM_DELTA_PAGE) {
@@ -219,7 +219,7 @@ export class Viewport extends Disposable implements IViewport {
219219
}
220220

221221
// Fallback to WheelEvent.DOM_DELTA_LINE
222-
let amount = this._applyFastScrollModifier(ev.deltaY, ev);
222+
let amount = this._applyScrollModifier(ev.deltaY, ev);
223223
if (ev.deltaMode === WheelEvent.DOM_DELTA_PIXEL) {
224224
amount /= this._currentRowHeight + 0.0; // Prevent integer division
225225
this._wheelPartialScroll += amount;
@@ -231,15 +231,16 @@ export class Viewport extends Disposable implements IViewport {
231231
return amount;
232232
}
233233

234-
private _applyFastScrollModifier(amount: number, ev: WheelEvent): number {
234+
private _applyScrollModifier(amount: number, ev: WheelEvent): number {
235235
const modifier = this._optionsService.options.fastScrollModifier;
236236
// Multiply the scroll speed when the modifier is down
237237
if ((modifier === 'alt' && ev.altKey) ||
238238
(modifier === 'ctrl' && ev.ctrlKey) ||
239239
(modifier === 'shift' && ev.shiftKey)) {
240-
return amount * Math.max(1, this._optionsService.options.fastScrollSensitivity);
240+
return amount * this._optionsService.options.fastScrollSensitivity;
241241
}
242-
return amount;
242+
243+
return amount * this._optionsService.options.scrollSensitivity;
243244
}
244245

245246
/**

src/common/services/OptionsService.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ export const DEFAULT_OPTIONS: ITerminalOptions = Object.freeze({
3333
letterSpacing: 0,
3434
logLevel: 'info',
3535
scrollback: 1000,
36+
scrollSensitivity: 1,
3637
screenReaderMode: false,
3738
macOptionIsMeta: false,
3839
macOptionClickForcesSelection: false,
@@ -121,6 +122,12 @@ export class OptionsService implements IOptionsService {
121122
throw new Error(`${key} cannot be less than 0, value: ${value}`);
122123
}
123124
break;
125+
case 'fastScrollSensitivity':
126+
case 'scrollSensitivity':
127+
if (value <= 0) {
128+
throw new Error(`${key} cannot be less than or equal to 0, value: ${value}`);
129+
}
130+
break;
124131
}
125132
return value;
126133
}

src/common/services/Services.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -196,6 +196,7 @@ export interface IPartialTerminalOptions {
196196
rows?: number;
197197
screenReaderMode?: boolean;
198198
scrollback?: number;
199+
scrollSensitivity?: number;
199200
tabStopWidth?: number;
200201
theme?: ITheme;
201202
windowsMode?: boolean;
@@ -227,6 +228,7 @@ export interface ITerminalOptions {
227228
rows: number;
228229
screenReaderMode: boolean;
229230
scrollback: number;
231+
scrollSensitivity: number;
230232
tabStopWidth: number;
231233
theme: ITheme;
232234
windowsMode: boolean;

typings/xterm.d.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -183,6 +183,11 @@ declare module 'xterm' {
183183
*/
184184
scrollback?: number;
185185

186+
/**
187+
* The scrolling speed multiplier used for adjusting normal scrolling speed.
188+
*/
189+
scrollSensitivity?: number;
190+
186191
/**
187192
* The size of tab stops in the terminal.
188193
*/

0 commit comments

Comments
 (0)