diff options
| -rw-r--r-- | content_scripts/scroller.coffee | 38 | 
1 files changed, 20 insertions, 18 deletions
| diff --git a/content_scripts/scroller.coffee b/content_scripts/scroller.coffee index e418a930..1e5bac65 100644 --- a/content_scripts/scroller.coffee +++ b/content_scripts/scroller.coffee @@ -33,7 +33,7 @@ performScroll = (element, direction, amount) ->    axisName = scrollProperties[direction].axisName    before = element[axisName]    element[axisName] += amount -  amount == element[axisName] - before +  element[axisName] == amount + before  # Test whether element should be scrolled.  shouldScroll = (element, direction) -> @@ -88,6 +88,7 @@ CoreScroller =      @time = 0      @lastEvent = null      @keyIsDown = false +      handlerStack.push        keydown: (event) =>          @keyIsDown = true @@ -96,6 +97,14 @@ CoreScroller =          @keyIsDown = false          @time += 1 +    # Calibration fudge factors for continuous scrolling.  The calibration value starts at 1.0.  We then +    # increase it (until it exceeds @maxCalibration) if we guess that the scroll is too slow, or decrease it +    # (until it is less than @minCalibration) if we guess that the scroll is too fast.  The cutoff point for +    # which guess we make is @calibrationBoundary. We require: 0 < @minCalibration <= 1 <= @maxCalibration. +    @minCalibration = 0.5 # Controls how much we're willing to slow scrolls down; smaller => more slow down. +    @maxCalibration = 1.6 # Controls how much we're willing to speed scrolls up; bigger => more speed up. +    @calibrationBoundary = 150 # Boundary between scrolls which are considered too slow, and those too fast. +    # Scroll element by a relative amount (a number) in some direction.    scroll: (element, direction, amount) ->      return unless amount @@ -110,9 +119,7 @@ CoreScroller =      return if @lastEvent?.repeat      activationTime = ++@time - -    isMyKeyStillDown = => -      @time == activationTime and @keyIsDown +    isMyKeyStillDown = => @time == activationTime and @keyIsDown      # Store amount's sign and make amount positive; the logic is clearer when amount is positive.      sign = Math.sign amount @@ -127,17 +134,12 @@ CoreScroller =      previousTimestamp = null      animatorId = null -    advanceAnimation = -> -      animatorId = requestAnimationFrame animate +    advanceAnimation = -> animatorId = requestAnimationFrame animate +    cancelAnimation = -> cancelAnimationFrame animatorId -    cancelAnimation = -> -      cancelAnimationFrame animatorId - -    animate = (timestamp) -> +    animate = (timestamp) =>        previousTimestamp ?= timestamp - -      if timestamp == previousTimestamp -        return advanceAnimation() +      return advanceAnimation() if timestamp == previousTimestamp        # The elapsed time is typically about 16ms.        elapsed = timestamp - previousTimestamp @@ -145,11 +147,11 @@ CoreScroller =        previousTimestamp = timestamp        # The constants in the duration calculation, above, are chosen to provide reasonable scroll speeds for -      # scrolls resulting from distinct keypresses.  For continuous scrolls (where the key remains depressed), -      # some scrolls are too slow, and others too fast.  Here, we compensate a bit. -      if isMyKeyStillDown() and 50 <= totalElapsed and 0.5 <= calibration <= 1.6 -        calibration *= 1.05 if 1.05 * calibration * amount <= 150 # Speed up slow scrolls. -        calibration *= 0.95 if 150 <= 0.95 * calibration * amount # Slow down fast scrolls. +      # distinct keypresses.  For continuous scrolls, some scrolls are too slow, and others too fast. Here, we +      # speed up the slower scrolls, and slow down the faster scrolls. +      if isMyKeyStillDown() and 50 <= totalElapsed and @minCalibration <= calibration <= @maxCalibration +        calibration *= 1.05 if 1.05 * calibration * amount <= @calibrationBoundary # Speed up slow scrolls. +        calibration *= 0.95 if @calibrationBoundary <= 0.95 * calibration * amount # Slow down fast scrolls.        # Calculate the initial delta, rounding up to ensure progress.  Then, adjust delta to account for the        # current scroll state. | 
