input: Ensure Valuator axes are aligned as needed

Let the compiler figure out the correct alignment for the axes data
for a valuator by using a union to force double alignment of the
initial ValuatorClassRec structure in the allocation.

Signed-off-by: Keith Packard <keithp@keithp.com>
Tested-by: Julien Cristau <jcristau@debian.org>
Reviewed-by: Julien Cristau <jcristau@debian.org>
This commit is contained in:
Keith Packard 2011-02-25 21:10:21 -08:00
parent dc8f52e77f
commit 678f5396c9

View File

@ -1225,6 +1225,7 @@ InitValuatorClassDeviceStruct(DeviceIntPtr dev, int numAxes, Atom *labels,
{ {
int i; int i;
ValuatorClassPtr valc; ValuatorClassPtr valc;
union align_u { ValuatorClassRec valc; double d; } *align;
if (!dev) if (!dev)
return FALSE; return FALSE;
@ -1237,12 +1238,13 @@ InitValuatorClassDeviceStruct(DeviceIntPtr dev, int numAxes, Atom *labels,
numAxes = MAX_VALUATORS; numAxes = MAX_VALUATORS;
} }
valc = (ValuatorClassPtr)calloc(1, sizeof(ValuatorClassRec) + align = (union align_u *) calloc(1, sizeof(union align_u) +
numAxes * sizeof(AxisInfo) + numAxes * sizeof(double) +
numAxes * sizeof(double)); numAxes * sizeof(AxisInfo));
if (!valc) if (!align)
return FALSE; return FALSE;
valc = &align->valc;
valc->sourceid = dev->id; valc->sourceid = dev->id;
valc->motion = NULL; valc->motion = NULL;
valc->first_motion = 0; valc->first_motion = 0;
@ -1251,8 +1253,8 @@ InitValuatorClassDeviceStruct(DeviceIntPtr dev, int numAxes, Atom *labels,
valc->numMotionEvents = numMotionEvents; valc->numMotionEvents = numMotionEvents;
valc->motionHintWindow = NullWindow; valc->motionHintWindow = NullWindow;
valc->numAxes = numAxes; valc->numAxes = numAxes;
valc->axes = (AxisInfoPtr)(valc + 1); valc->axisVal = (double *)(align + 1);
valc->axisVal = (double *)(valc->axes + numAxes); valc->axes = (AxisInfoPtr)(valc->axisVal + numAxes);
if (mode & OutOfProximity) if (mode & OutOfProximity)
InitProximityClassDeviceStruct(dev); InitProximityClassDeviceStruct(dev);