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