diff --git a/src/components/structures/IndicatorScrollbar.js b/src/components/structures/IndicatorScrollbar.js index b11e655f0d..52e0c9b8ac 100644 --- a/src/components/structures/IndicatorScrollbar.js +++ b/src/components/structures/IndicatorScrollbar.js @@ -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. 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 const now = new Date().getTime(); - if (now >= this._checkAgainForTrackpad) { - this._likelyTrackpadUser = Math.abs(e.deltaX) > 0; + if (this._likelyTrackpadUser && now >= this._checkAgainForTrackpad) { + if (Math.abs(e.deltaX) > 0) { + this._likelyTrackpadUser = true; + } 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. // 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 @@ -152,7 +176,7 @@ export default class IndicatorScrollbar extends React.Component { const additionalScroll = e.deltaY < 0 ? -50 : 50; // 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; } }