[PATCH libinput 1/6] touchpad: factor out fake finger handling
Hans de Goede
hdegoede at redhat.com
Mon Jan 5 02:59:57 PST 2015
Hi,
On 16-12-14 04:14, Peter Hutterer wrote:
> We need this for determining hovering touches on some semi-mt touchpads.
>
> This makes the fake_touches mask use bit 1 for BTN_TOUCH,
I believe you mean bit 0 here (per the usual bit numbering conventions).
Other then that this looks good and is:
Reviewed-by: Hans de Goede <hdegoede at redhat.com>
Regards,
Hans
and the other bits
> for BTN_TOOL_FINGER, BTN_TOOL_DOUBLETAP, etc. BTN_TOUCH is independent of the
> rest, the others are mutually exclusive in the kernel.
>
> Since the mask isn't a straightforward bitmask anymore, abstract it all
> through helper functions.
>
> Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
> ---
> src/evdev-mt-touchpad.c | 72 ++++++++++++++++++++++++++++++++++++-------------
> 1 file changed, 53 insertions(+), 19 deletions(-)
>
> diff --git a/src/evdev-mt-touchpad.c b/src/evdev-mt-touchpad.c
> index 32d6eac..42c163b 100644
> --- a/src/evdev-mt-touchpad.c
> +++ b/src/evdev-mt-touchpad.c
> @@ -135,6 +135,57 @@ tp_get_touch(struct tp_dispatch *tp, unsigned int slot)
> return &tp->touches[slot];
> }
>
> +static inline int
> +tp_fake_finger_count(struct tp_dispatch *tp)
> +{
> + unsigned int fake_touches, nfake_touches;
> +
> + /* don't count BTN_TOUCH */
> + fake_touches = tp->fake_touches >> 1;
> + nfake_touches = 0;
> + while (fake_touches) {
> + nfake_touches++;
> + fake_touches >>= 1;
> + }
> +
> + return nfake_touches;
> +}
> +
> +static inline bool
> +tp_fake_finger_is_touching(struct tp_dispatch *tp)
> +{
> + return tp->fake_touches & 0x1;
> +}
> +
> +static inline void
> +tp_fake_finger_set(struct tp_dispatch *tp,
> + unsigned int code,
> + bool is_press)
> +{
> + unsigned int shift;
> +
> + switch (code) {
> + case BTN_TOUCH:
> + shift = 0;
> + break;
> + case BTN_TOOL_FINGER:
> + shift = 1;
> + break;
> + case BTN_TOOL_DOUBLETAP:
> + case BTN_TOOL_TRIPLETAP:
> + case BTN_TOOL_QUADTAP:
> + shift = code - BTN_TOOL_DOUBLETAP + 2;
> + break;
> + default:
> + return;
> + }
> +
> + if (is_press)
> + tp->fake_touches |= 1 << shift;
> + else
> + tp->fake_touches &= ~(0x1 << shift);
> +}
> +
> static inline void
> tp_begin_touch(struct tp_dispatch *tp, struct tp_touch *t, uint64_t time)
> {
> @@ -253,30 +304,13 @@ tp_process_fake_touch(struct tp_dispatch *tp,
> uint64_t time)
> {
> struct tp_touch *t;
> - unsigned int fake_touches;
> unsigned int nfake_touches;
> unsigned int i, start;
> - unsigned int shift;
>
> - if (e->code != BTN_TOUCH &&
> - (e->code < BTN_TOOL_DOUBLETAP || e->code > BTN_TOOL_QUADTAP))
> - return;
> + tp_fake_finger_set(tp, e->code, e->value != 0);
>
> - shift = e->code == BTN_TOUCH ? 0 : (e->code - BTN_TOOL_DOUBLETAP + 1);
> + nfake_touches = tp_fake_finger_count(tp);
>
> - if (e->value)
> - tp->fake_touches |= 1 << shift;
> - else
> - tp->fake_touches &= ~(0x1 << shift);
> -
> - fake_touches = tp->fake_touches;
> - nfake_touches = 0;
> - while (fake_touches) {
> - nfake_touches++;
> - fake_touches >>= 1;
> - }
> -
> - /* For single touch tps we use BTN_TOUCH for begin / end of touch 0 */
> start = tp->has_mt ? tp->real_touches : 0;
> for (i = start; i < tp->ntouches; i++) {
> t = tp_get_touch(tp, i);
>
More information about the wayland-devel
mailing list