2014-03-29 06:56:30 +01:00
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
2014-06-09 01:41:36 +02:00
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 ;
2014-03-29 06:56:30 +01:00
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 ) ;
}
}
}