From deaac3fdf0e17ee88ed9e6393975193413e9625f Mon Sep 17 00:00:00 2001 From: bbedward Date: Mon, 8 Dec 2025 14:11:44 -0500 Subject: [PATCH] list: approve mouse detection --- quickshell/Widgets/DankFlickable.qml | 37 +++++++++++++++++--------- quickshell/Widgets/DankGridView.qml | 32 ++++++++++++++++++----- quickshell/Widgets/DankListView.qml | 39 +++++++++++++++++++--------- 3 files changed, 77 insertions(+), 31 deletions(-) diff --git a/quickshell/Widgets/DankFlickable.qml b/quickshell/Widgets/DankFlickable.qml index cc212b99..13c6c8cd 100644 --- a/quickshell/Widgets/DankFlickable.qml +++ b/quickshell/Widgets/DankFlickable.qml @@ -46,11 +46,12 @@ Flickable { lastWheelTime = currentTime; const hasPixel = event.pixelDelta && event.pixelDelta.y !== 0; - const hasAngle = event.angleDelta && event.angleDelta.y !== 0; const deltaY = event.angleDelta.y; - const isMouseWheel = !hasPixel && hasAngle; + const isTraditionalMouse = !hasPixel && Math.abs(deltaY) >= 120 && (Math.abs(deltaY) % 120) === 0; + const isHighDpiMouse = !hasPixel && !isTraditionalMouse && deltaY !== 0; + const isTouchpad = hasPixel; - if (isMouseWheel) { + if (isTraditionalMouse) { sessionUsedMouseWheel = true; momentumTimer.stop(); flickable.isMomentumActive = false; @@ -58,7 +59,7 @@ Flickable { momentum = 0; flickable.momentumVelocity = 0; - const lines = Math.floor(Math.abs(deltaY) / 120); + const lines = Math.round(Math.abs(deltaY) / 120); const scrollAmount = (deltaY > 0 ? -lines : lines) * flickable.mouseWheelSpeed; let newY = flickable.contentY + scrollAmount; newY = Math.max(0, Math.min(flickable.contentHeight - flickable.height, newY)); @@ -68,17 +69,29 @@ Flickable { } flickable.contentY = newY; - } else { + } else if (isHighDpiMouse) { + sessionUsedMouseWheel = true; + momentumTimer.stop(); + flickable.isMomentumActive = false; + velocitySamples = []; + momentum = 0; + flickable.momentumVelocity = 0; + + let delta = deltaY / 8 * touchpadSpeed; + let newY = flickable.contentY - delta; + newY = Math.max(0, Math.min(flickable.contentHeight - flickable.height, newY)); + + if (flickable.flicking) { + flickable.cancelFlick(); + } + + flickable.contentY = newY; + } else if (isTouchpad) { sessionUsedMouseWheel = false; momentumTimer.stop(); flickable.isMomentumActive = false; - let delta = 0; - if (event.pixelDelta.y !== 0) { - delta = event.pixelDelta.y * touchpadSpeed; - } else { - delta = event.angleDelta.y / 8 * touchpadSpeed; - } + let delta = event.pixelDelta.y * touchpadSpeed; velocitySamples.push({ "delta": delta, @@ -94,7 +107,7 @@ Flickable { } } - if (event.pixelDelta.y !== 0 && timeDelta < 50) { + if (timeDelta < 50) { momentum = momentum * momentumRetention + delta * 0.15; delta += momentum; } else { diff --git a/quickshell/Widgets/DankGridView.qml b/quickshell/Widgets/DankGridView.qml index b6616e93..8fee01b4 100644 --- a/quickshell/Widgets/DankGridView.qml +++ b/quickshell/Widgets/DankGridView.qml @@ -50,11 +50,12 @@ GridView { lastWheelTime = currentTime; const hasPixel = event.pixelDelta && event.pixelDelta.y !== 0; - const hasAngle = event.angleDelta && event.angleDelta.y !== 0; const deltaY = event.angleDelta.y; - const isMouseWheel = !hasPixel && hasAngle; + const isTraditionalMouse = !hasPixel && Math.abs(deltaY) >= 120 && (Math.abs(deltaY) % 120) === 0; + const isHighDpiMouse = !hasPixel && !isTraditionalMouse && deltaY !== 0; + const isTouchpad = hasPixel; - if (isMouseWheel) { + if (isTraditionalMouse) { sessionUsedMouseWheel = true; momentumTimer.stop(); isMomentumActive = false; @@ -62,7 +63,7 @@ GridView { momentum = 0; momentumVelocity = 0; - const lines = Math.floor(Math.abs(deltaY) / 120); + const lines = Math.round(Math.abs(deltaY) / 120); const scrollAmount = (deltaY > 0 ? -lines : lines) * cellHeight * 0.35; let newY = contentY + scrollAmount; newY = Math.max(0, Math.min(contentHeight - height, newY)); @@ -72,12 +73,29 @@ GridView { } contentY = newY; - } else { + } else if (isHighDpiMouse) { + sessionUsedMouseWheel = true; + momentumTimer.stop(); + isMomentumActive = false; + velocitySamples = []; + momentum = 0; + momentumVelocity = 0; + + let delta = deltaY / 120 * cellHeight * 1.2; + let newY = contentY - delta; + newY = Math.max(0, Math.min(contentHeight - height, newY)); + + if (flicking) { + cancelFlick(); + } + + contentY = newY; + } else if (isTouchpad) { sessionUsedMouseWheel = false; momentumTimer.stop(); isMomentumActive = false; - let delta = event.pixelDelta.y !== 0 ? event.pixelDelta.y * touchpadSpeed : event.angleDelta.y / 120 * cellHeight * 1.2; + let delta = event.pixelDelta.y * touchpadSpeed; velocitySamples.push({ "delta": delta, @@ -93,7 +111,7 @@ GridView { } } - if (event.pixelDelta.y !== 0 && timeDelta < 50) { + if (timeDelta < 50) { momentum = momentum * momentumRetention + delta * 0.15; delta += momentum; } else { diff --git a/quickshell/Widgets/DankListView.qml b/quickshell/Widgets/DankListView.qml index ca913dab..d22ba4a0 100644 --- a/quickshell/Widgets/DankListView.qml +++ b/quickshell/Widgets/DankListView.qml @@ -69,11 +69,12 @@ ListView { lastWheelTime = currentTime; const hasPixel = event.pixelDelta && event.pixelDelta.y !== 0; - const hasAngle = event.angleDelta && event.angleDelta.y !== 0; const deltaY = event.angleDelta.y; - const isMouseWheel = !hasPixel && hasAngle; + const isTraditionalMouse = !hasPixel && Math.abs(deltaY) >= 120 && (Math.abs(deltaY) % 120) === 0; + const isHighDpiMouse = !hasPixel && !isTraditionalMouse && deltaY !== 0; + const isTouchpad = hasPixel; - if (isMouseWheel) { + if (isTraditionalMouse) { sessionUsedMouseWheel = true; momentumTimer.stop(); isMomentumActive = false; @@ -81,7 +82,7 @@ ListView { momentum = 0; momentumVelocity = 0; - const lines = Math.floor(Math.abs(deltaY) / 120); + const lines = Math.round(Math.abs(deltaY) / 120); const scrollAmount = (deltaY > 0 ? -lines : lines) * mouseWheelSpeed; let newY = listView.contentY + scrollAmount; const maxY = Math.max(0, listView.contentHeight - listView.height + listView.originY); @@ -93,17 +94,31 @@ ListView { listView.contentY = newY; savedY = newY; - } else { + } else if (isHighDpiMouse) { + sessionUsedMouseWheel = true; + momentumTimer.stop(); + isMomentumActive = false; + velocitySamples = []; + momentum = 0; + momentumVelocity = 0; + + let delta = deltaY / 8 * touchpadSpeed; + let newY = listView.contentY - delta; + const maxY = Math.max(0, listView.contentHeight - listView.height + listView.originY); + newY = Math.max(listView.originY, Math.min(maxY, newY)); + + if (listView.flicking) { + listView.cancelFlick(); + } + + listView.contentY = newY; + savedY = newY; + } else if (isTouchpad) { sessionUsedMouseWheel = false; momentumTimer.stop(); isMomentumActive = false; - let delta = 0; - if (event.pixelDelta.y !== 0) { - delta = event.pixelDelta.y * touchpadSpeed; - } else { - delta = event.angleDelta.y / 8 * touchpadSpeed; - } + let delta = event.pixelDelta.y * touchpadSpeed; velocitySamples.push({ "delta": delta, @@ -119,7 +134,7 @@ ListView { } } - if (event.pixelDelta.y !== 0 && timeDelta < 50) { + if (timeDelta < 50) { momentum = momentum * 0.92 + delta * 0.15; delta += momentum; } else {