cemu-DS4Windows/DS4Control/MouseWheel.cs
jays2kings 5945185fbc Version 1.4.26
Updated German translation
Added Turkish translation (Thanks Lütfi)
When the battery is low and the controller is disconnected, The
notification tell you to charge the controller, this notification also
now shows the controller number instead of the mac address
While Double tapping to drag or left clicking the touchpad, you can use
a second finger to drag the mouse cursor (ala Mac touchpads)
In Auto Profiles, you can now add a directory/folder of programs
2015-06-01 15:04:22 -04:00

61 lines
2.5 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace DS4Windows
{
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, bool dragging)
{
if (arg.touches.Length != 2 || dragging)
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
double lastMidX = (lastT0.hwX + lastT1.hwX) / 2d, lastMidY = (lastT0.hwY + lastT1.hwY) / 2d,
currentMidX = (T0.hwX + T1.hwX) / 2d, currentMidY = (T0.hwY + T1.hwY) / 2d;
double coefficient = Global.ScrollSensitivity[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 &&horizontalRemainder > 0.0) || (xMotion < 0.0 &&horizontalRemainder < 0.0))
xMotion += horizontalRemainder;
int xAction = (int)xMotion;
horizontalRemainder = xMotion - xAction;
double yMotion = coefficient * (lastMidY - currentMidY);
if ((yMotion > 0.0 && verticalRemainder > 0.0) || (yMotion < 0.0 && verticalRemainder < 0.0))
yMotion += verticalRemainder;
int yAction = (int)yMotion;
verticalRemainder = yMotion - yAction;
if (yAction != 0 || xAction != 0)
InputMethods.MouseWheel(yAction, xAction);
}
}
}