mirror of
https://github.com/cemu-project/DS4Windows.git
synced 2025-01-10 07:19:24 +01:00
5945185fbc
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
216 lines
9.0 KiB
C#
216 lines
9.0 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Text;
|
|
using System.Runtime.InteropServices;
|
|
|
|
namespace DS4Windows
|
|
{
|
|
public class Mouse : ITouchpadBehaviour
|
|
{
|
|
protected DateTime pastTime, firstTap, TimeofEnd;
|
|
protected Touch firstTouch, secondTouch;
|
|
private DS4State s = new DS4State();
|
|
protected int deviceNum;
|
|
private DS4Device dev = null;
|
|
private readonly MouseCursor cursor;
|
|
private readonly MouseWheel wheel;
|
|
private bool tappedOnce = false, secondtouchbegin = false;
|
|
public bool swipeLeft, swipeRight, swipeUp, swipeDown;
|
|
public byte swipeLeftB, swipeRightB, swipeUpB, swipeDownB, swipedB;
|
|
public bool slideleft, slideright;
|
|
// touch area stuff
|
|
public bool leftDown, rightDown, upperDown, multiDown;
|
|
protected DS4Controls pushed = DS4Controls.None;
|
|
protected Mapping.Click clicked = Mapping.Click.None;
|
|
|
|
public Mouse(int deviceID, DS4Device d)
|
|
{
|
|
deviceNum = deviceID;
|
|
dev = d;
|
|
cursor = new MouseCursor(deviceNum);
|
|
wheel = new MouseWheel(deviceNum);
|
|
}
|
|
|
|
public virtual void touchesMoved(object sender, TouchpadEventArgs arg)
|
|
{
|
|
if (!Global.UseTPforControls[deviceNum])
|
|
{
|
|
cursor.touchesMoved(arg, dragging || dragging2);
|
|
wheel.touchesMoved(arg, dragging || dragging2);
|
|
}
|
|
else
|
|
{
|
|
if (!(swipeUp || swipeDown || swipeLeft || swipeRight) && arg.touches.Length == 1)
|
|
{
|
|
if (arg.touches[0].hwX - firstTouch.hwX > 400) swipeRight = true;
|
|
if (arg.touches[0].hwX - firstTouch.hwX < -400) swipeLeft = true;
|
|
if (arg.touches[0].hwY - firstTouch.hwY > 300) swipeDown = true;
|
|
if (arg.touches[0].hwY - firstTouch.hwY < -300) swipeUp = true;
|
|
}
|
|
swipeUpB = (byte)Math.Min(255, Math.Max(0, (firstTouch.hwY - arg.touches[0].hwY) * 1.5f));
|
|
swipeDownB = (byte)Math.Min(255, Math.Max(0, (arg.touches[0].hwY - firstTouch.hwY) * 1.5f));
|
|
swipeLeftB = (byte)Math.Min(255, Math.Max(0, firstTouch.hwX - arg.touches[0].hwX));
|
|
swipeRightB = (byte)Math.Min(255, Math.Max(0, arg.touches[0].hwX - firstTouch.hwX));
|
|
}
|
|
if (Math.Abs(firstTouch.hwY - arg.touches[0].hwY) < 50 && arg.touches.Length == 2)
|
|
if (arg.touches[0].hwX - firstTouch.hwX > 200 && !slideleft)
|
|
slideright = true;
|
|
else if (firstTouch.hwX - arg.touches[0].hwX > 200 && !slideright)
|
|
slideleft = true;
|
|
dev.getCurrentState(s);
|
|
synthesizeMouseButtons();
|
|
}
|
|
public virtual void touchesBegan(object sender, TouchpadEventArgs arg)
|
|
{
|
|
if (!Global.UseTPforControls[deviceNum])
|
|
{
|
|
cursor.touchesBegan(arg);
|
|
wheel.touchesBegan(arg);
|
|
}
|
|
pastTime = arg.timeStamp;
|
|
firstTouch = arg.touches[0];
|
|
if (Global.DoubleTap[deviceNum])
|
|
{
|
|
DateTime test = arg.timeStamp;
|
|
if (test <= (firstTap + TimeSpan.FromMilliseconds((double)Global.TapSensitivity[deviceNum] * 1.5)) && !arg.touchButtonPressed)
|
|
secondtouchbegin = true;
|
|
}
|
|
dev.getCurrentState(s);
|
|
synthesizeMouseButtons();
|
|
}
|
|
public virtual void touchesEnded(object sender, TouchpadEventArgs arg)
|
|
{
|
|
slideright = slideleft = false;
|
|
swipeUp = swipeDown = swipeLeft = swipeRight = false;
|
|
swipeUpB = swipeDownB = swipeLeftB = swipeRightB = 0;
|
|
if (Global.TapSensitivity[deviceNum] != 0 && !Global.UseTPforControls[deviceNum])
|
|
{
|
|
|
|
if (secondtouchbegin)
|
|
{
|
|
tappedOnce = false;
|
|
secondtouchbegin = false;
|
|
}
|
|
DateTime test = arg.timeStamp;
|
|
if (test <= (pastTime + TimeSpan.FromMilliseconds((double)Global.TapSensitivity[deviceNum] * 2)) && !arg.touchButtonPressed && !tappedOnce)
|
|
if (Math.Abs(firstTouch.hwX - arg.touches[0].hwX) < 10 && Math.Abs(firstTouch.hwY - arg.touches[0].hwY) < 10)
|
|
if (Global.DoubleTap[deviceNum])
|
|
{
|
|
tappedOnce = true;
|
|
firstTap = arg.timeStamp;
|
|
TimeofEnd = DateTime.Now; //since arg can't be used in synthesizeMouseButtons
|
|
}
|
|
else
|
|
Mapping.MapClick(deviceNum, Mapping.Click.Left); //this way no delay if disabled
|
|
}
|
|
dev.getCurrentState(s);
|
|
synthesizeMouseButtons();
|
|
}
|
|
|
|
private bool isLeft(Touch t)
|
|
{
|
|
return t.hwX < 1920 * 2 / 5;
|
|
}
|
|
|
|
private bool isRight(Touch t)
|
|
{
|
|
return t.hwX >= 1920 * 2 / 5;
|
|
}
|
|
|
|
public virtual void touchUnchanged(object sender, EventArgs unused)
|
|
{
|
|
dev.getCurrentState(s);
|
|
//if (s.Touch1 || s.Touch2 || s.TouchButton)
|
|
synthesizeMouseButtons();
|
|
}
|
|
|
|
private DS4State remapped = new DS4State();
|
|
public bool dragging, dragging2;
|
|
private void synthesizeMouseButtons()
|
|
{
|
|
if (Global.getCustomButton(deviceNum, DS4Controls.TouchLeft) == X360Controls.None &&
|
|
Global.getCustomMacro(deviceNum, DS4Controls.TouchLeft) == "0" &&
|
|
Global.getCustomKey(deviceNum, DS4Controls.TouchLeft) == 0 &&
|
|
leftDown)
|
|
{
|
|
Mapping.MapClick(deviceNum, Mapping.Click.Left);
|
|
dragging2 = true;
|
|
}
|
|
else
|
|
dragging2 = false;
|
|
if (Global.getCustomButton(deviceNum, DS4Controls.TouchUpper) == X360Controls.None &&
|
|
Global.getCustomMacro(deviceNum, DS4Controls.TouchUpper) == "0" &&
|
|
Global.getCustomKey(deviceNum, DS4Controls.TouchUpper) == 0 &&
|
|
upperDown)
|
|
Mapping.MapClick(deviceNum, Mapping.Click.Middle);
|
|
if (Global.getCustomButton(deviceNum, DS4Controls.TouchRight) == X360Controls.None &&
|
|
Global.getCustomMacro(deviceNum, DS4Controls.TouchRight) == "0" &&
|
|
Global.getCustomKey(deviceNum, DS4Controls.TouchRight) == 0 &&
|
|
rightDown)
|
|
Mapping.MapClick(deviceNum, Mapping.Click.Left);
|
|
if (Global.getCustomButton(deviceNum, DS4Controls.TouchMulti) == X360Controls.None &&
|
|
Global.getCustomMacro(deviceNum, DS4Controls.TouchMulti) == "0" &&
|
|
Global.getCustomKey(deviceNum, DS4Controls.TouchMulti) == 0 &&
|
|
multiDown)
|
|
Mapping.MapClick(deviceNum, Mapping.Click.Right);
|
|
if (!Global.UseTPforControls[deviceNum])
|
|
{
|
|
if (tappedOnce)
|
|
{
|
|
DateTime tester = DateTime.Now;
|
|
if (tester > (TimeofEnd + TimeSpan.FromMilliseconds((double)(Global.TapSensitivity[deviceNum]) * 1.5)))
|
|
{
|
|
Mapping.MapClick(deviceNum, Mapping.Click.Left);
|
|
tappedOnce = false;
|
|
}
|
|
//if it fails the method resets, and tries again with a new tester value (gives tap a delay so tap and hold can work)
|
|
}
|
|
if (secondtouchbegin) //if tap and hold (also works as double tap)
|
|
{
|
|
Mapping.MapClick(deviceNum, Mapping.Click.Left);
|
|
dragging = true;
|
|
}
|
|
else
|
|
dragging = false;
|
|
}
|
|
s = remapped;
|
|
//remapped.CopyTo(s);
|
|
}
|
|
|
|
public virtual void touchButtonUp(object sender, TouchpadEventArgs arg)
|
|
{
|
|
pushed = DS4Controls.None;
|
|
upperDown = leftDown = rightDown = multiDown = false;
|
|
dev.setRumble(0, 0);
|
|
dev.getCurrentState(s);
|
|
if (s.Touch1 || s.Touch2)
|
|
synthesizeMouseButtons();
|
|
}
|
|
|
|
public virtual void touchButtonDown(object sender, TouchpadEventArgs arg)
|
|
{
|
|
if (arg.touches == null)
|
|
upperDown = true;
|
|
else if (arg.touches.Length > 1)
|
|
multiDown = true;
|
|
else
|
|
{
|
|
if ((Global.LowerRCOn[deviceNum] && arg.touches[0].hwX > (1920 * 3) / 4 && arg.touches[0].hwY > (960 * 3) / 4))
|
|
Mapping.MapClick(deviceNum, Mapping.Click.Right);
|
|
if (isLeft(arg.touches[0]))
|
|
leftDown = true;
|
|
else if (isRight(arg.touches[0]))
|
|
rightDown = true;
|
|
}
|
|
dev.getCurrentState(s);
|
|
synthesizeMouseButtons();
|
|
}
|
|
|
|
public DS4State getDS4State()
|
|
{
|
|
return s;
|
|
}
|
|
}
|
|
}
|