summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Hutterer <peter@cs.unisa.edu.au>2008-05-26 09:26:18 +0930
committerPeter Hutterer <peter@cs.unisa.edu.au>2008-05-26 09:26:18 +0930
commitd22c25bda450f6f1dfa634f0f72b32c4bec429cd (patch)
tree23085ff6bcfa77ab5483ae19b3be4402ba52bd76
parent0877de13ac6ddfb55108aa3456d47f970c6c442c (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.c16
-rw-r--r--include/inputstr.h6
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;