From 0cf2abcb26569133f982ea61855d687fafee0c78 Mon Sep 17 00:00:00 2001 From: Benjamin Otte Date: Mon, 6 Feb 2012 03:10:56 +0100 Subject: [PATCH] eventcomm: Make code work without custom valuator Instead, always use the valuator for the current touchpoint directly. Fixes crazy pointer jumps with Apple Magic Trackpad. https://bugs.freedesktop.org/show_bug.cgi?id=45663 --- src/eventcomm.c | 36 ++++++------------------------------ 1 files changed, 6 insertions(+), 30 deletions(-) diff --git a/src/eventcomm.c b/src/eventcomm.c index be0f4ee..5c3be19 100644 --- a/src/eventcomm.c +++ b/src/eventcomm.c @@ -76,7 +76,6 @@ struct eventcomm_proto_data SLOTSTATE_UPDATE, SLOTSTATE_EMPTY, } slot_state; - ValuatorMask *mt_mask; ValuatorMask **last_mt_vals; #endif }; @@ -109,7 +108,6 @@ UninitializeTouch(InputInfoPtr pInfo) if (!proto_data->mtdev) return; - valuator_mask_free(&proto_data->mt_mask); if (proto_data->last_mt_vals) { int i; @@ -141,18 +139,6 @@ InitializeTouch(InputInfoPtr pInfo) proto_data->cur_slot = proto_data->mtdev->caps.slot.value; - /* Axes 0-4 are for X, Y, and scrolling. num_mt_axes does not include X and - * Y. */ - proto_data->mt_mask = valuator_mask_new(4 + priv->num_mt_axes); - if (!proto_data->mt_mask) - { - xf86IDrvMsg(pInfo, X_WARNING, - "failed to create MT valuator mask, ignoring touch " - "events\n"); - UninitializeTouch(pInfo); - return; - } - proto_data->last_mt_vals = calloc(num_slots(proto_data), sizeof(ValuatorMask *)); if (!proto_data->last_mt_vals) @@ -517,9 +503,10 @@ EventProcessTouch(InputInfoPtr pInfo) #ifdef HAVE_MTDEV SynapticsPrivate *priv = (SynapticsPrivate *)pInfo->private; struct eventcomm_proto_data *proto_data = priv->proto_data; + int slot_index = last_mt_vals_slot(proto_data); int type; - if (proto_data->cur_slot < 0 || !priv->has_touch) + if (slot_index < 0 || !priv->has_touch) return; /* If the ABS_MT_SLOT is the first event we get after EV_SYN, skip this */ @@ -540,10 +527,9 @@ EventProcessTouch(InputInfoPtr pInfo) } xf86PostTouchEvent(pInfo->dev, proto_data->cur_slot, type, 0, - proto_data->mt_mask); + proto_data->last_mt_vals[slot_index]); proto_data->slot_state = SLOTSTATE_EMPTY; - valuator_mask_zero(proto_data->mt_mask); #endif } @@ -568,24 +554,14 @@ EventProcessTouchEvent(InputInfoPtr pInfo, struct CommData *comm, if (ev->code == ABS_MT_TRACKING_ID) { if (ev->value >= 0) - { proto_data->slot_state = SLOTSTATE_OPEN; - - if (slot_index >= 0) - valuator_mask_copy(proto_data->mt_mask, - proto_data->last_mt_vals[slot_index]); - else - xf86IDrvMsg(pInfo, X_WARNING, - "Attempted to copy values from out-of-range " - "slot, touch events may be incorrect.\n"); - } else + else proto_data->slot_state = SLOTSTATE_CLOSE; } else { - int map = proto_data->axis_map[ev->code - ABS_MT_TOUCH_MAJOR]; - valuator_mask_set(proto_data->mt_mask, map, ev->value); if (slot_index >= 0) - valuator_mask_set(proto_data->last_mt_vals[slot_index], map, + valuator_mask_set(proto_data->last_mt_vals[slot_index], + proto_data->axis_map[ev->code - ABS_MT_TOUCH_MAJOR], ev->value); } } -- 1.7.7.6