summaryrefslogtreecommitdiff
path: root/dix
diff options
context:
space:
mode:
authorPeter Hutterer <peter.hutterer@who-t.net>2015-05-05 14:18:54 +1000
committerPeter Hutterer <peter.hutterer@who-t.net>2015-05-20 12:44:58 +1000
commit4c2f2cb4c8ca1ab894a65828fdd39aea9b014f69 (patch)
tree80ed79529f84cbcaebfaae08c482df59fbcf2342 /dix
parent3f0d3201f38ef9d1651fcaf94e45c640786edcc0 (diff)
dix: Add unaccelerated valuators to the ValuatorMask
Allows a mask to carry both accelerated and unaccelerated motion at the same time. This is required for xf86-input-libinput where the pointer acceleration happens in libinput already, but parts of the server, specifically raw events and DGA rely on device-specific unaccelerated data. To ease integration add this as a second set to the ValuatorMask rather than extending all APIs to carry a second, possibly NULL set of valuators. Note that a valuator mask should only be used in either accel/unaccel or standard mode at any time. Switching requires either a valuator_mask_zero() call or unsetting all valuators one-by-one. Trying to mix the two will produce a warning. The server has a shortcut for changing a mask with the valuator_mask_drop_unaccelerated() call. This saves us from having to loop through all valuators on every event, we can just drop the bits we know we don't want. Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net> Reviewed-by: Hans de Goede <hdegoede@redhat.com>
Diffstat (limited to 'dix')
-rw-r--r--dix/inpututils.c78
1 files changed, 75 insertions, 3 deletions
diff --git a/dix/inpututils.c b/dix/inpututils.c
index 5c2a32d1c..136398842 100644
--- a/dix/inpututils.c
+++ b/dix/inpututils.c
@@ -505,15 +505,23 @@ valuator_mask_isset(const ValuatorMask *mask, int valuator)
return mask->last_bit >= valuator && BitIsOn(mask->mask, valuator);
}
+static inline void
+_valuator_mask_set_double(ValuatorMask *mask, int valuator, double data)
+{
+ mask->last_bit = max(valuator, mask->last_bit);
+ SetBit(mask->mask, valuator);
+ mask->valuators[valuator] = data;
+}
+
/**
* Set the valuator to the given floating-point data.
*/
void
valuator_mask_set_double(ValuatorMask *mask, int valuator, double data)
{
- mask->last_bit = max(valuator, mask->last_bit);
- SetBit(mask->mask, valuator);
- mask->valuators[valuator] = data;
+ BUG_WARN_MSG(mask->has_unaccelerated,
+ "Do not mix valuator types, zero mask first\n");
+ _valuator_mask_set_double(mask, valuator, data);
}
/**
@@ -594,11 +602,15 @@ valuator_mask_unset(ValuatorMask *mask, int valuator)
ClearBit(mask->mask, valuator);
mask->valuators[valuator] = 0.0;
+ mask->unaccelerated[valuator] = 0.0;
for (i = 0; i <= mask->last_bit; i++)
if (valuator_mask_isset(mask, i))
lastbit = max(lastbit, i);
mask->last_bit = lastbit;
+
+ if (mask->last_bit == -1)
+ mask->has_unaccelerated = FALSE;
}
}
@@ -611,6 +623,66 @@ valuator_mask_copy(ValuatorMask *dest, const ValuatorMask *src)
valuator_mask_zero(dest);
}
+Bool
+valuator_mask_has_unaccelerated(const ValuatorMask *mask)
+{
+ return mask->has_unaccelerated;
+}
+
+void
+valuator_mask_drop_unaccelerated(ValuatorMask *mask)
+{
+ memset(mask->unaccelerated, 0, sizeof(mask->unaccelerated));
+ mask->has_unaccelerated = FALSE;
+}
+
+/**
+ * Set both accelerated and unaccelerated value for this mask.
+ */
+void
+valuator_mask_set_unaccelerated(ValuatorMask *mask,
+ int valuator,
+ double accel,
+ double unaccel)
+{
+ BUG_WARN_MSG(mask->last_bit != -1 && !mask->has_unaccelerated,
+ "Do not mix valuator types, zero mask first\n");
+ _valuator_mask_set_double(mask, valuator, accel);
+ mask->has_unaccelerated = TRUE;
+ mask->unaccelerated[valuator] = unaccel;
+}
+
+double
+valuator_mask_get_accelerated(const ValuatorMask *mask,
+ int valuator)
+{
+ return valuator_mask_get_double(mask, valuator);
+}
+
+double
+valuator_mask_get_unaccelerated(const ValuatorMask *mask,
+ int valuator)
+{
+ return mask->unaccelerated[valuator];
+}
+
+Bool
+valuator_mask_fetch_unaccelerated(const ValuatorMask *mask,
+ int valuator,
+ double *accel,
+ double *unaccel)
+{
+ if (valuator_mask_isset(mask, valuator)) {
+ if (accel)
+ *accel = valuator_mask_get_accelerated(mask, valuator);
+ if (unaccel)
+ *unaccel = valuator_mask_get_unaccelerated(mask, valuator);
+ return TRUE;
+ }
+ else
+ return FALSE;
+}
+
int
CountBits(const uint8_t * mask, int len)
{