a3f3701cea1ba388e7c877955252bb7375eedebdvboxsync/*
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsync *
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsync * Copyright © 2006-2011 Simon Thum simon dot thum at gmx dot de
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsync *
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsync * Permission is hereby granted, free of charge, to any person obtaining a
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsync * copy of this software and associated documentation files (the "Software"),
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsync * to deal in the Software without restriction, including without limitation
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsync * the rights to use, copy, modify, merge, publish, distribute, sublicense,
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsync * and/or sell copies of the Software, and to permit persons to whom the
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsync * Software is furnished to do so, subject to the following conditions:
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsync *
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsync * The above copyright notice and this permission notice (including the next
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsync * paragraph) shall be included in all copies or substantial portions of the
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsync * Software.
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsync *
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsync * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsync * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsync * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsync * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsync * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsync * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsync * DEALINGS IN THE SOFTWARE.
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsync */
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsync
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsync#ifndef POINTERVELOCITY_H
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsync#define POINTERVELOCITY_H
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsync
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsync#include <input.h>
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsync
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsync/* constants for acceleration profiles */
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsync
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsync#define AccelProfileNone -1
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsync#define AccelProfileClassic 0
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsync#define AccelProfileDeviceSpecific 1
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsync#define AccelProfilePolynomial 2
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsync#define AccelProfileSmoothLinear 3
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsync#define AccelProfileSimple 4
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsync#define AccelProfilePower 5
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsync#define AccelProfileLinear 6
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsync#define AccelProfileSmoothLimited 7
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsync#define AccelProfileLAST AccelProfileSmoothLimited
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsync
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsync/* fwd */
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsyncstruct _DeviceVelocityRec;
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsync
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsync/**
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsync * profile
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsync * returns actual acceleration depending on velocity, acceleration control,...
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsync */
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsynctypedef double (*PointerAccelerationProfileFunc)
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsync (DeviceIntPtr dev, struct _DeviceVelocityRec * vel,
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsync double velocity, double threshold, double accelCoeff);
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsync
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsync/**
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsync * a motion history, with just enough information to
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsync * calc mean velocity and decide which motion was along
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsync * a more or less straight line
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsync */
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsynctypedef struct _MotionTracker {
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsync double dx, dy; /* accumulated delta for each axis */
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsync int time; /* time of creation */
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsync int dir; /* initial direction bitfield */
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsync} MotionTracker, *MotionTrackerPtr;
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsync
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsync/**
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsync * Contains all data needed to implement mouse ballistics
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsync */
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsynctypedef struct _DeviceVelocityRec {
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsync MotionTrackerPtr tracker;
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsync int num_tracker;
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsync int cur_tracker; /* current index */
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsync double velocity; /* velocity as guessed by algorithm */
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsync double last_velocity; /* previous velocity estimate */
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsync double last_dx; /* last time-difference */
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsync double last_dy; /* phase of last/current estimate */
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsync double corr_mul; /* config: multiply this into velocity */
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsync double const_acceleration; /* config: (recipr.) const deceleration */
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsync double min_acceleration; /* config: minimum acceleration */
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsync short reset_time; /* config: reset non-visible state after # ms */
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsync short use_softening; /* config: use softening of mouse values */
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsync double max_rel_diff; /* config: max. relative difference */
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsync double max_diff; /* config: max. difference */
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsync int initial_range; /* config: max. offset used as initial velocity */
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsync Bool average_accel; /* config: average acceleration over velocity */
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsync PointerAccelerationProfileFunc Profile;
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsync PointerAccelerationProfileFunc deviceSpecificProfile;
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsync void *profile_private; /* extended data, see SetAccelerationProfile() */
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsync struct { /* to be able to query this information */
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsync int profile_number;
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsync } statistics;
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsync} DeviceVelocityRec, *DeviceVelocityPtr;
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsync
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsync/**
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsync * contains the run-time data for the predictable scheme, that is, a
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsync * DeviceVelocityPtr and the property handlers.
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsync */
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsynctypedef struct _PredictableAccelSchemeRec {
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsync DeviceVelocityPtr vel;
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsync long *prop_handlers;
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsync int num_prop_handlers;
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsync} PredictableAccelSchemeRec, *PredictableAccelSchemePtr;
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsync
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsyncextern _X_EXPORT void
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsyncInitVelocityData(DeviceVelocityPtr vel);
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsync
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsyncextern _X_EXPORT void
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsyncInitTrackers(DeviceVelocityPtr vel, int ntracker);
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsync
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsyncextern _X_EXPORT BOOL
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsyncProcessVelocityData2D(DeviceVelocityPtr vel, double dx, double dy, int time);
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsync
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsyncextern _X_EXPORT double
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsyncBasicComputeAcceleration(DeviceIntPtr dev, DeviceVelocityPtr vel,
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsync double velocity, double threshold, double acc);
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsync
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsyncextern _X_EXPORT void
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsyncFreeVelocityData(DeviceVelocityPtr vel);
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsync
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsyncextern _X_EXPORT int
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsyncSetAccelerationProfile(DeviceVelocityPtr vel, int profile_num);
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsync
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsyncextern _X_EXPORT DeviceVelocityPtr
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsyncGetDevicePredictableAccelData(DeviceIntPtr dev);
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsync
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsyncextern _X_EXPORT void
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsyncSetDeviceSpecificAccelerationProfile(DeviceVelocityPtr vel,
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsync PointerAccelerationProfileFunc profile);
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsync
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsyncextern _X_INTERNAL void
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsyncAccelerationDefaultCleanup(DeviceIntPtr dev);
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsync
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsyncextern _X_INTERNAL Bool
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsyncInitPredictableAccelerationScheme(DeviceIntPtr dev,
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsync struct _ValuatorAccelerationRec *protoScheme);
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsync
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsyncextern _X_INTERNAL void
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsyncacceleratePointerPredictable(DeviceIntPtr dev, ValuatorMask *val,
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsync CARD32 evtime);
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsync
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsyncextern _X_INTERNAL void
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsyncacceleratePointerLightweight(DeviceIntPtr dev, ValuatorMask *val,
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsync CARD32 evtime);
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsync
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsync#endif /* POINTERVELOCITY_H */