[PATCH 2/3] touchpad: When a clickpad is clicked post combined motion of all touches
Peter Hutterer
peter.hutterer at who-t.net
Tue Dec 9 19:33:47 PST 2014
On Tue, Dec 09, 2014 at 12:47:10PM +0100, Hans de Goede wrote:
> When clicking a clickpad the user may want to switch fingers to move the
> pointer around, without lifting so as to not release the button.
>
> Switch to using combined motion of all touches when a clickpad is clicked to
> allow this.
>
> BugLink: https://bugs.freedesktop.org/show_bug.cgi?id=86807
> Signed-off-by: Hans de Goede <hdegoede at redhat.com>
much nicer, thanks.
Reviewed-by: Peter Hutterer <peter.hutterer at who-t.net>
Cheers,
Peter
> ---
> src/evdev-mt-touchpad.c | 43 +++++++++++++++++++++++++++++++++++++++----
> 1 file changed, 39 insertions(+), 4 deletions(-)
>
> diff --git a/src/evdev-mt-touchpad.c b/src/evdev-mt-touchpad.c
> index 7d2e21a..7cee73d 100644
> --- a/src/evdev-mt-touchpad.c
> +++ b/src/evdev-mt-touchpad.c
> @@ -453,6 +453,10 @@ tp_twofinger_scroll_post_events(struct tp_dispatch *tp, uint64_t time)
> if (tp_tap_dragging(tp))
> return 0;
>
> + /* No 2fg scrolling while a clickpad is clicked */
> + if (tp->buttons.is_clickpad && tp->buttons.state)
> + return 0;
> +
> /* Only count active touches for 2 finger scrolling */
> tp_for_each_touch(tp, t) {
> if (tp_touch_active(tp, t))
> @@ -592,11 +596,9 @@ tp_post_process_state(struct tp_dispatch *tp, uint64_t time)
> }
>
> static void
> -tp_post_pointer_motion(struct tp_dispatch *tp, uint64_t time)
> +tp_get_pointer_delta(struct tp_dispatch *tp, double *dx, double *dy)
> {
> struct tp_touch *t = tp_current_touch(tp);
> - double dx, dy;
> - double dx_unaccel, dy_unaccel;
>
> if (!t->is_pointer) {
> tp_for_each_touch(tp, t) {
> @@ -610,7 +612,40 @@ tp_post_pointer_motion(struct tp_dispatch *tp, uint64_t time)
> t->history.count < TOUCHPAD_MIN_SAMPLES)
> return;
>
> - tp_get_delta(t, &dx, &dy);
> + tp_get_delta(t, dx, dy);
> +}
> +
> +static void
> +tp_get_active_touches_delta(struct tp_dispatch *tp, double *dx, double *dy)
> +{
> + struct tp_touch *t;
> + double tdx, tdy;
> + unsigned int i;
> +
> + for (i = 0; i < tp->real_touches; i++) {
> + t = tp_get_touch(tp, i);
> +
> + if (!tp_touch_active(tp, t) || !t->dirty)
> + continue;
> +
> + tp_get_delta(t, &tdx, &tdy);
> + *dx += tdx;
> + *dy += tdy;
> + }
> +}
> +
> +static void
> +tp_post_pointer_motion(struct tp_dispatch *tp, uint64_t time)
> +{
> + double dx = 0.0, dy = 0.0;
> + double dx_unaccel, dy_unaccel;
> +
> + /* When a clickpad is clicked, combine motion of all active touches */
> + if (tp->buttons.is_clickpad && tp->buttons.state)
> + tp_get_active_touches_delta(tp, &dx, &dy);
> + else
> + tp_get_pointer_delta(tp, &dx, &dy);
> +
> tp_filter_motion(tp, &dx, &dy, &dx_unaccel, &dy_unaccel, time);
>
> if (dx != 0.0 || dy != 0.0 || dx_unaccel != 0.0 || dy_unaccel != 0.0) {
> --
> 2.1.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