Skip to content

Commit

Permalink
! Fix scroll to seek/change volume/playback rate changing too fast wi…
Browse files Browse the repository at this point in the history
…th touchpad
  • Loading branch information
PikachuEXE committed Jan 29, 2025
1 parent 5d523bd commit 9ee15fe
Show file tree
Hide file tree
Showing 2 changed files with 74 additions and 25 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -24,9 +24,10 @@ import {
} from '../../helpers/player/utils'
import {
addKeyboardShortcutToActionTitle,
throttle,
getPicturesPath,
showToast,
writeFileWithPicker
writeFileWithPicker,
} from '../../helpers/utils'
import { pathExists } from '../../helpers/filesystem'

Expand Down Expand Up @@ -914,13 +915,13 @@ export default defineComponent({

if (event.ctrlKey || event.metaKey) {
if (videoPlaybackRateMouseScroll.value) {
mouseScrollPlaybackRate(event)
mouseScrollPlaybackRateHandler(event)
}
} else {
if (videoVolumeMouseScroll.value) {
mouseScrollVolume(event)
mouseScrollVolumeHandler(event)
} else if (videoSkipMouseScroll.value) {
mouseScrollSkip(event)
mouseScrollSkipHandler(event)
}
}
}
Expand Down Expand Up @@ -957,7 +958,7 @@ export default defineComponent({
}

// make scrolling over volume slider change the volume
container.value.querySelector('.shaka-volume-bar').addEventListener('wheel', mouseScrollVolume)
container.value.querySelector('.shaka-volume-bar').addEventListener('wheel', mouseScrollVolumeHandler)

// title overlay when the video is fullscreened
// placing this inside the controls container so that we can fade it in and out at the same time as the controls
Expand Down Expand Up @@ -1964,56 +1965,79 @@ export default defineComponent({

// #region mouse scroll handlers

const mouseScrollThrottleWaitMs = 100

/**
* @param {WheelEvent} event
*/
function mouseScrollPlaybackRate(event) {
event.preventDefault()

if ((event.deltaY < 0 || event.deltaX > 0)) {
changePlayBackRate(0.05)
} else if ((event.deltaY > 0 || event.deltaX < 0)) {
changePlayBackRate(-0.05)
}
}
const mouseScrollPlaybackRateThrottle = throttle(mouseScrollPlaybackRate, mouseScrollThrottleWaitMs)
/**
* @param {WheelEvent} event
*/
function mouseScrollPlaybackRateHandler(event) {
event.preventDefault()

mouseScrollPlaybackRateThrottle(event)
}

/**
* @param {WheelEvent} event
*/
function mouseScrollSkip(event) {
if ((event.deltaY < 0 || event.deltaX > 0)) {
seekBySeconds(defaultSkipInterval.value * video.value.playbackRate, true)
} else if ((event.deltaY > 0 || event.deltaX < 0)) {
seekBySeconds(-defaultSkipInterval.value * video.value.playbackRate, true)
}
}
const mouseScrollSkipThrottle = throttle(mouseScrollSkip, mouseScrollThrottleWaitMs)
/**
* @param {WheelEvent} event
*/
function mouseScrollSkipHandler(event) {
if (canSeek()) {
event.preventDefault()

mouseScrollSkipThrottle(event)
}
}

/**
* @param {WheelEvent} event
*/
function mouseScrollVolume(event) {
const video_ = video.value

if (video_.muted && (event.deltaY < 0 || event.deltaX > 0)) {
video_.muted = false
video_.volume = 0
}

if (!video_.muted) {
if ((event.deltaY < 0 || event.deltaX > 0)) {
seekBySeconds(defaultSkipInterval.value * video.value.playbackRate, true)
changeVolume(0.05)
} else if ((event.deltaY > 0 || event.deltaX < 0)) {
seekBySeconds(-defaultSkipInterval.value * video.value.playbackRate, true)
changeVolume(-0.05)
}
}
}

const mouseScrollVolumeThrottle = throttle(mouseScrollVolume, mouseScrollThrottleWaitMs)
/**
* @param {WheelEvent} event
*/
function mouseScrollVolume(event) {
function mouseScrollVolumeHandler(event) {
if (!event.ctrlKey && !event.metaKey) {
event.preventDefault()
event.stopPropagation()

const video_ = video.value

if (video_.muted && (event.deltaY < 0 || event.deltaX > 0)) {
video_.muted = false
video_.volume = 0
}

if (!video_.muted) {
if ((event.deltaY < 0 || event.deltaX > 0)) {
changeVolume(0.05)
} else if ((event.deltaY > 0 || event.deltaX < 0)) {
changeVolume(-0.05)
}
}
mouseScrollVolumeThrottle(event)
}
}

Expand Down
25 changes: 25 additions & 0 deletions src/renderer/helpers/utils.js
Original file line number Diff line number Diff line change
Expand Up @@ -1052,3 +1052,28 @@ export function debounce(func, wait) {
}, wait)
}
}

/**
* @template {Function} T
* @param {T} func
* @param {number} wait
* @returns {T}
*/
export function throttle(func, wait) {
let isWaiting

// Using a fully fledged function here instead of an arrow function
// so that we can get `this` and pass it onto the original function.
// Vue components using the options API use `this` alot.
return function (...args) {
const context = this
if (!isWaiting) {
func.apply(context, args)

isWaiting = true
setTimeout(() => {
isWaiting = false
}, wait)
}
}
}

0 comments on commit 9ee15fe

Please sign in to comment.