dix: update pointer acceleration code to use ValuatorMask

Signed-off-by: Simon Thum <simon.thum@gmx.de>
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
This commit is contained in:
Simon Thum 2011-02-23 02:29:34 +01:00 committed by Peter Hutterer
parent 8128846e16
commit a4b8526185
4 changed files with 70 additions and 99 deletions

View File

@ -791,17 +791,14 @@ moveRelative(DeviceIntPtr dev, int *x, int *y, ValuatorMask *mask)
* Accelerate the data in valuators based on the device's acceleration scheme.
*
* @param dev The device which's pointer is to be moved.
* @param first The first valuator in @valuators
* @param num Total number of valuators in @valuators.
* @param valuators Valuator data for each axis between @first and
* @first+@num.
* @param valuators Valuator mask
* @param ms Current time.
*/
static void
accelPointer(DeviceIntPtr dev, int first, int num, int *valuators, CARD32 ms)
accelPointer(DeviceIntPtr dev, ValuatorMask* valuators, CARD32 ms)
{
if (dev->valuator->accelScheme.AccelSchemeProc)
dev->valuator->accelScheme.AccelSchemeProc(dev, first, num, valuators, ms);
dev->valuator->accelScheme.AccelSchemeProc(dev, valuators, ms);
}
/**
@ -1170,20 +1167,7 @@ GetPointerEvents(EventList *events, DeviceIntPtr pDev, int type, int buttons,
moveAbsolute(pDev, &x, &y, &mask);
} else {
if (flags & POINTER_ACCELERATE) {
/* FIXME: Pointer acceleration only requires X and Y values. This
* should be converted to masked valuators. */
int vals[2];
vals[0] = valuator_mask_isset(&mask, 0) ?
valuator_mask_get(&mask, 0) : 0;
vals[1] = valuator_mask_isset(&mask, 1) ?
valuator_mask_get(&mask, 1) : 0;
accelPointer(pDev, 0, 2, vals, ms);
if (valuator_mask_isset(&mask, 0))
valuator_mask_set(&mask, 0, vals[0]);
if (valuator_mask_isset(&mask, 1))
valuator_mask_set(&mask, 1, vals[1]);
accelPointer(pDev, &mask, ms);
/* The pointer acceleration code modifies the fractional part
* in-place, so we need to extract this information first */
x_frac = pDev->last.remainder[0];

View File

@ -1071,18 +1071,15 @@ GetDevicePredictableAccelData(
void
acceleratePointerPredictable(
DeviceIntPtr dev,
int first_valuator,
int num_valuators,
int *valuators,
ValuatorMask* val,
int evtime)
{
float fdx, fdy, tmp, mult; /* no need to init */
int dx = 0, dy = 0;
int *px = NULL, *py = NULL;
int dx = 0, dy = 0, tmpi;
DeviceVelocityPtr velocitydata = GetDevicePredictableAccelData(dev);
Bool soften = TRUE;
if (!num_valuators || !valuators || !velocitydata)
if (!velocitydata)
return;
if (velocitydata->statistics.profile_number == AccelProfileNone &&
@ -1090,13 +1087,12 @@ acceleratePointerPredictable(
return; /*we're inactive anyway, so skip the whole thing.*/
}
if (first_valuator == 0) {
dx = valuators[0];
px = &valuators[0];
if (valuator_mask_isset(val, 0)) {
dx = valuator_mask_get(val, 0);
}
if (first_valuator <= 1 && num_valuators >= (2 - first_valuator)) {
dy = valuators[1 - first_valuator];
py = &valuators[1 - first_valuator];
if (valuator_mask_isset(val, 1)) {
dy = valuator_mask_get(val, 1);
}
if (dx || dy){
@ -1125,13 +1121,15 @@ acceleratePointerPredictable(
* process each axis conditionally, there's no danger
* of a toggling remainder. Its lack of guarantees likely
* makes it faster on the average target. */
*px = lrintf(tmp);
dev->last.remainder[0] = tmp - (float)*px;
tmpi = lrintf(tmp);
valuator_mask_set(val, 0, tmpi);
dev->last.remainder[0] = tmp - (float)tmpi;
}
if (dy) {
tmp = mult * fdy + dev->last.remainder[1];
*py = lrintf(tmp);
dev->last.remainder[1] = tmp - (float)*py;
tmpi = lrintf(tmp);
valuator_mask_set(val, 1, tmpi);
dev->last.remainder[1] = tmp - (float)tmpi;
}
DebugAccelF("pos (%i | %i) remainders x: %.3f y: %.3f delta x:%.3f y:%.3f\n",
*px, *py, dev->last.remainder[0], dev->last.remainder[1], fdx, fdy);
@ -1152,25 +1150,18 @@ acceleratePointerPredictable(
void
acceleratePointerLightweight(
DeviceIntPtr dev,
int first_valuator,
int num_valuators,
int *valuators,
ValuatorMask* val,
int ignored)
{
float mult = 0.0;
int dx = 0, dy = 0;
int *px = NULL, *py = NULL;
float mult = 0.0, tmpf;
int dx = 0, dy = 0, tmpi;
if (!num_valuators || !valuators)
return;
if (first_valuator == 0) {
dx = valuators[0];
px = &valuators[0];
if (valuator_mask_isset(val, 0)) {
dx = valuator_mask_get(val, 0);
}
if (first_valuator <= 1 && num_valuators >= (2 - first_valuator)) {
dy = valuators[1 - first_valuator];
py = &valuators[1 - first_valuator];
if (valuator_mask_isset(val, 1)) {
dy = valuator_mask_get(val, 1);
}
if (!dx && !dy)
@ -1180,24 +1171,24 @@ acceleratePointerLightweight(
/* modeled from xf86Events.c */
if (dev->ptrfeed->ctrl.threshold) {
if ((abs(dx) + abs(dy)) >= dev->ptrfeed->ctrl.threshold) {
dev->last.remainder[0] = ((float)dx *
tmpf = ((float)dx *
(float)(dev->ptrfeed->ctrl.num)) /
(float)(dev->ptrfeed->ctrl.den) +
dev->last.remainder[0];
if (px) {
*px = (int)dev->last.remainder[0];
dev->last.remainder[0] = dev->last.remainder[0] -
(float)(*px);
if (dx) {
tmpi = (int) tmpf;
valuator_mask_set(val, 0, tmpi);
dev->last.remainder[0] = tmpf - (float)tmpi;
}
dev->last.remainder[1] = ((float)dy *
tmpf = ((float)dy *
(float)(dev->ptrfeed->ctrl.num)) /
(float)(dev->ptrfeed->ctrl.den) +
dev->last.remainder[1];
if (py) {
*py = (int)dev->last.remainder[1];
dev->last.remainder[1] = dev->last.remainder[1] -
(float)(*py);
if (dy) {
tmpi = (int) tmpf;
valuator_mask_set(val, 1, tmpi);
dev->last.remainder[1] = tmpf - (float)tmpi;
}
}
}
@ -1207,18 +1198,18 @@ acceleratePointerLightweight(
(float)(dev->ptrfeed->ctrl.den) - 1.0) /
2.0) / 2.0;
if (dx) {
dev->last.remainder[0] = mult * (float)dx +
tmpf = mult * (float)dx +
dev->last.remainder[0];
*px = (int)dev->last.remainder[0];
dev->last.remainder[0] = dev->last.remainder[0] -
(float)(*px);
tmpi = (int) tmpf;
valuator_mask_set(val, 0, tmpi);
dev->last.remainder[0] = tmpf - (float)tmpi;
}
if (dy) {
dev->last.remainder[1] = mult * (float)dy +
tmpf = mult * (float)dy +
dev->last.remainder[1];
*py = (int)dev->last.remainder[1];
dev->last.remainder[1] = dev->last.remainder[1] -
(float)(*py);
tmpi = (int)tmpf;
valuator_mask_set(val, 1, tmpi);
dev->last.remainder[1] = tmpf - (float)tmpi;
}
}
}

View File

@ -106,6 +106,8 @@ typedef struct _ClassesRec *ClassesPtr;
typedef struct _SpriteRec *SpritePtr;
typedef union _GrabMask GrabMask;
typedef struct _ValuatorMask ValuatorMask;
typedef struct _EventList {
xEvent* event;
int evlen; /* length of allocated memory for event in bytes. This is not
@ -141,10 +143,8 @@ typedef void (*DeviceUnwrapProc)(
/* pointer acceleration handling */
typedef void (*PointerAccelSchemeProc)(
DeviceIntPtr /*pDev*/,
int /*first_valuator*/,
int /*num_valuators*/,
int* /*valuators*/,
DeviceIntPtr /*device*/,
ValuatorMask* /*valuators*/,
int /*evtime*/);
typedef void (*DeviceCallbackProc)(
@ -163,8 +163,6 @@ typedef struct _DeviceRec {
Bool on; /* used by DDX to keep state */
} DeviceRec, *DevicePtr;
typedef struct _ValuatorMask ValuatorMask;
typedef struct {
int click, bell, bell_pitch, bell_duration;
Bool autoRepeat;

View File

@ -1,6 +1,6 @@
/*
*
* Copyright © 2006-2009 Simon Thum simon dot thum at gmx dot de
* Copyright © 2006-2011 Simon Thum simon dot thum at gmx dot de
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
@ -25,7 +25,7 @@
#ifndef POINTERVELOCITY_H
#define POINTERVELOCITY_H
#include <input.h> /* DeviceIntPtr */
#include <input.h>
/* constants for acceleration profiles */
@ -134,11 +134,9 @@ InitPredictableAccelerationScheme(DeviceIntPtr dev,
struct _ValuatorAccelerationRec* protoScheme);
extern _X_INTERNAL void
acceleratePointerPredictable(DeviceIntPtr dev, int first_valuator,
int num_valuators, int *valuators, int evtime);
acceleratePointerPredictable(DeviceIntPtr dev, ValuatorMask* val, int evtime);
extern _X_INTERNAL void
acceleratePointerLightweight(DeviceIntPtr dev, int first_valuator,
int num_valuators, int *valuators, int ignored);
acceleratePointerLightweight(DeviceIntPtr dev, ValuatorMask* val, int evtime);
#endif /* POINTERVELOCITY_H */