From 8b8aaffe02e5ab9f26f4181ea10906f2b37b2d18 Mon Sep 17 00:00:00 2001 From: Terry Jia Date: Sun, 7 Sep 2025 20:41:01 -0400 Subject: [PATCH] fix cases on Logi M705 --- src/lib/litegraph/src/CanvasPointer.ts | 29 +++++++++++++++++--------- 1 file changed, 19 insertions(+), 10 deletions(-) diff --git a/src/lib/litegraph/src/CanvasPointer.ts b/src/lib/litegraph/src/CanvasPointer.ts index 8120b964b..26bf07c42 100644 --- a/src/lib/litegraph/src/CanvasPointer.ts +++ b/src/lib/litegraph/src/CanvasPointer.ts @@ -363,23 +363,32 @@ export class CanvasPointer { const wheelDeltaY = (event as any).wheelDeltaY console.log('wheelDeltaY: ', wheelDeltaY) - // if deltaX is non-zero, it's definitely a trackpad + // if deltaX is non-zero, it's definitely a trackpad (but except for some mouse models, for example Logitech M705 which its wheel can pan horizontally) if (Math.abs(event.deltaX) !== 0) { this.detectedDevice = 'trackpad' } else if (wheelDeltaY !== undefined) { const absWheelDeltaY = Math.abs(wheelDeltaY) - // get this wheelDelta from real world testing - const wheelDeltaYThreshold = navigator.platform.includes('Mac') ? 30 : 75 + // For some mouse models, for example Logitech M705, on Linux the wheelDeltaY and detaY are exactly the same when scrolling normally and value is 15 * 1/2, 1, 2, 3...8 + const isMultipleOf15 = absWheelDeltaY % 15 === 0 || absWheelDeltaY === 7.5 - if (absWheelDeltaY > wheelDeltaYThreshold) { - if (this.#isTrackpadPattern(event)) { + if (absWheelDeltaY === Math.abs(event.deltaY) && isMultipleOf15) { + this.detectedDevice = 'mouse' + } else { + // get this wheelDelta from real world testing + const wheelDeltaYThreshold = navigator.platform.includes('Mac') + ? 30 + : 75 + + if (absWheelDeltaY > wheelDeltaYThreshold) { + if (this.#isTrackpadPattern(event)) { + this.detectedDevice = 'trackpad' + } else { + this.detectedDevice = 'mouse' + } + } else if (absWheelDeltaY > 0) { this.detectedDevice = 'trackpad' - } else { - this.detectedDevice = 'mouse' } - } else if (absWheelDeltaY > 0) { - this.detectedDevice = 'trackpad' } } else { // in case wheelDeltaY is undefined (e.g. Firefox), fall back to original pattern detection @@ -438,7 +447,7 @@ export class CanvasPointer { !navigator.platform.includes('Mac') && event.deltaX === 0 ) { - // As tested in real world, on non-Mac, trackpad wheelDeltaY is usually very close to deltaY while two-finger panning vertically + // As tested in real world, on non-Mac, trackpad wheelDeltaY is usually very close to deltaY while two-finger panning vertically (except for some mouse models, for example Logitech M705, on Linux the wheelDeltaY and detaY are exactly the same when scrolling normally) if (Math.abs(Math.abs(event.deltaY) - Math.abs(wheelDeltaY)) < 2) { return true }