Change all these three to use doubles internally, though the outputs of moveAbsolute and moveRelative are still truncated to int.
Signed-off-by: Daniel Stone <[email protected]> --- dix/getevents.c | 48 +++++++++++++++++++++++++----------------------- 1 files changed, 25 insertions(+), 23 deletions(-) v2: Squashed in hunks that accidentally crept in to the 'widen acceleration types' commit. Shuffled some code around a tiny bit. diff --git a/dix/getevents.c b/dix/getevents.c index 4bff3cd..cface3c 100644 --- a/dix/getevents.c +++ b/dix/getevents.c @@ -636,7 +636,7 @@ GetMaximumEventsNum(void) { * InitValuatorAxisClassStruct. */ static void -clipAxis(DeviceIntPtr pDev, int axisNum, int *val) +clipAxis(DeviceIntPtr pDev, int axisNum, double *val) { AxisInfoPtr axis; @@ -666,9 +666,9 @@ clipValuators(DeviceIntPtr pDev, ValuatorMask *mask) for (i = 0; i < valuator_mask_size(mask); i++) if (valuator_mask_isset(mask, i)) { - int val = valuator_mask_get(mask, i); + double val = valuator_mask_get_double(mask, i); clipAxis(pDev, i, &val); - valuator_mask_set(mask, i, val); + valuator_mask_set_double(mask, i, val); } } @@ -718,17 +718,18 @@ static void moveAbsolute(DeviceIntPtr dev, int *x_out, int *y_out, ValuatorMask *mask) { int i; - int x, y; for (i = 0; i < valuator_mask_size(mask); i++) { - if (valuator_mask_isset(mask, i)) - { - int val = valuator_mask_get(mask, i); - clipAxis(dev, i, &val); - dev->last.valuators[i] = val; - valuator_mask_set(mask, i, val); - } + double val; + + if (!valuator_mask_isset(mask, i)) + continue; + val = valuator_mask_get_double(mask, i); + clipAxis(dev, i, &val); + dev->last.valuators[i] = trunc(val); + dev->last.remainder[i] = val - trunc(val); + valuator_mask_set_double(mask, i, val); } *x_out = dev->last.valuators[0]; @@ -752,18 +753,19 @@ moveRelative(DeviceIntPtr dev, int *x_out, int *y_out, ValuatorMask *mask) /* calc other axes, clip, drop back into valuators */ for (i = 0; i < valuator_mask_size(mask); i++) { - if (valuator_mask_isset(mask, i)) - { - int val = dev->last.valuators[i]; - val += valuator_mask_get(mask, i); - /* x & y need to go over the limits to cross screens if the SD - * isn't currently attached; otherwise, clip to screen bounds. */ - if (valuator_get_mode(dev, i) == Absolute && - ((i != 0 && i != 1) || clip_xy)) - clipAxis(dev, i, &val); - dev->last.valuators[i] = val; - valuator_mask_set(mask, i, val); - } + double val = dev->last.valuators[i] + dev->last.remainder[i]; + + if (!valuator_mask_isset(mask, i)) + continue; + val += valuator_mask_get_double(mask, i); + /* x & y need to go over the limits to cross screens if the SD + * isn't currently attached; otherwise, clip to screen bounds. */ + if (valuator_get_mode(dev, i) == Absolute && + ((i != 0 && i != 1) || clip_xy)) + clipAxis(dev, i, &val); + dev->last.valuators[i] = trunc(val); + dev->last.remainder[i] = val - trunc(val); + valuator_mask_set_double(mask, i, val); } *x_out = dev->last.valuators[0]; -- 1.7.5.3 _______________________________________________ [email protected]: X.Org development Archives: http://lists.x.org/archives/xorg-devel Info: http://lists.x.org/mailman/listinfo/xorg-devel
