using System; using System.Collections.Generic; using System.Linq; using System.Text; using DS4Library; namespace DS4Control { class MouseWheel { private readonly int deviceNumber; public MouseWheel(int deviceNum) { deviceNumber = deviceNum; } // Keep track of remainders when performing scrolls or we lose fractional parts. private double horizontalRemainder = 0.0, verticalRemainder = 0.0; public void touchesBegan(TouchpadEventArgs arg) { if (arg.touches.Length == 2) horizontalRemainder = verticalRemainder = 0.0; } public void touchesMoved(TouchpadEventArgs arg) { if (arg.touches.Length != 2) return; Touch lastT0 = arg.touches[0].previousTouch; Touch lastT1 = arg.touches[1].previousTouch; Touch T0 = arg.touches[0]; Touch T1 = arg.touches[1]; //mouse wheel 120 == 1 wheel click according to Windows API int lastMidX = (lastT0.hwX + lastT1.hwX) / 2, lastMidY = (lastT0.hwY + lastT1.hwY) / 2, currentMidX = (T0.hwX + T1.hwX) / 2, currentMidY = (T0.hwY + T1.hwY) / 2; double coefficient = Global.getScrollSensitivity(deviceNumber); // Adjust for touch distance: "standard" distance is 960 pixels, i.e. half the width. Scroll farther if fingers are farther apart, and vice versa, in linear proportion. double touchXDistance = T1.hwX - T0.hwX, touchYDistance = T1.hwY - T0.hwY, touchDistance = Math.Sqrt(touchXDistance * touchXDistance + touchYDistance * touchYDistance); coefficient *= touchDistance / 960.0; // Collect rounding errors instead of losing motion. double xMotion = coefficient * (currentMidX - lastMidX); if (xMotion > 0.0) { if (horizontalRemainder > 0.0) xMotion += horizontalRemainder; } else if (xMotion < 0.0) { if (horizontalRemainder < 0.0) xMotion += horizontalRemainder; } int xAction = (int)xMotion; horizontalRemainder = xMotion - xAction; double yMotion = coefficient * (lastMidY - currentMidY); if (yMotion > 0.0) { if (verticalRemainder > 0.0) yMotion += verticalRemainder; } else if (yMotion < 0.0) { if (verticalRemainder < 0.0) yMotion += verticalRemainder; } int yAction = (int)yMotion; verticalRemainder = yMotion - yAction; if (yAction != 0 || xAction != 0) InputMethods.MouseWheel(yAction, xAction); } } }