diff options
author | Peter Hutterer <peter@cs.unisa.edu.au> | 2008-05-26 09:26:18 +0930 |
---|---|---|
committer | Peter Hutterer <peter@cs.unisa.edu.au> | 2008-05-26 09:26:18 +0930 |
commit | d22c25bda450f6f1dfa634f0f72b32c4bec429cd (patch) | |
tree | 23085ff6bcfa77ab5483ae19b3be4402ba52bd76 | |
parent | 0877de13ac6ddfb55108aa3456d47f970c6c442c (diff) |
dix: Allocate MD's motion history to be large enough for potential valuators
Since we can't predict how many valuators may be in a future SD attached to an
MD, we need to preallocate a history buffer that is large enough to keep
MAX_VALUATORS coordinates per event.
In addition, the history buffer needs to memorize the coordinate ranges at the
time, thus requiring MDs to store (min_val, max_val, current_val, time)
instead of (current_val, time) for each motion history entry.
This commit only fixes the allocation.
-rw-r--r-- | dix/getevents.c | 16 | ||||
-rw-r--r-- | include/inputstr.h | 6 |
2 files changed, 16 insertions, 6 deletions
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; |