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:
parent
9ed43eff48
commit
f9269bebae
|
@ -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:
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
Loading…
Reference in New Issue