dix: Cleanup of GetPointerEvents
Changed all the checks for x&y valuator so the more complex calculation is only made once. Added TODOs for valuator/axis 2 and above for future correct handling of relative reporting of these. Signed-off-by: Peter Hutterer <peter@cs.unisa.edu.au>
This commit is contained in:
parent
a0241d5380
commit
fc1cc0adcb
|
@ -159,20 +159,22 @@ CreateClassesChangedEvent(EventList* event,
|
|||
* Rescale the coord between the two axis ranges.
|
||||
*/
|
||||
static int
|
||||
rescaleValuatorAxis(int coord, int fmin, int fmax,
|
||||
int tmin, int tmax, int smax)
|
||||
rescaleValuatorAxis(int coord, AxisInfoPtr from, AxisInfoPtr to,
|
||||
int defmax)
|
||||
{
|
||||
if(fmin >= fmax) {
|
||||
fmin = 0;
|
||||
fmax = smax;
|
||||
int fmin = 0, tmin = 0, fmax = defmax, tmax = defmax;
|
||||
|
||||
if(from && from->min_value < from->max_value) {
|
||||
fmin = from->min_value;
|
||||
fmax = from->max_value;
|
||||
}
|
||||
if(tmin >= tmax) {
|
||||
tmin = 0;
|
||||
tmax = smax;
|
||||
if(to && to->min_value < to->max_value) {
|
||||
tmin = to->min_value;
|
||||
tmax = to->max_value;
|
||||
}
|
||||
|
||||
if(fmin == tmin && fmax == tmax)
|
||||
return coord;
|
||||
|
||||
return (int)(((float)(coord - fmin)) * (tmax - tmin + 1) /
|
||||
(fmax - fmin + 1)) + tmin;
|
||||
}
|
||||
|
@ -194,13 +196,11 @@ updateSlaveDeviceCoords(DeviceIntPtr master, DeviceIntPtr pDev)
|
|||
/* the valuator axis is in device coords and holds the
|
||||
* position of the pointer, but in device coords. */
|
||||
if(pDev->valuator->numAxes > 0)
|
||||
pDev->valuator->axisVal[0] = rescaleValuatorAxis(pDev->lastx, 0, scr->width,
|
||||
pDev->valuator->axes[0].min_value,
|
||||
pDev->valuator->axes[0].max_value, scr->width);
|
||||
pDev->valuator->axisVal[0] = rescaleValuatorAxis(pDev->lastx, NULL,
|
||||
pDev->valuator->axes + 0, scr->width);
|
||||
if(pDev->valuator->numAxes > 1)
|
||||
pDev->valuator->axisVal[1] = rescaleValuatorAxis(pDev->lasty, 0, scr->height,
|
||||
pDev->valuator->axes[1].min_value,
|
||||
pDev->valuator->axes[1].max_value, scr->height);
|
||||
pDev->valuator->axisVal[1] = rescaleValuatorAxis(pDev->lasty, NULL,
|
||||
pDev->valuator->axes + 1, scr->height);
|
||||
/*TODO calculate the other axis as well based on info from the old slave-device */
|
||||
}
|
||||
|
||||
|
@ -707,17 +707,22 @@ FreeEventList(EventListPtr list, int num_events)
|
|||
* The DDX is responsible for allocating the event structure in the first
|
||||
* place via InitEventList() and GetMaximumEventsNum(), and for freeing it.
|
||||
*
|
||||
* In the generated events rootX/Y will be in absolute screen coords and
|
||||
* the valuator information in the absolute or relative device coords.
|
||||
* lastx/y of the device is always in absolute screen coords while the
|
||||
* device valuator struct contain the absolute device coords.
|
||||
*/
|
||||
_X_EXPORT int
|
||||
GetPointerEvents(EventList *events, DeviceIntPtr pDev, int type, int buttons,
|
||||
int flags, int first_valuator, int num_valuators,
|
||||
int *valuators) {
|
||||
int num_events = 1;
|
||||
CARD32 ms = 0;
|
||||
CARD32 ms;
|
||||
deviceKeyButtonPointer *kbp = NULL;
|
||||
DeviceIntPtr master;
|
||||
int x, y, cx, cy;
|
||||
ScreenPtr scr = miPointerGetScreen(pDev);
|
||||
int *v0 = NULL, *v1 = NULL;
|
||||
|
||||
/* Sanity checks. */
|
||||
if (type != MotionNotify && type != ButtonPress && type != ButtonRelease)
|
||||
|
@ -756,29 +761,34 @@ GetPointerEvents(EventList *events, DeviceIntPtr pDev, int type, int buttons,
|
|||
events++;
|
||||
}
|
||||
|
||||
/* Fetch pointers into the valuator array for more easy to read code */
|
||||
if (num_valuators >= 1 && first_valuator == 0)
|
||||
v0 = valuators + 0;
|
||||
if (first_valuator <= 1 && num_valuators >= (2 - first_valuator))
|
||||
v1 = valuators + 1 - first_valuator;
|
||||
|
||||
/* Set x and y based on whether this is absolute or relative, and
|
||||
* accelerate if we need to. */
|
||||
x = pDev->valuator->axisVal[0];
|
||||
y = pDev->valuator->axisVal[1];
|
||||
if (flags & POINTER_ABSOLUTE) {
|
||||
if (num_valuators >= 1 && first_valuator == 0)
|
||||
x = valuators[0];
|
||||
if (first_valuator <= 1 && num_valuators >= (2 - first_valuator))
|
||||
y = valuators[1 - first_valuator];
|
||||
if(v0) x = *v0;
|
||||
if(v1) y = *v1;
|
||||
/*TODO: Update the rest of the valuators */
|
||||
|
||||
/* Clip both x and y to the defined limits (usually co-ord space limit). */
|
||||
clipAxis(pDev, 0, &x);
|
||||
clipAxis(pDev, 1, &y);
|
||||
/*TODO: Clip the rest of the valuators */
|
||||
}
|
||||
else {
|
||||
if (flags & POINTER_ACCELERATE)
|
||||
acceleratePointer(pDev, first_valuator, num_valuators,
|
||||
valuators);
|
||||
|
||||
if (first_valuator == 0 && num_valuators >= 1)
|
||||
x += valuators[0];
|
||||
if (first_valuator <= 1 && num_valuators >= (2 - first_valuator))
|
||||
y += valuators[1 - first_valuator];
|
||||
if(v0) x += *v0;
|
||||
if(v1) y += *v1;
|
||||
/*TODO: Update the rest of the valuators */
|
||||
|
||||
/* if not core -> clip both x and y to the defined limits (usually
|
||||
* co-ord space limit). */
|
||||
|
@ -786,15 +796,14 @@ GetPointerEvents(EventList *events, DeviceIntPtr pDev, int type, int buttons,
|
|||
clipAxis(pDev, 0, &x);
|
||||
clipAxis(pDev, 1, &y);
|
||||
}
|
||||
/*TODO: Clip the rest of the valuators (Yes, here. Only x&y get special treatment) */
|
||||
}
|
||||
|
||||
/* scale x&y to screen */
|
||||
pDev->lastx = cx = rescaleValuatorAxis(x, pDev->valuator->axes[0].min_value,
|
||||
pDev->valuator->axes[0].max_value,
|
||||
0, scr->width, scr->width);
|
||||
pDev->lasty = cy = rescaleValuatorAxis(y, pDev->valuator->axes[1].min_value,
|
||||
pDev->valuator->axes[1].max_value,
|
||||
0, scr->height, scr->height);
|
||||
pDev->lastx = cx = rescaleValuatorAxis(x, pDev->valuator->axes + 0,
|
||||
NULL, scr->width);
|
||||
pDev->lasty = cy = rescaleValuatorAxis(y, pDev->valuator->axes + 1,
|
||||
NULL, scr->height);
|
||||
|
||||
/* This takes care of crossing screens for us, as well as clipping
|
||||
* to the current screen. Right now, we only have one history buffer,
|
||||
|
@ -803,15 +812,11 @@ GetPointerEvents(EventList *events, DeviceIntPtr pDev, int type, int buttons,
|
|||
|
||||
scr = miPointerGetScreen(pDev);
|
||||
if(cx != pDev->lastx)
|
||||
x = rescaleValuatorAxis(pDev->lastx, 0, scr->width,
|
||||
pDev->valuator->axes[0].min_value,
|
||||
pDev->valuator->axes[0].max_value,
|
||||
scr->width);
|
||||
x = rescaleValuatorAxis(pDev->lastx, NULL,
|
||||
pDev->valuator->axes + 0, scr->width);
|
||||
if(cy != pDev->lasty)
|
||||
y = rescaleValuatorAxis(pDev->lasty, 0, scr->height,
|
||||
pDev->valuator->axes[1].min_value,
|
||||
pDev->valuator->axes[1].max_value,
|
||||
scr->height);
|
||||
y = rescaleValuatorAxis(pDev->lasty, NULL,
|
||||
pDev->valuator->axes + 1, scr->height);
|
||||
|
||||
updateMotionHistory(pDev, ms, first_valuator, num_valuators, valuators);
|
||||
|
||||
|
@ -823,19 +828,17 @@ GetPointerEvents(EventList *events, DeviceIntPtr pDev, int type, int buttons,
|
|||
/* update the valuators based on the mode of the InputDevice */
|
||||
if(pDev->valuator->mode == Absolute) {
|
||||
/* Update the valuators with the true value sent to the client*/
|
||||
if (first_valuator == 0 && num_valuators >= 1)
|
||||
valuators[0] = x;
|
||||
if (first_valuator <= 1 && num_valuators >= (2 - first_valuator))
|
||||
valuators[1] = y;
|
||||
if(v0) *v0 = x;
|
||||
if(v1) *v1 = y;
|
||||
/*TODO Ensure that valuator 2 and onward also are absolute */
|
||||
} else {/* Relative mode */
|
||||
/* If driver reported in absolute, calculate the relative valuator
|
||||
* values as a delta from the old absolute values of the valuator
|
||||
* values. If relative report, keep it as-is.*/
|
||||
if (flags & POINTER_ABSOLUTE) {
|
||||
int i;
|
||||
for (i = first_valuator; i < num_valuators; i++)
|
||||
valuators[i] = valuators[i] - pDev->valuator->axisVal[i];
|
||||
|
||||
for (i = 0; i < num_valuators; i++)
|
||||
valuators[i] = valuators[i] - pDev->valuator->axisVal[i + first_valuator];
|
||||
}
|
||||
}
|
||||
/* Save the last calculated device axis value in the device
|
||||
|
|
Loading…
Reference in New Issue
Block a user