From 606b617d199bacccc63ff3b5ed37e3f645b05331 Mon Sep 17 00:00:00 2001 From: jsahn Date: Mon, 28 Sep 2026 16:56:58 +0900 Subject: [PATCH] =?UTF-8?q?=ED=9C=A0=20=EB=B0=98=EC=A0=84=20=EB=8C=80?= =?UTF-8?q?=EC=B2=B4=20=EC=9D=B4=EB=B2=A4=ED=8A=B8=EB=A5=BC=20=EC=A4=84=20?= =?UTF-8?q?=EB=8B=A8=EC=9C=84=EB=A1=9C=20=EB=B0=94=EA=BF=94=20=EC=9B=90?= =?UTF-8?q?=EB=9E=98=20=EC=8A=A4=ED=81=AC=EB=A1=A4=20=EC=86=8D=EB=8F=84=20?= =?UTF-8?q?=EC=9C=A0=EC=A7=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 픽셀 단위 대체 이벤트는 앱이 트랙패드처럼 처리해 한 칸당 이동 거리가 줄었다. 줄 단위로 만들고 원래 픽셀·소수점 이동량을 반전해 그대로 넣는다. 픽셀 이동량이 0인 휠 이벤트가 반전 없이 지나가던 문제도 고친다. Co-Authored-By: Claude Opus 5.5 (1M context) --- razer-tilt.swift | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/razer-tilt.swift b/razer-tilt.swift index 8744216..0dc4bb6 100644 --- a/razer-tilt.swift +++ b/razer-tilt.swift @@ -170,14 +170,23 @@ let scrollCallback: CGEventTapCallBack = { proxy, type, event, _ in log("Scroll events: \(kind)") lastScrollKind = kind } + let lineY = event.getIntegerValueField(.scrollWheelEventDeltaAxis1) let pointY = event.getIntegerValueField(.scrollWheelEventPointDeltaAxis1) - guard isWheel, pointY != 0 else { return Unmanaged.passUnretained(event) } - // Apps read the hardware data attached to the original event, so editing its delta - // fields has no visible effect. Post a fresh event with the vertical delta flipped. + let fixedY = event.getDoubleValueField(.scrollWheelEventFixedPtDeltaAxis1) + guard isWheel, lineY != 0 || pointY != 0 || fixedY != 0 else { return Unmanaged.passUnretained(event) } + let lineX = event.getIntegerValueField(.scrollWheelEventDeltaAxis2) let pointX = event.getIntegerValueField(.scrollWheelEventPointDeltaAxis2) - guard let replacement = CGEvent(scrollWheelEvent2Source: nil, units: .pixel, wheelCount: 2, - wheel1: Int32(clamping: -pointY), wheel2: Int32(clamping: pointX), wheel3: 0) + let fixedX = event.getDoubleValueField(.scrollWheelEventFixedPtDeltaAxis2) + // Apps read the hardware data attached to the original event, so editing its delta + // fields has no visible effect. Post a fresh line-based event (like a real wheel, so + // apps keep their per-line scroll distance) carrying the original deltas, Y flipped. + guard let replacement = CGEvent(scrollWheelEvent2Source: nil, units: .line, wheelCount: 2, + wheel1: Int32(clamping: -lineY), wheel2: Int32(clamping: lineX), wheel3: 0) else { return Unmanaged.passUnretained(event) } + replacement.setIntegerValueField(.scrollWheelEventPointDeltaAxis1, value: -pointY) + replacement.setIntegerValueField(.scrollWheelEventPointDeltaAxis2, value: pointX) + replacement.setDoubleValueField(.scrollWheelEventFixedPtDeltaAxis1, value: -fixedY) + replacement.setDoubleValueField(.scrollWheelEventFixedPtDeltaAxis2, value: fixedX) replacement.location = event.location replacement.flags = event.flags replacement.setIntegerValueField(.eventSourceUserData, value: invertedScrollMarker)