aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMathias Gottschlag <mgottschlag@gmail.com>2015-03-07 16:27:08 -0500
committerDmitry Torokhov <dmitry.torokhov@gmail.com>2015-03-07 16:40:20 -0500
commit679d83ea9390636ded518f533af0cefbade317c7 (patch)
tree2d0a85cfb4a397773f63f4b24d5052984c9c7b84
parent3e9845251926723319fb60c9e546fe42d3d11687 (diff)
Input: psmouse - ensure that focaltech reports consistent coordinates
We don't know whether x_max or y_max really hold the maximum possible coordinates, and we don't know for sure whether we correctly interpret the coordinates sent by the touchpad, so we clamp the reported values to prevent confusion in userspace code. Signed-off-by: Mathias Gottschlag <mgottschlag@gmail.com> Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
-rw-r--r--drivers/input/mouse/focaltech.c12
1 files changed, 10 insertions, 2 deletions
diff --git a/drivers/input/mouse/focaltech.c b/drivers/input/mouse/focaltech.c
index e8fafe8785a7..c66e0e04bb7e 100644
--- a/drivers/input/mouse/focaltech.c
+++ b/drivers/input/mouse/focaltech.c
@@ -126,9 +126,17 @@ static void focaltech_report_state(struct psmouse *psmouse)
126 input_mt_slot(dev, i); 126 input_mt_slot(dev, i);
127 input_mt_report_slot_state(dev, MT_TOOL_FINGER, active); 127 input_mt_report_slot_state(dev, MT_TOOL_FINGER, active);
128 if (active) { 128 if (active) {
129 input_report_abs(dev, ABS_MT_POSITION_X, finger->x); 129 unsigned int clamped_x, clamped_y;
130 /*
131 * The touchpad might report invalid data, so we clamp
132 * the resulting values so that we do not confuse
133 * userspace.
134 */
135 clamped_x = clamp(finger->x, 0U, priv->x_max);
136 clamped_y = clamp(finger->y, 0U, priv->y_max);
137 input_report_abs(dev, ABS_MT_POSITION_X, clamped_x);
130 input_report_abs(dev, ABS_MT_POSITION_Y, 138 input_report_abs(dev, ABS_MT_POSITION_Y,
131 priv->y_max - finger->y); 139 priv->y_max - clamped_y);
132 } 140 }
133 } 141 }
134 input_mt_report_pointer_emulation(dev, true); 142 input_mt_report_pointer_emulation(dev, true);