diff options
author | Mathias Gottschlag <mgottschlag@gmail.com> | 2015-03-07 13:27:08 -0800 |
---|---|---|
committer | Dmitry Torokhov <dmitry.torokhov@gmail.com> | 2015-03-07 13:40:20 -0800 |
commit | 679d83ea9390636ded518f533af0cefbade317c7 (patch) | |
tree | 2d0a85cfb4a397773f63f4b24d5052984c9c7b84 /drivers/input/mouse/focaltech.c | |
parent | 3e9845251926723319fb60c9e546fe42d3d11687 (diff) | |
download | linux-679d83ea9390636ded518f533af0cefbade317c7.tar.bz2 |
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>
Diffstat (limited to 'drivers/input/mouse/focaltech.c')
-rw-r--r-- | drivers/input/mouse/focaltech.c | 12 |
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) input_mt_slot(dev, i); input_mt_report_slot_state(dev, MT_TOOL_FINGER, active); if (active) { - input_report_abs(dev, ABS_MT_POSITION_X, finger->x); + unsigned int clamped_x, clamped_y; + /* + * The touchpad might report invalid data, so we clamp + * the resulting values so that we do not confuse + * userspace. + */ + clamped_x = clamp(finger->x, 0U, priv->x_max); + clamped_y = clamp(finger->y, 0U, priv->y_max); + input_report_abs(dev, ABS_MT_POSITION_X, clamped_x); input_report_abs(dev, ABS_MT_POSITION_Y, - priv->y_max - finger->y); + priv->y_max - clamped_y); } } input_mt_report_pointer_emulation(dev, true); |