DeviceIntRec: move lastx/lasty from valuator into DeviceIntRec.

We free the ValuatorClassRec quite regularly. If a SIGIO is handled while
we're swapping device classes, we can bring the server down when we try to
access lastx/lasty of the master device.
This commit is contained in:
Peter Hutterer 2007-11-22 17:30:14 +10:30
parent 9ed43eff48
commit f9269bebae
6 changed files with 26 additions and 28 deletions

View File

@ -444,8 +444,8 @@ ProcXTestFakeInput(client)
(dev, root->drawable.pScreen, (dev, root->drawable.pScreen,
ev->u.keyButtonPointer.rootX, ev->u.keyButtonPointer.rootX,
ev->u.keyButtonPointer.rootY, FALSE); ev->u.keyButtonPointer.rootY, FALSE);
dev->valuator->lastx = ev->u.keyButtonPointer.rootX; dev->lastx = ev->u.keyButtonPointer.rootX;
dev->valuator->lasty = ev->u.keyButtonPointer.rootY; dev->lasty = ev->u.keyButtonPointer.rootY;
break; break;
case ButtonPress: case ButtonPress:
case ButtonRelease: case ButtonRelease:

View File

@ -176,8 +176,8 @@ ProcXWarpDevicePointer(ClientPtr client)
} }
/* if we don't update the device, we get a jump next time it moves */ /* if we don't update the device, we get a jump next time it moves */
pDev->valuator->lastx = x; pDev->lastx = x;
pDev->valuator->lasty = x; pDev->lasty = x;
miPointerUpdateSprite(pDev); miPointerUpdateSprite(pDev);
/* FIXME: XWarpPointer is supposed to generate an event. It doesn't do it /* FIXME: XWarpPointer is supposed to generate an event. It doesn't do it

View File

@ -505,9 +505,9 @@ CorePointerProc(DeviceIntPtr pDev, int what)
GetMotionHistory, (PtrCtrlProcPtr)NoopDDA, GetMotionHistory, (PtrCtrlProcPtr)NoopDDA,
GetMotionHistorySize(), 2); GetMotionHistorySize(), 2);
pDev->valuator->axisVal[0] = screenInfo.screens[0]->width / 2; pDev->valuator->axisVal[0] = screenInfo.screens[0]->width / 2;
pDev->valuator->lastx = pDev->valuator->axisVal[0]; pDev->lastx = pDev->valuator->axisVal[0];
pDev->valuator->axisVal[1] = screenInfo.screens[0]->height / 2; pDev->valuator->axisVal[1] = screenInfo.screens[0]->height / 2;
pDev->valuator->lasty = pDev->valuator->axisVal[1]; pDev->lasty = pDev->valuator->axisVal[1];
classes->key = pDev->key; classes->key = pDev->key;
classes->valuator = pDev->valuator; classes->valuator = pDev->valuator;
@ -1226,8 +1226,6 @@ InitValuatorClassDeviceStruct(DeviceIntPtr dev, int numAxes,
valc->mode = mode; valc->mode = mode;
valc->axes = (AxisInfoPtr)(valc + 1); valc->axes = (AxisInfoPtr)(valc + 1);
valc->axisVal = (int *)(valc->axes + numAxes); valc->axisVal = (int *)(valc->axes + numAxes);
valc->lastx = 0;
valc->lasty = 0;
valc->dxremaind = 0; valc->dxremaind = 0;
valc->dyremaind = 0; valc->dyremaind = 0;
dev->valuator = valc; dev->valuator = valc;

View File

@ -487,8 +487,8 @@ GetKeyboardValuatorEvents(EventList *events, DeviceIntPtr pDev, int type,
if (master->valuator && pDev->valuator) if (master->valuator && pDev->valuator)
{ {
pDev->valuator->lastx = master->valuator->lastx; pDev->lastx = master->lastx;
pDev->valuator->lasty = master->valuator->lasty; pDev->lasty = master->lasty;
} }
master->u.lastSlave = pDev; master->u.lastSlave = pDev;
numEvents++; numEvents++;
@ -671,8 +671,8 @@ GetPointerEvents(EventList *events, DeviceIntPtr pDev, int type, int buttons,
{ {
CreateClassesChangedEvent(events, master, pDev); CreateClassesChangedEvent(events, master, pDev);
pDev->valuator->lastx = master->valuator->lastx; pDev->lastx = master->lastx;
pDev->valuator->lasty = master->valuator->lasty; pDev->lasty = master->lasty;
master->u.lastSlave = pDev; master->u.lastSlave = pDev;
num_events++; num_events++;
@ -728,14 +728,14 @@ GetPointerEvents(EventList *events, DeviceIntPtr pDev, int type, int buttons,
x = valuators[0]; x = valuators[0];
} }
else { else {
x = pDev->valuator->lastx; x = pDev->lastx;
} }
if (first_valuator <= 1 && num_valuators >= (2 - first_valuator)) { if (first_valuator <= 1 && num_valuators >= (2 - first_valuator)) {
y = valuators[1 - first_valuator]; y = valuators[1 - first_valuator];
} }
else { else {
y = pDev->valuator->lasty; y = pDev->lasty;
} }
} }
else { else {
@ -744,14 +744,14 @@ GetPointerEvents(EventList *events, DeviceIntPtr pDev, int type, int buttons,
valuators); valuators);
if (first_valuator == 0 && num_valuators >= 1) if (first_valuator == 0 && num_valuators >= 1)
x = pDev->valuator->lastx + valuators[0]; x = pDev->lastx + valuators[0];
else else
x = pDev->valuator->lastx; x = pDev->lastx;
if (first_valuator <= 1 && num_valuators >= (2 - first_valuator)) if (first_valuator <= 1 && num_valuators >= (2 - first_valuator))
y = pDev->valuator->lasty + valuators[1 - first_valuator]; y = pDev->lasty + valuators[1 - first_valuator];
else else
y = pDev->valuator->lasty; y = pDev->lasty;
} }
/* Clip both x and y to the defined limits (usually co-ord space limit). */ /* Clip both x and y to the defined limits (usually co-ord space limit). */
@ -772,12 +772,12 @@ GetPointerEvents(EventList *events, DeviceIntPtr pDev, int type, int buttons,
updateMotionHistory(pDev, ms, first_valuator, num_valuators, valuators); updateMotionHistory(pDev, ms, first_valuator, num_valuators, valuators);
pDev->valuator->lastx = x; pDev->lastx = x;
pDev->valuator->lasty = y; pDev->lasty = y;
if (master) if (master)
{ {
master->valuator->lastx = x; master->lastx = x;
master->valuator->lasty = y; master->lasty = y;
} }
if (!coreOnly) if (!coreOnly)

View File

@ -554,14 +554,14 @@ xf86PostMotionEventP(DeviceIntPtr device,
{ {
dx = valuators[0]; dx = valuators[0];
if (is_absolute) if (is_absolute)
dx -= device->valuator->lastx; dx -= device->lastx;
} }
if (first_valuator == 1 || num_valuators >= 2) if (first_valuator == 1 || num_valuators >= 2)
{ {
dy = valuators[1 - first_valuator]; dy = valuators[1 - first_valuator];
if (is_absolute) if (is_absolute)
dy -= device->valuator->lasty; dy -= device->lasty;
} }
if (DGAStealMotionEvent(device, index, dx, dy)) if (DGAStealMotionEvent(device, index, dx, dy))
@ -825,11 +825,11 @@ xf86InitValuatorDefaults(DeviceIntPtr dev, int axnum)
{ {
if (axnum == 0) { if (axnum == 0) {
dev->valuator->axisVal[0] = screenInfo.screens[0]->width / 2; dev->valuator->axisVal[0] = screenInfo.screens[0]->width / 2;
dev->valuator->lastx = dev->valuator->axisVal[0]; dev->lastx = dev->valuator->axisVal[0];
} }
else if (axnum == 1) { else if (axnum == 1) {
dev->valuator->axisVal[1] = screenInfo.screens[0]->height / 2; dev->valuator->axisVal[1] = screenInfo.screens[0]->height / 2;
dev->valuator->lasty = dev->valuator->axisVal[1]; dev->lasty = dev->valuator->axisVal[1];
} }
} }

View File

@ -174,8 +174,6 @@ typedef struct _ValuatorClassRec {
AxisInfoPtr axes; AxisInfoPtr axes;
unsigned short numAxes; unsigned short numAxes;
int *axisVal; int *axisVal;
int lastx, lasty; /* last event recorded, not posted to
* client; see dix/devices.c */
int dxremaind, dyremaind; /* for acceleration */ int dxremaind, dyremaind; /* for acceleration */
CARD8 mode; CARD8 mode;
} ValuatorClassRec, *ValuatorClassPtr; } ValuatorClassRec, *ValuatorClassPtr;
@ -421,6 +419,8 @@ typedef struct _DeviceIntRec {
DeviceIntPtr master; /* master device */ DeviceIntPtr master; /* master device */
DeviceIntPtr lastSlave; /* last slave device used */ DeviceIntPtr lastSlave; /* last slave device used */
} u; } u;
int lastx, lasty; /* last event recorded, not posted to
* client; see dix/devices.c */
} DeviceIntRec; } DeviceIntRec;
typedef struct { typedef struct {