[PATCH libinput 13/20] touchpad: Use INPUT_PROP_BUTTONPAD instead of checking for buttons
Peter Hutterer
peter.hutterer at who-t.net
Wed Apr 23 22:34:41 PDT 2014
On Tue, Apr 15, 2014 at 02:28:10PM +0200, Hans de Goede wrote:
> And warn if INPUT_PROP_BUTTONPAD mismatches right/middle buttons presence.
>
> Signed-off-by: Hans de Goede <hdegoede at redhat.com>
> Acked-by: Peter Hutterer <peter.hutterer at who-t.net>
I've gone through all patches again and they're now all really
Reviewed-by: Peter Hutterer <peter.hutterer at who-t.net>, except for the bits
where things break obviously :)
I'll start getting some tests ready for all this so we can verify the
behaviour, but meanwhile you can grab the rebased series from my github,
wip/clickpad-improvements.
Cheers,
Peter
> ---
> src/evdev-mt-touchpad-buttons.c | 34 ++++++++++++++++++----------------
> src/evdev-mt-touchpad.c | 4 ++--
> src/evdev-mt-touchpad.h | 7 +++----
> 3 files changed, 23 insertions(+), 22 deletions(-)
>
> diff --git a/src/evdev-mt-touchpad-buttons.c b/src/evdev-mt-touchpad-buttons.c
> index e789a87..ec36280 100644
> --- a/src/evdev-mt-touchpad-buttons.c
> +++ b/src/evdev-mt-touchpad-buttons.c
> @@ -410,9 +410,17 @@ tp_init_buttons(struct tp_dispatch *tp,
> int width, height;
> double diagonal;
>
> + tp->buttons.is_clickpad = libevdev_has_property(device->evdev,
> + INPUT_PROP_BUTTONPAD);
> +
> if (libevdev_has_event_code(device->evdev, EV_KEY, BTN_MIDDLE) ||
> - libevdev_has_event_code(device->evdev, EV_KEY, BTN_RIGHT))
> - tp->buttons.has_buttons = true;
> + libevdev_has_event_code(device->evdev, EV_KEY, BTN_RIGHT)) {
> + if (tp->buttons.is_clickpad)
> + log_bug("clickpad advertising right button (kernel bug?)\n");
> + } else {
> + if (!tp->buttons.is_clickpad)
> + log_bug("non clickpad without right button (kernel bug)?\n");
> + }
>
> width = abs(device->abs.max_x - device->abs.min_x);
> height = abs(device->abs.max_y - device->abs.min_y);
> @@ -423,10 +431,7 @@ tp_init_buttons(struct tp_dispatch *tp,
> if (libevdev_get_id_vendor(device->evdev) == 0x5ac) /* Apple */
> tp->buttons.use_clickfinger = true;
>
> - tp->buttons.use_softbuttons = !tp->buttons.use_clickfinger &&
> - !tp->buttons.has_buttons;
> -
> - if (tp->buttons.use_softbuttons) {
> + if (tp->buttons.is_clickpad && !tp->buttons.use_clickfinger) {
> tp->buttons.area.top_edge = height * .8 + device->abs.min_y;
> tp->buttons.area.rightbutton_left_edge = width/2 + device->abs.min_x;
> tp->buttons.timer_fd = timerfd_create(CLOCK_MONOTONIC, TFD_CLOEXEC);
> @@ -585,21 +590,18 @@ tp_post_softbutton_buttons(struct tp_dispatch *tp, uint32_t time)
> int
> tp_post_button_events(struct tp_dispatch *tp, uint32_t time)
> {
> - int rc;
> -
> if ((tp->queued &
> (TOUCHPAD_EVENT_BUTTON_PRESS|TOUCHPAD_EVENT_BUTTON_RELEASE)) == 0)
> return 0;
>
> - if (tp->buttons.has_buttons)
> - rc = tp_post_physical_buttons(tp, time);
> - else if (tp->buttons.use_clickfinger)
> - rc = tp_post_clickfinger_buttons(tp, time);
> - else if (tp->buttons.use_softbuttons)
> - rc = tp_post_softbutton_buttons(tp, time);
> -
> + if (tp->buttons.is_clickpad) {
> + if (tp->buttons.use_clickfinger)
> + return tp_post_clickfinger_buttons(tp, time);
> + else
> + return tp_post_softbutton_buttons(tp, time);
> + }
>
> - return rc;
> + return tp_post_physical_buttons(tp, time);
> }
>
> int
> diff --git a/src/evdev-mt-touchpad.c b/src/evdev-mt-touchpad.c
> index b671211..910bd2a 100644
> --- a/src/evdev-mt-touchpad.c
> +++ b/src/evdev-mt-touchpad.c
> @@ -392,7 +392,7 @@ tp_process_state(struct tp_dispatch *tp, uint32_t time)
> * to allow drag and drop.
> */
> if ((tp->queued & TOUCHPAD_EVENT_BUTTON_PRESS) &&
> - !tp->buttons.has_buttons)
> + tp->buttons.is_clickpad)
> tp_pin_fingers(tp);
>
> /* If we don't have a touch as pointer find a suitable one */
> @@ -496,7 +496,7 @@ static int
> tp_post_scroll_events(struct tp_dispatch *tp, uint32_t time)
> {
> /* don't scroll if a clickpad is held down */
> - if (!tp->buttons.has_buttons &&
> + if (tp->buttons.is_buttonpad &&
> (tp->buttons.state || tp->buttons.old_state))
> return 0;
>
> diff --git a/src/evdev-mt-touchpad.h b/src/evdev-mt-touchpad.h
> index 04da6a6..5cb9ae2 100644
> --- a/src/evdev-mt-touchpad.h
> +++ b/src/evdev-mt-touchpad.h
> @@ -154,19 +154,18 @@ struct tp_dispatch {
> } accel;
>
> struct {
> - bool has_buttons; /* true for physical LMR buttons */
> + bool is_clickpad; /* true for clickpads */
> bool use_clickfinger; /* number of fingers decides button number */
> - bool use_softbuttons; /* use software-button area */
> uint32_t state;
> uint32_t old_state;
> uint32_t motion_dist; /* for pinned touches */
> unsigned int active; /* currently active button, for release event */
>
> - /* Only used if has_buttons is false. The software button area is always
> + /* Only used for clickpads. The software button area is always
> * a horizontal strip across the touchpad. Depending on the
> * rightbutton_left_edge value, the buttons are split according to the
> * edge settings.
> - */
> + */
> struct {
> int32_t top_edge;
> int32_t rightbutton_left_edge;
> --
> 1.9.0
>
> _______________________________________________
> wayland-devel mailing list
> wayland-devel at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/wayland-devel
>
More information about the wayland-devel
mailing list