Commit | Line | Data |
---|---|---|
a09e091a JB |
1 | /* |
2 | * | |
3 | * Copyright © 2006-2011 Simon Thum simon dot thum at gmx dot de | |
4 | * | |
5 | * Permission is hereby granted, free of charge, to any person obtaining a | |
6 | * copy of this software and associated documentation files (the "Software"), | |
7 | * to deal in the Software without restriction, including without limitation | |
8 | * the rights to use, copy, modify, merge, publish, distribute, sublicense, | |
9 | * and/or sell copies of the Software, and to permit persons to whom the | |
10 | * Software is furnished to do so, subject to the following conditions: | |
11 | * | |
12 | * The above copyright notice and this permission notice (including the next | |
13 | * paragraph) shall be included in all copies or substantial portions of the | |
14 | * Software. | |
15 | * | |
16 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | |
17 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | |
18 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | |
19 | * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | |
20 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING | |
21 | * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER | |
22 | * DEALINGS IN THE SOFTWARE. | |
23 | */ | |
24 | ||
25 | #ifndef POINTERVELOCITY_H | |
26 | #define POINTERVELOCITY_H | |
27 | ||
28 | #include <input.h> | |
29 | ||
30 | /* constants for acceleration profiles */ | |
31 | ||
32 | #define AccelProfileNone -1 | |
33 | #define AccelProfileClassic 0 | |
34 | #define AccelProfileDeviceSpecific 1 | |
35 | #define AccelProfilePolynomial 2 | |
36 | #define AccelProfileSmoothLinear 3 | |
37 | #define AccelProfileSimple 4 | |
38 | #define AccelProfilePower 5 | |
39 | #define AccelProfileLinear 6 | |
40 | #define AccelProfileSmoothLimited 7 | |
41 | #define AccelProfileLAST AccelProfileSmoothLimited | |
42 | ||
43 | /* fwd */ | |
44 | struct _DeviceVelocityRec; | |
45 | ||
46 | /** | |
47 | * profile | |
48 | * returns actual acceleration depending on velocity, acceleration control,... | |
49 | */ | |
50 | typedef double (*PointerAccelerationProfileFunc) | |
51 | (DeviceIntPtr dev, struct _DeviceVelocityRec * vel, | |
52 | double velocity, double threshold, double accelCoeff); | |
53 | ||
54 | /** | |
55 | * a motion history, with just enough information to | |
56 | * calc mean velocity and decide which motion was along | |
57 | * a more or less straight line | |
58 | */ | |
59 | typedef struct _MotionTracker { | |
60 | double dx, dy; /* accumulated delta for each axis */ | |
61 | int time; /* time of creation */ | |
62 | int dir; /* initial direction bitfield */ | |
63 | } MotionTracker, *MotionTrackerPtr; | |
64 | ||
65 | /** | |
66 | * Contains all data needed to implement mouse ballistics | |
67 | */ | |
68 | typedef struct _DeviceVelocityRec { | |
69 | MotionTrackerPtr tracker; | |
70 | int num_tracker; | |
71 | int cur_tracker; /* current index */ | |
72 | double velocity; /* velocity as guessed by algorithm */ | |
73 | double last_velocity; /* previous velocity estimate */ | |
74 | double last_dx; /* last time-difference */ | |
75 | double last_dy; /* phase of last/current estimate */ | |
76 | double corr_mul; /* config: multiply this into velocity */ | |
77 | double const_acceleration; /* config: (recipr.) const deceleration */ | |
78 | double min_acceleration; /* config: minimum acceleration */ | |
79 | short reset_time; /* config: reset non-visible state after # ms */ | |
80 | short use_softening; /* config: use softening of mouse values */ | |
81 | double max_rel_diff; /* config: max. relative difference */ | |
82 | double max_diff; /* config: max. difference */ | |
83 | int initial_range; /* config: max. offset used as initial velocity */ | |
84 | Bool average_accel; /* config: average acceleration over velocity */ | |
85 | PointerAccelerationProfileFunc Profile; | |
86 | PointerAccelerationProfileFunc deviceSpecificProfile; | |
87 | void *profile_private; /* extended data, see SetAccelerationProfile() */ | |
88 | struct { /* to be able to query this information */ | |
89 | int profile_number; | |
90 | } statistics; | |
91 | } DeviceVelocityRec, *DeviceVelocityPtr; | |
92 | ||
93 | /** | |
94 | * contains the run-time data for the predictable scheme, that is, a | |
95 | * DeviceVelocityPtr and the property handlers. | |
96 | */ | |
97 | typedef struct _PredictableAccelSchemeRec { | |
98 | DeviceVelocityPtr vel; | |
99 | long *prop_handlers; | |
100 | int num_prop_handlers; | |
101 | } PredictableAccelSchemeRec, *PredictableAccelSchemePtr; | |
102 | ||
103 | extern _X_EXPORT void | |
104 | InitVelocityData(DeviceVelocityPtr vel); | |
105 | ||
106 | extern _X_EXPORT void | |
107 | InitTrackers(DeviceVelocityPtr vel, int ntracker); | |
108 | ||
109 | extern _X_EXPORT BOOL | |
110 | ProcessVelocityData2D(DeviceVelocityPtr vel, double dx, double dy, int time); | |
111 | ||
112 | extern _X_EXPORT double | |
113 | BasicComputeAcceleration(DeviceIntPtr dev, DeviceVelocityPtr vel, | |
114 | double velocity, double threshold, double acc); | |
115 | ||
116 | extern _X_EXPORT void | |
117 | FreeVelocityData(DeviceVelocityPtr vel); | |
118 | ||
119 | extern _X_EXPORT int | |
120 | SetAccelerationProfile(DeviceVelocityPtr vel, int profile_num); | |
121 | ||
122 | extern _X_EXPORT DeviceVelocityPtr | |
123 | GetDevicePredictableAccelData(DeviceIntPtr dev); | |
124 | ||
125 | extern _X_EXPORT void | |
126 | SetDeviceSpecificAccelerationProfile(DeviceVelocityPtr vel, | |
127 | PointerAccelerationProfileFunc profile); | |
128 | ||
129 | extern _X_INTERNAL void | |
130 | AccelerationDefaultCleanup(DeviceIntPtr dev); | |
131 | ||
132 | extern _X_INTERNAL Bool | |
133 | InitPredictableAccelerationScheme(DeviceIntPtr dev, | |
134 | struct _ValuatorAccelerationRec *protoScheme); | |
135 | ||
136 | extern _X_INTERNAL void | |
137 | acceleratePointerPredictable(DeviceIntPtr dev, ValuatorMask *val, | |
138 | CARD32 evtime); | |
139 | ||
140 | extern _X_INTERNAL void | |
141 | acceleratePointerLightweight(DeviceIntPtr dev, ValuatorMask *val, | |
142 | CARD32 evtime); | |
143 | ||
144 | #endif /* POINTERVELOCITY_H */ |