diff --git a/dotfiles/.config/quickshell/modules/bar/Volume.qml b/dotfiles/.config/quickshell/modules/bar/Volume.qml index 637d971..7262b4f 100644 --- a/dotfiles/.config/quickshell/modules/bar/Volume.qml +++ b/dotfiles/.config/quickshell/modules/bar/Volume.qml @@ -137,15 +137,25 @@ Item { MouseArea { anchors.fill: parent cursorShape: Qt.PointingHandCursor + // Scroll distance is accumulated rather than stepping per event: + // a mouse wheel sends one 120-unit event per notch, but a touchpad + // sends a stream of tiny events, which at a fixed step per event + // made touchpad scrolling far too fast. One notch's worth (120) of + // scrolling = one volume step, regardless of input device. + property real wheelAccum: 0 + readonly property real volumeStep: 0.05 + readonly property real unitsPerStep: 120 onClicked: { panel.visible = !panel.visible grab.active = panel.visible } onWheel: (wheel) => { if (!root.sink || !root.sink.audio) return - const step = 0.05 - const delta = wheel.angleDelta.y > 0 ? step : -step - root.sink.audio.volume = Math.max(0, Math.min(1, root.sink.audio.volume + delta)) + wheelAccum += wheel.angleDelta.y + const steps = Math.trunc(wheelAccum / unitsPerStep) + if (steps === 0) return + wheelAccum -= steps * unitsPerStep + root.sink.audio.volume = Math.max(0, Math.min(1, root.sink.audio.volume + steps * volumeStep)) } }