if on trackpad, don't mess with horizontal scrolling.

trackpad heuristic is 'if 15 minutes of no horizontal scrollwheel events, assume user may have switched to mousewheel'
pull/21833/head
Matthew Hodgson 2019-06-26 18:37:59 +01:00
parent 15d286ed93
commit debcafd760
1 changed files with 30 additions and 6 deletions

View File

@ -131,17 +131,41 @@ export default class IndicatorScrollbar extends React.Component {
// the harshness of the scroll behaviour. Should be a value between 0 and 1. // the harshness of the scroll behaviour. Should be a value between 0 and 1.
const yRetention = 1.0; const yRetention = 1.0;
// Check for trackpad users every so often to avoid boosting their scroll. // whenever see horizontal scrolling, assume the user is on a trackpad
// for at least the next 15 minutes.
const now = new Date().getTime();
if (Math.abs(e.deltaX) > 0) {
this._likelyTrackpadUser = true;
this._checkAgainForTrackpad = now + (15 * 60 * 1000); // 15min
}
else {
// if we haven't seen any horizontal scrolling for >15 minutes, assume
// the user might have plugged in a mousewheel
if (this._likelyTrackpadUser && now >= this._checkAgainForTrackpad) {
this._likelyTrackpadUser = false;
}
}
// don't mess with the horizontal scroll for trackpad users
// See https://github.com/vector-im/riot-web/issues/10005
if (this._likelyTrackpadUser) {
return;
}
// Every 15 minutes, start checking to Check for trackpad users every so often to messing with their scroll
// See https://github.com/vector-im/riot-web/issues/10005 // See https://github.com/vector-im/riot-web/issues/10005
const now = new Date().getTime(); const now = new Date().getTime();
if (now >= this._checkAgainForTrackpad) { if (this._likelyTrackpadUser && now >= this._checkAgainForTrackpad) {
this._likelyTrackpadUser = Math.abs(e.deltaX) > 0; if (Math.abs(e.deltaX) > 0) {
this._likelyTrackpadUser = true;
}
this._checkAgainForTrackpad = now + (15 * 60 * 1000); // 15min this._checkAgainForTrackpad = now + (15 * 60 * 1000); // 15min
} }
const safeToBoost = !this._likelyTrackpadUser; if (this._likelyTrackpadUser) return;
if (Math.abs(e.deltaX) <= xyThreshold) { // we are vertically scrolling.
if (Math.abs(e.deltaX) <= xyThreshold) {
// HACK: We increase the amount of scroll to counteract smooth scrolling browsers. // HACK: We increase the amount of scroll to counteract smooth scrolling browsers.
// Smooth scrolling browsers (Firefox) use the relative area to determine the scroll // Smooth scrolling browsers (Firefox) use the relative area to determine the scroll
// amount, which means the likely small area of content results in a small amount of // amount, which means the likely small area of content results in a small amount of
@ -152,7 +176,7 @@ export default class IndicatorScrollbar extends React.Component {
const additionalScroll = e.deltaY < 0 ? -50 : 50; const additionalScroll = e.deltaY < 0 ? -50 : 50;
// noinspection JSSuspiciousNameCombination // noinspection JSSuspiciousNameCombination
const val = Math.abs(e.deltaY) < 25 && safeToBoost ? (e.deltaY + additionalScroll) : e.deltaY; const val = Math.abs(e.deltaY) < 25 ? (e.deltaY + additionalScroll) : 0;
this._scrollElement.scrollLeft += val * yRetention; this._scrollElement.scrollLeft += val * yRetention;
} }
} }