summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChase Douglas <chase.douglas@canonical.com>2012-02-09 11:15:47 -0800
committerChase Douglas <chase.douglas@canonical.com>2012-02-11 23:01:10 +0100
commit1f4c704476489246a9d0dec6cfdbae92729c9419 (patch)
tree3f5090c519ebb18da0f5e81b32a2f262ed1b0ad3
parent9a1b10131cc55872e1b780acf54b45a7ec829b2f (diff)
Calculate cumulative dx and dy from moved touches
Signed-off-by: Chase Douglas <chase.douglas@canonical.com>
-rw-r--r--src/eventcomm.c35
-rw-r--r--test/fake-symbols.c5
2 files changed, 38 insertions, 2 deletions
diff --git a/src/eventcomm.c b/src/eventcomm.c
index 0161003..2bbc383 100644
--- a/src/eventcomm.c
+++ b/src/eventcomm.c
@@ -524,6 +524,18 @@ SynapticsReadEvent(InputInfoPtr pInfo, struct input_event *ev)
return rc;
}
+static Bool
+EventTouchSlotPreviouslyOpen(SynapticsPrivate *priv, int slot)
+{
+ int i;
+
+ for (i = 0; i < priv->num_active_touches; i++)
+ if (priv->open_slots[i] == slot)
+ return TRUE;
+
+ return FALSE;
+}
+
static void
EventProcessTouchEvent(InputInfoPtr pInfo, struct SynapticsHwState *hw,
struct input_event *ev)
@@ -564,8 +576,20 @@ EventProcessTouchEvent(InputInfoPtr pInfo, struct SynapticsHwState *hw,
int map = proto_data->axis_map[ev->code - ABS_MT_TOUCH_MAJOR];
valuator_mask_set(hw->mt_mask[slot_index], map, ev->value);
if (slot_index >= 0)
- valuator_mask_set(proto_data->last_mt_vals[slot_index], map,
- ev->value);
+ {
+ ValuatorMask *mask = proto_data->last_mt_vals[slot_index];
+ int last_val = valuator_mask_get(mask, map);
+
+ if (EventTouchSlotPreviouslyOpen(priv, slot_index))
+ {
+ if (ev->code == ABS_MT_POSITION_X)
+ hw->cumulative_dx += ev->value - last_val;
+ else if (ev->code == ABS_MT_POSITION_Y)
+ hw->cumulative_dy += ev->value - last_val;
+ }
+
+ valuator_mask_set(mask, map, ev->value);
+ }
}
}
#endif
@@ -607,6 +631,13 @@ EventReadHwState(InputInfoPtr pInfo,
SynapticsResetTouchHwState(hw);
+ /* Reset cumulative values if buttons were not previously pressed */
+ if (!hw->left && !hw->right && !hw->middle)
+ {
+ hw->cumulative_dx = hw->x;
+ hw->cumulative_dy = hw->y;
+ }
+
while (SynapticsReadEvent(pInfo, &ev)) {
switch (ev.type) {
case EV_SYN:
diff --git a/test/fake-symbols.c b/test/fake-symbols.c
index 7f3f0ac..65fad46 100644
--- a/test/fake-symbols.c
+++ b/test/fake-symbols.c
@@ -461,6 +461,11 @@ _X_EXPORT void valuator_mask_free(ValuatorMask **mask)
{
}
+_X_EXPORT int valuator_mask_get(const ValuatorMask *mask, int valuator)
+{
+ return 0;
+}
+
_X_EXPORT void valuator_mask_set(ValuatorMask *mask, int valuator, int data)
{
}