summaryrefslogtreecommitdiff
path: root/src/eventcomm.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/eventcomm.c')
-rw-r--r--src/eventcomm.c76
1 files changed, 59 insertions, 17 deletions
diff --git a/src/eventcomm.c b/src/eventcomm.c
index 8904851..f199c24 100644
--- a/src/eventcomm.c
+++ b/src/eventcomm.c
@@ -65,10 +65,8 @@ struct eventcomm_proto_data
* exists for readability of the code.
*/
BOOL need_grab;
- int st_to_mt_offset_x;
- double st_to_mt_scale_x;
- int st_to_mt_offset_y;
- double st_to_mt_scale_y;
+ int st_to_mt_offset[2];
+ double st_to_mt_scale[2];
#ifdef HAVE_MULTITOUCH
struct mtdev *mtdev;
int axis_map[MT_ABS_SIZE];
@@ -86,8 +84,8 @@ EventProtoDataAlloc(void)
if (!proto_data)
return NULL;
- proto_data->st_to_mt_scale_x = 1;
- proto_data->st_to_mt_scale_y = 1;
+ proto_data->st_to_mt_scale[0] = 1;
+ proto_data->st_to_mt_scale[1] = 1;
return proto_data;
}
@@ -424,11 +422,11 @@ event_query_axis_ranges(InputInfoPtr pInfo)
event_get_abs(pInfo, pInfo->fd, ABS_MT_POSITION_Y, &priv->miny,
&priv->maxy, &priv->synpara.hyst_y, &priv->resy);
- proto_data->st_to_mt_offset_x = priv->minx - st_minx;
- proto_data->st_to_mt_scale_x =
+ proto_data->st_to_mt_offset[0] = priv->minx - st_minx;
+ proto_data->st_to_mt_scale[0] =
(priv->maxx - priv->minx) / (st_maxx - st_minx);
- proto_data->st_to_mt_offset_y = priv->miny - st_miny;
- proto_data->st_to_mt_scale_y =
+ proto_data->st_to_mt_offset[1] = priv->miny - st_miny;
+ proto_data->st_to_mt_scale[1] =
(priv->maxy - priv->miny) / (st_maxy - st_miny);
}
#endif
@@ -527,6 +525,20 @@ SynapticsReadEvent(InputInfoPtr pInfo, struct input_event *ev)
return rc;
}
+#ifdef HAVE_MULTITOUCH
+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;
+}
+#endif
+
static void
EventProcessTouchEvent(InputInfoPtr pInfo, struct SynapticsHwState *hw,
struct input_event *ev)
@@ -567,8 +579,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
@@ -597,6 +621,12 @@ static int count_fingers(const struct CommData *comm)
}
+static inline double
+apply_st_scaling(struct eventcomm_proto_data *proto_data, int value, int axis)
+{
+ return value * proto_data->st_to_mt_scale[axis] + proto_data->st_to_mt_offset[axis];
+}
+
Bool
EventReadHwState(InputInfoPtr pInfo,
struct CommData *comm, struct SynapticsHwState *hwRet)
@@ -610,6 +640,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:
@@ -682,12 +719,10 @@ EventReadHwState(InputInfoPtr pInfo,
if (ev.code < ABS_MT_SLOT) {
switch (ev.code) {
case ABS_X:
- hw->x = ev.value * proto_data->st_to_mt_scale_x +
- proto_data->st_to_mt_offset_x;
+ hw->x = apply_st_scaling(proto_data, ev.value, 0);
break;
case ABS_Y:
- hw->y = ev.value * proto_data->st_to_mt_scale_y +
- proto_data->st_to_mt_offset_y;
+ hw->y = apply_st_scaling(proto_data, ev.value, 1);
break;
case ABS_PRESSURE:
hw->z = ev.value;
@@ -714,6 +749,7 @@ static void
event_query_touch(InputInfoPtr pInfo)
{
SynapticsPrivate *priv = (SynapticsPrivate *)pInfo->private;
+ SynapticsParameters *para = &priv->synpara;
struct eventcomm_proto_data *proto_data = priv->proto_data;
struct mtdev *mtdev;
int i;
@@ -728,7 +764,13 @@ event_query_touch(InputInfoPtr pInfo)
{
xf86IDrvMsg(pInfo, X_INFO,
"ignoring touch events for semi-multitouch device\n");
- return;
+ priv->has_semi_mt = TRUE;
+ }
+
+ if (rc >= 0 && BitIsOn(&prop, INPUT_PROP_BUTTONPAD))
+ {
+ xf86IDrvMsg(pInfo, X_INFO, "found clickpad property\n");
+ para->clickpad = TRUE;
}
mtdev = mtdev_new_open(pInfo->fd);