diff --git a/dix/getevents.c b/dix/getevents.c index dda681d27..6e723f88f 100644 --- a/dix/getevents.c +++ b/dix/getevents.c @@ -232,15 +232,25 @@ updateSlaveDeviceCoords(DeviceIntPtr master, DeviceIntPtr pDev) _X_EXPORT void AllocateMotionHistory(DeviceIntPtr pDev) { + int size; if (pDev->valuator->motion) xfree(pDev->valuator->motion); if (pDev->valuator->numMotionEvents < 1) return; - pDev->valuator->motion = xalloc(((sizeof(INT32) * pDev->valuator->numAxes) - + sizeof(Time)) * - pDev->valuator->numMotionEvents); + /* An MD must have a motion history size large enough to keep all + * potential valuators, plus the respective range of the valuators. + * 3 * INT32 for (min_val, max_val, curr_val)) + */ + if (pDev->isMaster) + size = sizeof(INT32) * 3 * MAX_VALUATORS; + else + size = sizeof(INT32) * pDev->valuator->numAxes; + + size += sizeof(Time); + + pDev->valuator->motion = xcalloc(pDev->valuator->numMotionEvents, size); pDev->valuator->first_motion = 0; pDev->valuator->last_motion = 0; } diff --git a/include/inputstr.h b/include/inputstr.h index 86b166721..5e745b356 100644 --- a/include/inputstr.h +++ b/include/inputstr.h @@ -167,9 +167,9 @@ typedef struct _ValuatorClassRec { int numMotionEvents; int first_motion; int last_motion; - void *motion; /* motion history buffer */ - - WindowPtr motionHintWindow; + void *motion; /* motion history buffer. Different layout + for MDs and SDs!*/ + WindowPtr motionHintWindow; AxisInfoPtr axes; unsigned short numAxes;