diff options
author | Hans de Goede <hdegoede@redhat.com> | 2014-07-26 01:44:42 -0400 |
---|---|---|
committer | Dmitry Torokhov <dmitry.torokhov@gmail.com> | 2014-07-26 17:03:16 -0400 |
commit | cdf333efdcad9891e7f9c26e9ece67776af13ae2 (patch) | |
tree | e3ba4c9a943a25cfe702113da98f051f57daa837 | |
parent | 02d04254a5dfb8de1459805c3433cd0e9e4853d7 (diff) |
Input: alps - use standard contact tracking instead of DIY
When there are 2 fingers on the pad we don't know which one is which, so
use input_mt_assign_slots to make sure the right set of coordinates ends
up in the right slot.
Besides ensuring things end up in the right slot, this also results in a
nice cleanup, since sync_frame also handles non mt position and btn_touch
reporting.
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
-rw-r--r-- | drivers/input/mouse/alps.c | 52 |
1 files changed, 16 insertions, 36 deletions
diff --git a/drivers/input/mouse/alps.c b/drivers/input/mouse/alps.c index 8c3017a92788..8c2de016e223 100644 --- a/drivers/input/mouse/alps.c +++ b/drivers/input/mouse/alps.c | |||
@@ -419,25 +419,26 @@ static int alps_process_bitmap(struct alps_data *priv, | |||
419 | return fingers; | 419 | return fingers; |
420 | } | 420 | } |
421 | 421 | ||
422 | static void alps_set_slot(struct input_dev *dev, int slot, bool active, | 422 | static void alps_set_slot(struct input_dev *dev, int slot, int x, int y) |
423 | int x, int y) | ||
424 | { | 423 | { |
425 | input_mt_slot(dev, slot); | 424 | input_mt_slot(dev, slot); |
426 | input_mt_report_slot_state(dev, MT_TOOL_FINGER, active); | 425 | input_mt_report_slot_state(dev, MT_TOOL_FINGER, true); |
427 | if (active) { | 426 | input_report_abs(dev, ABS_MT_POSITION_X, x); |
428 | input_report_abs(dev, ABS_MT_POSITION_X, x); | 427 | input_report_abs(dev, ABS_MT_POSITION_Y, y); |
429 | input_report_abs(dev, ABS_MT_POSITION_Y, y); | ||
430 | } | ||
431 | } | 428 | } |
432 | 429 | ||
433 | static void alps_report_semi_mt_data(struct psmouse *psmouse, int num_fingers) | 430 | static void alps_report_mt_data(struct psmouse *psmouse, int n) |
434 | { | 431 | { |
435 | struct alps_data *priv = psmouse->private; | 432 | struct alps_data *priv = psmouse->private; |
436 | struct input_dev *dev = psmouse->dev; | 433 | struct input_dev *dev = psmouse->dev; |
437 | struct alps_fields *f = &priv->f; | 434 | struct alps_fields *f = &priv->f; |
435 | int i, slot[MAX_TOUCHES]; | ||
436 | |||
437 | input_mt_assign_slots(dev, slot, f->mt, n); | ||
438 | for (i = 0; i < n; i++) | ||
439 | alps_set_slot(dev, slot[i], f->mt[i].x, f->mt[i].y); | ||
438 | 440 | ||
439 | alps_set_slot(dev, 0, num_fingers != 0, f->mt[0].x, f->mt[0].y); | 441 | input_mt_sync_frame(dev); |
440 | alps_set_slot(dev, 1, num_fingers == 2, f->mt[1].x, f->mt[1].y); | ||
441 | } | 442 | } |
442 | 443 | ||
443 | static void alps_process_trackstick_packet_v3(struct psmouse *psmouse) | 444 | static void alps_process_trackstick_packet_v3(struct psmouse *psmouse) |
@@ -674,12 +675,7 @@ static void alps_process_touchpad_packet_v3_v5(struct psmouse *psmouse) | |||
674 | fingers = f->pressure > 0 ? 1 : 0; | 675 | fingers = f->pressure > 0 ? 1 : 0; |
675 | } | 676 | } |
676 | 677 | ||
677 | if (f->pressure >= 64) | 678 | alps_report_mt_data(psmouse, (fingers <= 2) ? fingers : 1); |
678 | input_report_key(dev, BTN_TOUCH, 1); | ||
679 | else | ||
680 | input_report_key(dev, BTN_TOUCH, 0); | ||
681 | |||
682 | alps_report_semi_mt_data(psmouse, fingers); | ||
683 | 679 | ||
684 | input_mt_report_finger_count(dev, fingers); | 680 | input_mt_report_finger_count(dev, fingers); |
685 | 681 | ||
@@ -687,10 +683,6 @@ static void alps_process_touchpad_packet_v3_v5(struct psmouse *psmouse) | |||
687 | input_report_key(dev, BTN_RIGHT, f->right); | 683 | input_report_key(dev, BTN_RIGHT, f->right); |
688 | input_report_key(dev, BTN_MIDDLE, f->middle); | 684 | input_report_key(dev, BTN_MIDDLE, f->middle); |
689 | 685 | ||
690 | if (f->pressure > 0) { | ||
691 | input_report_abs(dev, ABS_X, f->st.x); | ||
692 | input_report_abs(dev, ABS_Y, f->st.y); | ||
693 | } | ||
694 | input_report_abs(dev, ABS_PRESSURE, f->pressure); | 686 | input_report_abs(dev, ABS_PRESSURE, f->pressure); |
695 | 687 | ||
696 | input_sync(dev); | 688 | input_sync(dev); |
@@ -853,22 +845,13 @@ static void alps_process_packet_v4(struct psmouse *psmouse) | |||
853 | fingers = f->fingers; | 845 | fingers = f->fingers; |
854 | } | 846 | } |
855 | 847 | ||
856 | if (f->pressure >= 64) | 848 | alps_report_mt_data(psmouse, (fingers <= 2) ? fingers : 1); |
857 | input_report_key(dev, BTN_TOUCH, 1); | ||
858 | else | ||
859 | input_report_key(dev, BTN_TOUCH, 0); | ||
860 | |||
861 | alps_report_semi_mt_data(psmouse, fingers); | ||
862 | 849 | ||
863 | input_mt_report_finger_count(dev, fingers); | 850 | input_mt_report_finger_count(dev, fingers); |
864 | 851 | ||
865 | input_report_key(dev, BTN_LEFT, f->left); | 852 | input_report_key(dev, BTN_LEFT, f->left); |
866 | input_report_key(dev, BTN_RIGHT, f->right); | 853 | input_report_key(dev, BTN_RIGHT, f->right); |
867 | 854 | ||
868 | if (f->pressure > 0) { | ||
869 | input_report_abs(dev, ABS_X, f->st.x); | ||
870 | input_report_abs(dev, ABS_Y, f->st.y); | ||
871 | } | ||
872 | input_report_abs(dev, ABS_PRESSURE, f->pressure); | 855 | input_report_abs(dev, ABS_PRESSURE, f->pressure); |
873 | 856 | ||
874 | input_sync(dev); | 857 | input_sync(dev); |
@@ -2003,17 +1986,14 @@ static void alps_set_abs_params_st(struct alps_data *priv, | |||
2003 | static void alps_set_abs_params_mt(struct alps_data *priv, | 1986 | static void alps_set_abs_params_mt(struct alps_data *priv, |
2004 | struct input_dev *dev1) | 1987 | struct input_dev *dev1) |
2005 | { | 1988 | { |
2006 | set_bit(INPUT_PROP_SEMI_MT, dev1->propbit); | ||
2007 | input_mt_init_slots(dev1, 2, 0); | ||
2008 | input_set_abs_params(dev1, ABS_MT_POSITION_X, 0, priv->x_max, 0, 0); | 1989 | input_set_abs_params(dev1, ABS_MT_POSITION_X, 0, priv->x_max, 0, 0); |
2009 | input_set_abs_params(dev1, ABS_MT_POSITION_Y, 0, priv->y_max, 0, 0); | 1990 | input_set_abs_params(dev1, ABS_MT_POSITION_Y, 0, priv->y_max, 0, 0); |
2010 | 1991 | ||
2011 | set_bit(BTN_TOOL_DOUBLETAP, dev1->keybit); | 1992 | input_mt_init_slots(dev1, MAX_TOUCHES, INPUT_MT_POINTER | |
1993 | INPUT_MT_DROP_UNUSED | INPUT_MT_TRACK | INPUT_MT_SEMI_MT); | ||
1994 | |||
2012 | set_bit(BTN_TOOL_TRIPLETAP, dev1->keybit); | 1995 | set_bit(BTN_TOOL_TRIPLETAP, dev1->keybit); |
2013 | set_bit(BTN_TOOL_QUADTAP, dev1->keybit); | 1996 | set_bit(BTN_TOOL_QUADTAP, dev1->keybit); |
2014 | |||
2015 | input_set_abs_params(dev1, ABS_X, 0, priv->x_max, 0, 0); | ||
2016 | input_set_abs_params(dev1, ABS_Y, 0, priv->y_max, 0, 0); | ||
2017 | } | 1997 | } |
2018 | 1998 | ||
2019 | int alps_init(struct psmouse *psmouse) | 1999 | int alps_init(struct psmouse *psmouse) |